根据CTP TICK,自己生成3分钟K线开高低收,老是出错?

Discussion in 'CTP' started by 蓝色天空, Apr 28, 2014.

  1. --->>> CMdSpi::OnFrontConnected
    --->>> 发送行情用户登录请求: 成功
    --->>> CMdSpi::OnRspUserLogin
    --->>> 获取当前交易日 = 20140428
    --->>> 发送行情订阅请求: 成功
    --->>> TraderInfo_20140424.txt
    --->>> CMdSpi::OnRspSubMarketData_ru1409
    --->>> CTraderSpi::OnFrontConnected
    --->>> CTraderSpi::Delay 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
     
  2. 上面只标出了一些,生成的错数据更多些
    跟文化财经的3分钟行情数据比较,
    开盘价和收盘价错误的特别多,个人感觉跟收到的数据延时时间有很大关系?
    请问海洋的朋友们都是怎么解决的。

    目前我的处理过程是这样的:
     
  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的收盘价:
     
  4. 各个软件K线生成方式不同,文华从00:00.000开始00:59.500结束,博弈大师00:01.000开始,01:00.500结束,上午和下午还不一样,对于11:30:00.000的tick处理也不一样。
    就按照自己的方式生成好了。
     
  5. 开盘价错误,可能影响高低收三个参数。
    只要确定好了开盘,那高低收三个参数就应该好弄了。
     

  6. 多谢提醒,但这个只是标记时间信息不同而已,

    文化和博弈大师的bar数据都比较了一下一天,基本相同的。
    但我生成的这个数据差得很多。
     
  7. 搞了几天没搞定,郁闷

    有没有哪位大侠能提供一个生成K线的参考代码,c或c++
    随便多少分钟K线或小数K线都可以。多谢先

    邮箱:1396144618@qq.com
     
  8. 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);
    }
    }
     
  9. 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);
    }
    }
     
  10. 其中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),
    则更新开盘价为最新价,并从新计算高低收。
     
  11. 先切割时间。对于3分钟k线
    9:00:00-9:02:59为第1根k线。
    9:03:00-9:05:59为第2根k线。
    ..............................。

    然后根据收到的行情时间,把o h l c填入k线。
     
  12. 这个方法不错。

    另:k线的一点误差真的有那么重要吗? 只不过大家的时间周期不同而已。
     
  13. 多谢,你所说的时间是指本地时间吧,行情时间有时没有的。

    如果是本地时间,怎么处理与行情时间差异呢?
     
  14. 发现代码一个逻辑问题,大意了,如下修改
    目前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;
     
  15. 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
     
  16. TickSignal多次被改写了。
    重新做了互斥处理,行情接收基本正常。
     
  17. 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::Delay 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
     
  18. 我这个应该算3个线程的吧,行情,下单,主线程。加入策略计算即可实现程序化自动交易了。

    遗憾的是,由于本人是搞硬件的,搞软件不在行,弄不来多合约版
    所以目前只能实现单合约的程序化自动交易。

    C++源码,月底放送全部源码,也好再测试看看还有什么问题

    本人也是由于在网上找了很久,都没有接收行情处理源码,才自己弄的

    最后希望搞软件的高手能弄个多合约版本的框架出来,给大伙用用
    主要的策略什么的就自己留着吧,大伙基本不会要求的:)
     
  19. 多合约其实逻辑上没有什么

    品种策略对1
    品种策略对2

    while(Get行情(tick))
    {
    品种策略对1.onTick(tick);
    品种策略对2.onTick(tick);
    ....

    }
     
  20. 多谢nusic兄
    我的多合约CTP版本少量入金后已经测试一周了,目前还算正常。
    以后可以不用TB,日内可以节省一些手续费:)