能否用通视实时服务器源码接收期货数据建库 tom_sh 您好! 对方提供的期货数据源格式如下: ifndef _DATA_STRUCT_H_ #define _DATA_STRUCT_H_ // 发送端通讯的结构 #pragma pack(push, 1) const int ciDataSourceVer = 0x10; //包头 typedef struct data_head { int iVer; // 版本 int type; // 类型 int length; // 长度, 整个包的长度, 包括此头部 int field_count; // 字段个数 int record_count; // 记录个数 unsigned long time; // 标准时间 unsigned long lMilliSecond; // 毫秒 } data_head; //字段包头, 多个此结构组成一个字段说明 typedef struct field_head { int type; int field_length;//字段数据长度 } field_head; typedef struct _QconInfo { char Flag; // Flag=1 表示Stocker的值为买卖档下标 unsigned short Stocker; // Flag=0 表示Stocker的值为券商代号 }T_QconInfo; #pragma pack(pop) // 大类型 enum E_RealDataType { TABLE_PB_REAL = 1, // 实时数据 TABLE_PB_LEVEL2 = 2, // level2 表 TABLE_SYMINFO = 3, // 商品信息股本之类的 FILE_SYMBOL_INFO = 200, // symbols.csv 市场和商品列表 FILE_BROKERLIST_DBF = 201, // Brokerlist.dbf 香港经济人信息表 FILE_TRADEDAY = 202, // tradeday.csv 交易日配置文件 enRDTRealDataHeart = 300, // 连接检测包 enRDTInfo = 1000, // 资讯数据 }; // 行情包类型标志可以合起来 #define PRICETYPESOMEUP 1 // 表示五档行情部分更新 #define PRICETYPEALLUP 2 // 表示五档行情全部更新 #define PRICETYPENOTRADE 16 // 表示此行情不生成成交 /********************* 实时数据字段定义 ************************************************/ #define FIELD_PB_PACKET_TYPE 500 // 实时包类型 // 实时数据中的类型 #define FIELD_PB_REAL_MARK 0 //szMarket[16]; #define FIELD_PB_REAL_CODE 1 //szCode[16]; //#define FIELD_PB_REAL_PBCODE 2 //szPbCode[16]; //#define FIELD_PB_REAL_NAME 3 //szName[16]; #define FIELD_PB_REAL_CLOSE 4 //Close[16]; // 100000.0 #define FIELD_PB_REAL_OPEN 5 //Open[16]; #define FIELD_PB_REAL_HIGH 6 //High[16]; #define FIELD_PB_REAL_LOW 7 //Low[16]; #define FIELD_PB_REAL_NOW 8 //Now[16]; #define FIELD_PB_REAL_AVGPRICE 9 //AvgPrice[16]; #define FIELD_PB_REAL_LASTAVG 10 // LastAvg昨结算 #define FIELD_PB_REAL_VOLUME 11 //Volume[16]; #define FIELD_PB_REAL_AMOUNT 12 //Amount[16]; #define FIELD_PB_REAL_HOLD 13 // Hold //从50开始是为了预留前面的字段有扩展的可能 #define FIELD_PB_REAL_BUYPRICE0 50 //BuyPrice[5][16]; #define FIELD_PB_REAL_BUYPRICE1 51 #define FIELD_PB_REAL_BUYPRICE2 52 #define FIELD_PB_REAL_BUYPRICE3 53 #define FIELD_PB_REAL_BUYPRICE4 54 //从60开始是为了预留前面的字段有扩展的可能 #define FIELD_PB_REAL_BUYVOLUME0 60 //BuyVolume[5][16]; #define FIELD_PB_REAL_BUYVOLUME1 61 #define FIELD_PB_REAL_BUYVOLUME2 62 #define FIELD_PB_REAL_BUYVOLUME3 63 #define FIELD_PB_REAL_BUYVOLUME4 64 //从70开始是为了预留前面的字段有扩展的可能 #define FIELD_PB_REAL_SELLPRICE0 70 //SellPrice[5][16]; #define FIELD_PB_REAL_SELLPRICE1 71 #define FIELD_PB_REAL_SELLPRICE2 72 #define FIELD_PB_REAL_SELLPRICE3 73 #define FIELD_PB_REAL_SELLPRICE4 74 //从80开始是为了预留前面的字段有扩展的可能 #define FIELD_PB_REAL_SELLVOLUME0 80 //SellVolume[5][16]; #define FIELD_PB_REAL_SELLVOLUME1 81 #define FIELD_PB_REAL_SELLVOLUME2 82 #define FIELD_PB_REAL_SELLVOLUME3 83 #define FIELD_PB_REAL_SELLVOLUME4 84 /***********************************************************************************/ /********************* level2定义, 字段定义 ************************************************/ #define FIELD_PB_L2_MARK 0 //szMarket[16]; #define FIELD_PB_L2_CODE 1 //szCode[16]; //#define FIELD_PB_L2_NAME 3 //szName[16]; #define FIELD_PB_L2_BORS 4 //char BorS; //'A' 卖出队列; 'B' 买出队列 #define FIELD_PB_L2_LIST 5 //ECOINFO Queue[40]; //经济队列 #define FIELD_PB_L2_LIST_COUNT 6 //unsigned short Count; /***********************************************************************************/ /********************* 资讯接口 ************************************************/ #define INFO_SOURCE 1 // 数据源 #define INFO_INFO 2 // 类型 #define INFO_INDEX 3 // 索引 #define INFO_KEY 4 // KEY #define INFO_MARKET 5 // 市场 #define INFO_CODE 6 // 代码 #define INFO_TITLE 7 // 标题 #define INFO_CONTENT 8 // 内容 #define INFO_ORDER 9 // 顺序 #define INFO_TIME 10 // 时间 #define INFO_ALLCOUNT 11 // 此顺序总个数 /***********************************************************************************/ /******************* 商品财务信息 ******************************************/ #define SYM_MARKET 1 // 市场 #define SYM_CODE 2 // 代码 #define SYM_ALLCAPICAL 3 // 总股本 #define SYM_CIRCASSET 4 // 流通股本 #define SYM_ALLASSET 5 // 总资产 #define SYM_FLOWDEBT 6 // 流动负债 #define SYM_PERFUND 7 // 每股公积金 #define SYM_BUSINESSPROFIT 8 // 营业利益 #define SYM_PERNODISTRIBUTE 9 // 每股未分配 #define SYM_PERINCOMEYEAR 10 // 每股收益(年) #define SYM_PERPUREASSET 11 // 每股净资产 #define SYM_CHPERPUREASSET 12 // 调整每股净资产 #define SYM_DORRIGHTRATE 13 // 股东权益比 /***********************************************************************************/ /***********************************************************************************/ // 商品配置发送定义 // 得到文件名 const char * GetSendFile(int type); // 下面只在发送端有用 typedef struct { int Type;//文件标识 char FileName[128];//文件名 } SEND_FILE_INFO; extern const SEND_FILE_INFO cSendFileList[]; /***********************************************************************************/ #endif 基本结构如下: 资讯: char szSource[32]; // 数据源 char szInfo[32]; // 资讯类型 int iParentIndex; // 父索引 unsigned long iKey; // 唯一ID int iOrder; // 顺序, 一般用在F10 int iAllCount; // 总个数与顺序一起使用, 一般用在F10 int iMarket; // 市场 char szCode[32]; // 商品 int64 iTime; // 时间 string TitleBuf; // 标题 string ContentBuf; // 内容 行情: DWORD dwTime; // 标准时间 unsigned long lMilliSecond; // 毫秒 char cType; // 包类型 char szCode[12]; int iMarket; float fNow; float fAvg; float fOpen; float fLastAvg; // 昨结算 float fClose; // 昨收盘 float fLow; float fHigh; float fVolume; // 成交量 float fAmount; // 成交额 float fHold; // 持仓 // 五档行情都是float 财务信息都是float float fAllStock; // 总股本 float fCircStock; // 流通股本 float fAllAsset; // 总资产 float fFlowDebt; // 流动负债 float fPerFund; // 每股公积金 float fBusinessProfit; // 营业利益 float fPerNoDistribute; // 每股未分配 float fPerIncomeYear; // 每股收益(年) float fPerPureAsset; // 每股净资产 float fChPerPureAsset; // 调整每股净资产 float fDorRightRate; // 股东权益比 转发协议说明: 转发协议,但是这个协议仅仅是将行情数据实时推送给客户,开高低收、各交易所的收盘处理、结算价处理等等都需要客户自己处理的! 商品码表,交易时间的文件,每天8:50左右会更新 发送端会将客户当做行情服务器处理,客户的接收端IP、端口信息在我们这边指定的认证服务器登记后,发送端会主动向客户发送数据!而且如果客户停止了接收,我们这边会记录停止这段时间的全部实时数据,等到下次客户重新开启时推送! 能否用您的视通经典程序,接收对方发送的时时数据,建立一个落地数据库,以便为程序化交易,策略模拟以及程序化自动交易,做个数据源,感谢您的回复! zgq123 敬上
接61楼的问题,也回答62楼,这个通视实时服务器用了服务器的名称,但本质上是一种技术,即微软针对excelXP开发的一种替代DDE的技术:RTD(realtime data server)。所以这个服务与excel是不可分割的,excel表格就是服务的应用客户端,而RTD服务就是以函数形式(COM)运行在excel进程空间里的一个后台业务。因此,通视实时服务器不用于给非excel的前端提供数据(行情)服务,本身也不试图去保存这些数据(落地),因此不能把它看成是一个通用的数据源,而仅仅是excel平台的专用数据源。 如果策略/交易平台就是excel,当然可以采用通视实时服务器的技术(即RTD)来做实时行情接入,如果不是,就没有必要采用它(有多的多的选择)。
Tom您好! 能否抽时间帮个忙呢?我不太熟悉建库,‘"如果不是,就没有必要采用它(有多的多的选择)",您给个建议吧!原则就是落地速度读写快,数据源提供方也有金士达接口,想搞个时时的程序化交易。 或者,您简单的给个方案,我再找程序员,您要是有时间帮忙,感谢不尽。
我理解你的需求是建一个程序化交易平台,包含行情数据处理、策略开发和交易执行等功能。如果是这种东西,市场上已经有很多选择了,包括IT供应商做的、券商(期货)公司做的、投资者自己做的,这个论坛上有很多这样的信息,你应该可以找到。建议你选择一个现成的方案,不要自己再去做一套,没有必要。 任何现成的方案可能都有这样或那样的不足,但这些都不太重要。关键是你想做的策略是否可以通过这些方案来实现,且在市场上有生命力。 你如果不是搞技术出身,不妨把业务说清楚。这样,我(包括其他坛友)也可以告诉你合适的选择方案可能有哪些。
Tom_sh: 感谢您的帮助! 主要想分三步: 一,根据数据发送方的数据结构,接受数据流,建个落地库,把数据流转化成1 钟、5分钟、,...日线、周线、月线存储起来,以便调用; 二、利用上边存储的数据,搞个策略化交易模拟; 三,可行的话,再继续搞程序化自动下单。 目前,只想第一步实现就可以了,怎么做啊?能否给个框图,我再找人做,原则是速度要快。 谢谢 Tom_sh指点!
所以你的业务需求是作策略化交易模拟(paper trading)和策略化实盘交易 (程序化自动下单),而(我认为)你所说的 第一步只是可能的技术实现方案之一。 我自己的观察和经验是收实时行情这部分比较容易,但落地库的方案(包括使用模式)就要麻烦很多了。普通的数据库技术到了一定的数据量以后性能不足以满足程序化交易(严格地说是其中部分应用情景)的需求。所以好一点的方案(对于普通的技术人员来说)是使用文件式数据存储,而不用数据库。国外有一些技术方案可以完善地解决这个问题,不过我想不是你轻易能找到合适的程序员来作这些方案的二次开发的。 所以你的选择不太多: 1)只作日线级别的交易策略,可以覆盖全市场,可以使用(中国市场)全部历史数据,采用传统数据库技术作数据采集和落地保存; 2) 可以作分钟级别的K线交易策略,可以覆盖全市场,但只能使用部分历史数据(无论K线级别,记录数约1000-2000个),采用从指定的实时行情接口(数畅/银江)按需程序化点播取历史数据,但不作落地库; 3)直接使用成熟策略交易平台,如金字塔、强者博弈、开拓者、金钱豹等提供的实时数据和历史数据解决方案,你请熟练的有关交易平台程序员直接作模拟交易或实盘交易策略即可; 4)如果你的业务有一定的规模,可以找几家领先的券商/期货公司问他们有没有类似的解决方案,直接用他们提供的方案,当然条件是你得给他们生意; 如果你要速度快,只有上述几种可能。想自己从基础做起,除非是同时很懂技术和业务,否则最大的可能是走错路(花了一些时间后发现此路不通,我想这个坛子上很多人都已经有这个体会了),而且基本上不可能快的。
Tom_sh前辈您好! 我感觉您在这方面经验很丰富、专业, 您能抽时间帮个忙吗?帮忙把落地数据库写好? 用对方的接口是因为对方的数据很快的,我比较过他们的行情客户端,比博大师不慢或者更快一些。 找别的程序员会花好多时间,我想把精力放在策略研究与模拟上。 您有QQ吗? 可以私下聊聊具体问题。 谢谢
zgq123,你过奖了。落地数据库方面我们也不是自己做,而是买的,用在包括股票和期货的程序化业务方面。这个方案的成本很高,每年几十万人民币。我不知道你要多快的(内盘)数据,我想除了上期技术,市场上不会有比我们更快的了。除非你的行情源是(免费的)外盘股票/期货,否则说实话我觉得做另一个普通的接口意义不大。 你可以给我邮件,如果可以电话谈的话,我不上QQ的。
tom_sh, 请问你认为国内较好的数据源提供方有哪些?希望数据能用来做数模分析,要求可提供历史和实时数据,包括内外盘期货与外汇。 我知道的: 倚天的有倚天金融快车,不过数据质量令人质疑。 文华的似乎数据质量不错,不知道文华是否有提供专门的数据接口? 除此之外,不知还有哪些较好的数据源?
qinjs,与国外不同,数据源在国内还不是一个成熟的生意。像你这样要求有完整历史和实时数据,且覆盖多个资产类别的产品应该国内还没有一家供应商能做到。bloomberg这样的国外数据供应商可能是唯一的渠道。虽然说国内统一的数据解决方案没有现成的答案,但分开的还是有很多选择。比如历史数据可以找天软、聚源、万得;实时股票level2的找创真(如果你是金融机构也可以给历史数据);实时股票普通的找数畅等;实时期货找CTP、金仕达等。券商/期货公司普遍有他们的解决方案,一般多为场内部署(互连网放出来的有侵权风险)。 文华的数据接口没有商品化,也没有特别的必要去弄。对于期货来说,有了CTP(专线或托管模式,互连网不行),你的实时行情源问题基本上彻底解决了。 外盘的行情源麻烦一些。除了文华的行情源据说是合法授权(我也怀疑)的以外,不知道其他的软件如澎博等那些的行情从哪里来。从代码格式上来看,似乎都是从一家上海的贸易公司那里来的。不过使用这种未授权的数据做行情软件是一回事,交易或数模分析可就是另一回事了。我自己认为不靠谱。 如果你的需求可以限于国内市场,找你的服务券商和期货公司解决这些问题最合适。他们收了你的钱,肯定会比较积极地想办法。自己去干没有必要。
谢谢 tom_sh 兄! 用来做交易或数模分析的数据质量确实要求较高,看来国内提供的外盘数据暂时只能用来辅助参考了。 我一直有在用倚天的接口,以前和交易所网站上的日线数据(国内期货)对比检查过,准确性比不上文华的,最近检查1分钟历史数据以及记录每分钟的实时数据,发现实时每笔数据倚天与文华(CTP版)几乎一样,倚天的稍慢,而记录的倚天每分钟实时数据,与文华的历史1分钟数据符合度很高,比倚天的1分钟历史数据符合度还高,所以我怀疑倚天的实时数据与历史数据来源不一样,搞得我都比较怀疑用倚天的国内期货历史数据来做数模分析的结果。倚天的数据给我的感觉就是东拼西凑得来的。 关于CTP的实时行情源,“专线或托管模式,互连网不行” 是否指互联网的数据速度问题?准确性应该无问题吧?按目前的交易策略构想,数据稍有三、五秒的延迟是可允许的。 至于国内期货历史数据,天软、聚源、万得好像是提供股票的吧;文华有提供,不过是一次性的,也就是从开始到当前日期的历史数据一次性卖,如果过1个月后想要最新的历史数据,又是一次性要购买的从开始到买数据的日期的历史数据,不提供定期下载更新。请问 tom_sh 兄知道哪里有可定时下载国内期货历史数据(日线、5分钟、1分钟)的服务商吗?要求数据准确可靠,可用于数模分析建立交易模型。 还请 tom_sh 兄能抽空给予指点。
CTP的全市场行情点播仅可在专线和托管模式下实现。互连网下发全市场点播请求只会送前10(?)个代码的行情。另外,速度上专线不见得快过互连网(我这里是互连网ping40ms,专线42ms)。 国内期货的历史数据方面,至少天软可以提供,万德(金融终端)应该也可以。聚源的没注意,你可以打电话问问。这三个都是价格不低的。 可以定时/分段下载期货数据的国内供应商可能没有(不知道金字塔、开拓者这些交易型软件怎样)。建议你试试万得,如果不行,就通过你的期货公司从bloomberg下。
CTP的点播我向其他人了解了一下,据说是限制10个合约,但实际上不限,但合约多的话会有些卡。翻翻CTP版老帖,版主说有流量控制,那这样也可以解释点播的合约多会卡的问题。 tom_sh 兄,关于历史数据从 bloomberg 下载,一般期货公司都有这个东西吗?我比较担心万一以后想转期货公司,别的期货公司不能提供,就被绑死离不开原来的期货公司了。