--->>> CMdSpi::OnFrontConnected --->>> 发送行情用户登录请求: 成功 --->>> CMdSpi::OnRspUserLogin --->>> 获取当前交易日 = 20140428 --->>> 发送行情订阅请求: 成功 --->>> TraderInfo_20140424.txt --->>> CMdSpi::OnRspSubMarketData_ru1409 --->>> CTraderSpi::OnFrontConnected --->>> CTraderSpi:elay 2s! --->>> 发送交易用户登录请求: 成功 --->>> CTraderSpi::OnRspUserLogin --->>> 获取当前交易日 = 20140428 --->>> 投资者结算结果确认: 成功 --->>> CTraderSpi::OnRspSettlementInfoConfirm --->>> 请求查询合约: 成功 --->>> CTraderSpi::OnRspQryInstrument --->>> 请求查询资金账户: 成功 --->>> CTraderSpi::OnRspQryTradingAccount --->>> 请求查询投资者持仓: 成功 --->>> CTraderSpi::OnRspQryInvestorPosition --->>> Configuration File is ok! --->>> Initialization is Complete! --->>> ru1409_1_14:03:00_14255_14255_14255_14255 --->>> ru1409_2_14:06:00_14245_14250_14245_14245 --->>> ru1409_2_14:09:00_14250_14250_14225_14230 --->>> ru1409_2_14:12:00_14230_14285_14230_14270 --->>> ru1409_2_14:15:00_14270_14290_14260_14265 --->>> ru1409_1_14:17:59_14265_14280_14255_14280 --->>> ru1409_1_14:20:57_14250_14265_14250_14260 --->>> ru1409_1_14:23:59_14285_14285_14275_14280 --->>> ru1409_1_14:27:00_14315_14315_14315_14315 --->>> ru1409_3_14:27:00_14315_14315_14315_14315 --->>> ru1409_1_14:30:00_14315_14315_14280_14305 --->>> ru1409_1_14:33:00_14300_14300_14300_14300 --->>> ru1409_2_14:36:00_14300_14305_14295_14295 --->>> ru1409_3_14:39:00_14295_14350_14295_14350 --->>> ru1409_2_14:42:00_14350_14410_14350_14365 --->>> ru1409_1_14:42:00_14370_14370_14370_14370 --->>> ru1409_3_14:45:00_14365_14365_14365_14365 --->>> ru1409_2_14:48:00_14365_14395_14360_14385 --->>> ru1409_2_14:51:00_14385_14420_14385_14400 --->>> ru1409_3_14:54:00_14395_14405_14370_14405 --->>> ru1409_2_14:57:00_14405_14410_14365_14370 --->>> ru1409_1_15:00:00_14380_14405_14365_14400
上面只标出了一些,生成的错数据更多些 跟文化财经的3分钟行情数据比较, 开盘价和收盘价错误的特别多,个人感觉跟收到的数据延时时间有很大关系? 请问海洋的朋友们都是怎么解决的。 目前我的处理过程是这样的:
首先说我怎么确定开盘价: 1、正常情况下,正点时间收到行情数据: 如果收到的UpdateTime,根据时分秒转换为秒:Q_BarTime_sec, 如Q_BarTime_sec%180==0,且同时UpdateMillisec=00; 说明收到的最新价为开盘价,并标记为true。 2、正点时间以后才收到行情数据(如成交不活跃时,可能出现此情况): 如果没检测到(Q_BarTime_sec%180==0,且同时UpdateMillisec=00) 而是Q_BarTime_sec%180==0 UpdateMillisec>0 或者Q_BarTime_sec%180>0 且判断标记是false,则将收到的最新价记为开盘价。 3、如果3分钟内都没有收到数据,则该BAR的开高收低价位等于上一个BAR的收盘价:
各个软件K线生成方式不同,文华从00:00.000开始00:59.500结束,博弈大师00:01.000开始,01:00.500结束,上午和下午还不一样,对于11:30:00.000的tick处理也不一样。 就按照自己的方式生成好了。
if (Q_BarTime_1%180==0 && (Millisecs<=300) && TickSignal==false) { Sleep(010); if(Tick3mins==false && TickSignal==false) { cerr << "--->>> " <<InstrumentID_name<<"_2_"<<Q_BarTime_s<<"_"<<M3_open<<"_"<< M3_high<<"_"<< M3_low <<"_"<< M3_close << endl; TickSignal=true; WriteConfiguration("./AutoTrader.dat"); } M3_open=NewPrice; M3_high=NewPrice; M3_low =NewPrice; M3_close=NewPrice; Sleep(010); } else { if( ((Q_BarTime_1%180==0 && Millisecs>300) || Q_BarTime_1%180>0) && Q_BarTime_1%180<=158 && TickSignal==false) { Sleep(010); if(Tick3mins==false && TickSignal==false) { cerr << "--->>> " <<InstrumentID_name<<"_3_"<<Q_BarTime_s<<"_"<<M3_open<<"_"<< M3_high<<"_"<< M3_low <<"_"<< M3_close << endl; TickSignal=true; WriteConfiguration("./AutoTrader.dat"); } M3_open=NewPrice; M3_high=NewPrice; M3_low=NewPrice; M3_close=NewPrice; Sleep(010); } else { Sleep(010); M3_high=max(M3_high,NewPrice); M3_low=min(M3_low,NewPrice); M3_close=NewPrice; Sleep(010); } }
if (Make_times>300 && Make_times<400 && TradingTime_1A) { if(TickSignal==false && Tick3mins==false) { Sleep(010); cerr << "--->>> " <<INSTRUMENT_ID<<"_1_"<<Q_BarTime_s<<"_"<<M3_open<<"_"<< M3_high<<"_"<< M3_low <<"_"<< M3_close << endl; Tick3mins=true; WriteConfiguration("./AutoTrader.dat"); M3_open=M3_close; M3_high=M3_close; M3_low=M3_close; M3_close=M3_close; Sleep(010); } }
其中Make_times Make_times=(sys_time_sec*1000+sys_time.wMilliseconds+Timeoffset_Tick)%180000; sys_time_sec*1000+sys_time.wMilliseconds 本次查询的本地系统时间 单位是毫秒。 Timeoffset_Tick=上一次本地系统时间与TICK中的时间之差,单位是毫秒。 原理就是,上一次本地时间和TICK发送时间有差异,通过上一次时间差,结合现在本地时间推算下一次TICK的时间,如果推算的时间内没收到TICK,说明成交不活跃。 如果这种现象(代码中1)发生在本应该收分钟开盘价时刻, 这就将上周期收盘价赋予本周期开盘价。 处理流程大致如下: 如果本周期内正点位置收到TICK,正常接收,代码打印的2 如果本周期内正点位置没有收到TICK: 如果本周期内一直没有收到tick,那本周期开高收盘价都等于上周期收盘价。 如果本周期内正点位置以后收到tick(代码中3), 则更新开盘价为最新价,并从新计算高低收。
先切割时间。对于3分钟k线 9:00:00-9:02:59为第1根k线。 9:03:00-9:05:59为第2根k线。 ..............................。 然后根据收到的行情时间,把o h l c填入k线。
发现代码一个逻辑问题,大意了,如下修改 目前90%行情与文化财经或博易大师相同,还是部分错误,再想想看... if(Tick3mins==false && TickSignal==false) { cerr << "--->>> " <<InstrumentID_name<<"_3_"<<Q_BarTime_s<<"_"<<M3_open<<"_"<< M3_high<<"_"<< M3_low <<"_"<< M3_close << endl; TickSignal=true; WriteConfiguration("./AutoTrader.dat"); } 改为 if(Tick3mins==false && TickSignal==false) { cerr << "--->>> " <<InstrumentID_name<<"_3_"<<Q_BarTime_s<<"_"<<M3_open<<"_"<< M3_high<<"_"<< M3_low <<"_"<< M3_close << endl; WriteConfiguration("./AutoTrader.dat"); } TickSignal=true;
2014.04.30盘后发现,今天的数据有些新问题 代码中有个TickSignal标志,按代码看, 只要存在"ru1409_2"这样的打印,那TickSignal就应该被设置为true了 所以"ru1409_3"的条件是TickSignal==false,就不应同时再出现"ru1409_3" 奇怪了,难道TickSignal被改写了??????????? --->>> ru1409_2_14:00:00_14325_14340_14320_14330 --->>> ru1409_2_14:03:00_14325_14345_14315_14335 --->>> ru1409_2_14:06:00_14335_14340_14325_14335 --->>> ru1409_3_14:09:00_14330_14340_14325_14340 --->>> ru1409_3_14:12:00_14340_14345_14325_14330 --->>> ru1409_3_14:15:00_14330_14355_14330_14345 --->>> ru1409_2_14:18:00_14345_14355_14340_14340 --->>> ru1409_3_14:18:00_14340_14340_14340_14340 --->>> ru1409_2_14:21:00_14340_14365_14335_14350 --->>> ru1409_1_14:21:00_14350_14350_14350_14350 --->>> ru1409_2_14:24:00_14350_14365_14330_14330 --->>> ru1409_1_14:24:00_14330_14330_14330_14330 --->>> ru1409_3_14:27:00_14335_14355_14330_14345 --->>> ru1409_2_14:30:00_14345_14350_14335_14335 --->>> ru1409_1_14:32:59_14335_14355_14335_14350 --->>> ru1409_2_14:36:00_14350_14360_14275_14300 --->>> ru1409_1_14:36:00_14300_14300_14300_14300 --->>> ru1409_2_14:39:00_14300_14320_14285_14300 --->>> ru1409_2_14:42:00_14300_14310_14290_14305 --->>> ru1409_2_14:45:00_14305_14310_14280_14305 --->>> ru1409_3_14:45:00_14300_14300_14300_14300 --->>> ru1409_1_14:45:00_14300_14300_14300_14300 --->>> ru1409_2_14:48:00_14305_14320_14285_14295 --->>> ru1409_3_14:48:00_14295_14295_14295_14295 --->>> ru1409_2_14:51:00_14295_14300_14280_14290 --->>> ru1409_1_14:51:00_14290_14290_14290_14290 --->>> ru1409_1_14:53:59_14295_14295_14280_14290 --->>> ru1409_2_14:57:00_14290_14320_14280_14290 --->>> ru1409_3_14:57:00_14295_14295_14295_14295 --->>> ru1409_2_15:00:00_14300_14345_14295_14335
2014.05.05 ru1409 3分钟K线行情如下 --->>> Welcom MyAutoTrader System! --->>> Version 1.0.1! --->>> Initializing UserApi --->>> Initializing MdApi --->>> CMdSpi::OnFrontConnected --->>> 发送行情用户登录请求: 成功 --->>> CMdSpi::OnRspUserLogin --->>> 获取当前交易日 = 20140505 --->>> 取消行情订阅请求: 成功 --->>> 发送行情订阅请求: 成功 --->>> TraderInfo_20140424.txt --->>> CMdSpi::OnRspUnSubMarketData --->>> CMdSpi::OnRspSubMarketData_ru1409 --->>> CTraderSpi::OnFrontConnected --->>> CTraderSpi:elay 3s! --->>> 发送交易用户登录请求: 成功 --->>> CTraderSpi::OnRspUserLogin --->>> 获取当前交易日 = 20140505 --->>> 投资者结算结果确认: 成功 --->>> CTraderSpi::OnRspSettlementInfoConfirm --->>> 请求查询合约: 成功 --->>> CTraderSpi::OnRspQryInstrument --->>> 请求查询资金账户: 成功 --->>> CTraderSpi::OnRspQryTradingAccount --->>> 请求查询投资者持仓: 成功 --->>> CTraderSpi::OnRspQryInvestorPosition --->>> Configuration File is ok! --->>> Initialization is Complete! --->>> ru1409_1_09:03:00_14285_14295_14200_14245 --->>> ru1409_2_09:06:00_14245_14325_14235_14305 --->>> ru1409_2_09:09:00_14300_14470_14300_14400 --->>> ru1409_3_09:12:00_14400_14410_14360_14390 --->>> ru1409_3_09:15:00_14395_14415_14385_14410 --->>> ru1409_2_09:18:00_14415_14430_14385_14405 --->>> ru1409_3_09:21:00_14410_14410_14390_14400 --->>> ru1409_1_09:23:59_14400_14405_14380_14390 --->>> ru1409_1_09:26:56_14390_14395_14365_14390 --->>> ru1409_3_09:30:00_14390_14410_14375_14400 --->>> ru1409_2_09:33:00_14400_14400_14360_14385 --->>> ru1409_3_09:36:00_14385_14395_14365_14380 --->>> ru1409_3_09:39:00_14385_14390_14375_14385 --->>> ru1409_3_09:42:01_14390_14395_14380_14380 --->>> ru1409_2_09:45:00_14385_14415_14380_14405 --->>> ru1409_2_09:48:00_14410_14415_14385_14390 --->>> ru1409_2_09:51:00_14390_14395_14370_14390 --->>> ru1409_2_09:54:00_14390_14395_14360_14375 --->>> ru1409_3_09:57:00_14380_14390_14370_14385 --->>> ru1409_2_10:00:00_14390_14395_14365_14390 --->>> ru1409_2_10:03:00_14390_14405_14380_14405 --->>> ru1409_2_10:06:00_14400_14405_14390_14400 --->>> ru1409_1_10:08:54_14395_14405_14385_14385 --->>> ru1409_3_10:12:00_14390_14390_14375_14385 --->>> ru1409_1_10:15:00_14390_14425_14385_14415 --->>> ru1409_3_10:30:00_14415_14415_14415_14415 --->>> ru1409_1_10:32:59_14415_14420_14390_14400 --->>> ru1409_2_10:36:00_14400_14445_14400_14430 --->>> ru1409_2_10:39:00_14425_14435_14415_14430 --->>> ru1409_3_10:42:00_14425_14435_14400_14405 --->>> ru1409_3_10:45:00_14410_14410_14390_14400 --->>> ru1409_1_10:47:59_14400_14420_14395_14405 --->>> ru1409_2_10:51:00_14410_14425_14405_14415 --->>> ru1409_3_10:54:00_14410_14420_14400_14410 --->>> ru1409_3_10:57:00_14410_14410_14390_14405 --->>> ru1409_2_11:00:00_14405_14405_14390_14395 --->>> ru1409_3_11:03:01_14395_14395_14375_14385 --->>> ru1409_2_11:06:00_14385_14395_14365_14370 --->>> ru1409_2_11:09:00_14375_14380_14345_14365 --->>> ru1409_3_11:12:00_14360_14360_14335_14340 --->>> ru1409_3_11:15:00_14340_14345_14320_14340 --->>> ru1409_1_11:17:59_14340_14340_14320_14330 --->>> ru1409_2_11:21:00_14330_14330_14295_14295 --->>> ru1409_3_11:24:00_14290_14330_14285_14330 --->>> ru1409_2_11:27:00_14325_14330_14300_14305 --->>> ru1409_2_11:30:00_14305_14320_14290_14320 --->>> ru1409_3_13:30:00_14320_14320_14320_14320 --->>> ru1409_1_13:32:57_14320_14325_14305_14310 --->>> ru1409_3_13:36:00_14310_14335_14305_14335 --->>> ru1409_2_13:39:00_14330_14335_14315_14320 --->>> ru1409_3_13:42:00_14315_14325_14305_14315 --->>> ru1409_3_13:45:00_14315_14345_14315_14330 --->>> ru1409_2_13:48:00_14330_14340_14315_14315 --->>> ru1409_2_13:51:00_14315_14395_14315_14395 --->>> ru1409_3_13:54:00_14390_14400_14375_14380 --->>> ru1409_2_13:57:00_14380_14390_14365_14370 --->>> ru1409_3_14:00:00_14375_14380_14360_14370 --->>> ru1409_3_14:03:00_14370_14390_14370_14370 --->>> ru1409_2_14:06:00_14375_14385_14370_14370 --->>> ru1409_3_14:09:00_14370_14380_14360_14365 --->>> ru1409_3_14:12:01_14365_14375_14365_14365 --->>> ru1409_2_14:15:00_14370_14370_14325_14325 --->>> ru1409_2_14:18:00_14325_14340_14325_14335 --->>> ru1409_3_14:21:00_14335_14340_14325_14335 --->>> ru1409_3_14:24:00_14340_14350_14325_14345 --->>> ru1409_3_14:27:00_14345_14360_14340_14345 --->>> ru1409_3_14:30:00_14345_14390_14340_14380 --->>> ru1409_1_14:33:00_14380_14380_14345_14345 --->>> ru1409_2_14:36:00_14345_14360_14325_14325 --->>> ru1409_2_14:39:00_14325_14335_14315_14315 --->>> ru1409_3_14:42:01_14315_14330_14315_14325 --->>> ru1409_3_14:45:00_14325_14340_14320_14330 --->>> ru1409_1_14:47:56_14330_14350_14325_14340 --->>> ru1409_2_14:51:00_14340_14340_14275_14290 --->>> ru1409_2_14:54:00_14290_14320_14285_14320 --->>> ru1409_2_14:57:00_14320_14330_14305_14320 --->>> ru1409_1_15:00:00_14320_14370_14310_14365
我这个应该算3个线程的吧,行情,下单,主线程。加入策略计算即可实现程序化自动交易了。 遗憾的是,由于本人是搞硬件的,搞软件不在行,弄不来多合约版 所以目前只能实现单合约的程序化自动交易。 C++源码,月底放送全部源码,也好再测试看看还有什么问题 本人也是由于在网上找了很久,都没有接收行情处理源码,才自己弄的 最后希望搞软件的高手能弄个多合约版本的框架出来,给大伙用用 主要的策略什么的就自己留着吧,大伙基本不会要求的