TICK逐笔数据案例一:挂单统计策略TICK数据回测

    前言

    散户眼中的TICK数据:成交价
    机构眼中的TICK数据:成交价+委托价
    文华提供的TICK数据:成交价+五档委托价+大单统计数据

    相比交易接口提供的一档数据,文华的五档数据能够为算法交易提供更大的发挥空间。
    五档的挂单价格预示了市场后续的价格变化,可帮助算法交易先人一步确定更优的委托价格。
    利用五档的挂单量数据,可实时计算多空双方的资金规模,为算法交易灵活调整建仓手数、确保成交提供了保障。
    开平仓及主动买卖的大单统计数据,可辅助算法交易把握主力资金动向,防范逆势风险,实现对整个交易过程的风险控制。

    优势

    • 提供五档委托价、委托量,买卖盘大单统计数据等全面的TICK数据。
    • 提供任意交易日的TICK数据可供模型回测。
    • 大商所和郑商所品种提供每秒最多4笔的高频TICK数据。

    独立的算法交易模型可以利用盘口的挂单数据进行计算和判断,支持复杂且高频率的交易策略,但如果编写的高频策略未经测试直接用于实盘,也同样会使得交易风险成倍增长。

     

    wh9可针对算法策略进行逐笔Tick精确回测,直观展示每一笔的挂单状态和行情变化,为投资者提供精准的策略检验工具。

     

    我们可以尝试如下策略:

     

    当前TICK的买一量大于前面三笔TICK买一量的最大值,并且价格上涨,则买入开仓。

    当前TICK的卖一量大于前面三笔TICK卖一量的最大值,并且价格下跌,则卖出开仓。

    开仓后60秒平仓,或5个最小变动价位止损。

    源码如下:

    Data
       data0:"rb1910";
    Vars
    //--------------------------定义普通变--------------------------
       Numeric Lots;	//委托数量
       Numeric OverPrice_M;//超价参数
       Numeric MinPr;//最小变动价位
    //--------------------------定义可用持仓-------------------------
       Numeric Buy_J;//多头可用今仓
       Numeric Buy_L;//多头可用老仓
       Numeric Sell_J;//空头可用今仓
       Numeric Sell_L;//空头可用老仓
    //--------------------------定义全局变量-------------------------
       Global_Numeric Bid_Max;//最大买一价
       Global_Numeric BidVol_Max;	//最大买一量
       Global_Numeric Ask_Max;//最大卖一价
       Global_Numeric AskVol_Max;//最大卖一量
    //--------------------------定义全局变量-------------------------
       Global_Numeric PriceBid;//记录多头开仓价位
       Global_Numeric PriceBidTime;//记录多头开仓时间
       Global_Numeric PriceAsk;//记录空头开仓价位
       Global_Numeric PriceAskTime;//记录空头开仓时间
    //--------------------------定义全局变量-------------------------
       Global_Numeric Coin;
       Global_Numeric KF;//开平仓控制
    //--------------------------定义数据区--------------------------
       Var_TickData data1;
       Var_TickData data2;//定义数据区
    Begin
       Lots = 1;//委托数量
       OverPrice_M = 1;//超价参数
       MinPr = 1;//最小变动价位
       data1 = Def_TickData("rb1910",1,4); //数据容量
       data2=Def_TickData("rb1910",1,1);
       If(data1.State == 1)
       {
          BID_Max = Max1( data1[0].Bid1, data1[1].Bid1, data1[2].Bid1);//之前3笔TICK最大买一价(不含当前TICK)
          BidVol_Max = Max1(data1[0].BidVol1,data1[1].BidVol1,data1[2].BidVol1);//之前3笔TICK最大买一量(不含当前TICK)
          Ask_Max = Max1( data1[0].Ask1, data1[1].Ask1, data1[2].Ask1);//之前3笔TICK最大卖一价(不含当前TICK)
          AskVol_Max = Max1(data1[0].AskVol1,data1[1].AskVol1,data1[2].AskVol1);//之前3笔TICK最大卖一价量(不含当前TICK)
          Coin = 1;
       }
       If (Coin == 1)
       {
          Buy_J = A_TodayBuyRemainPosition(); //获得多头可用持仓量,今仓
          Buy_L = F_BuyRemainPosition - A_TodayBuyRemainPosition(); //获得多头可用持仓量,老仓
          Sell_J = A_TodaySellRemainPosition(); //获得空头可用持仓量,今仓
          Sell_L = F_SellRemainPosition - A_TodaySellRemainPosition(); //获得空头可用持仓量,老仓
          If (((Buy_J > 0) || (Buy_L > 0)) && KF == 1)//平多头持仓条件
          {
             If ((PriceBid - data2[0].Bid1 > 5 * MinPr) || (TimeDiff(PriceBidTime,CurrentTime()) > 60))//5个价位止损或开仓超过60秒
             {
                If (Buy_J > 0)
                {
                   A_SendOrder(Enum_Sell,Enum_ExitToday,Lots,data2[0].Bid1);
                   //卖平今仓
                }
                Else If (Buy_L > 0)
                {
                   A_SendOrder(Enum_Sell,Enum_Exit,Lots,data2[0].Bid1);
                   //卖平老仓
                }
                KF=0;
             }
          }
          Else If (((Sell_J > 0) || (Sell_L > 0)) && KF == 1)//平空头持仓条件
          {
             If ((PriceAsk - data2[0].Ask1> 5 * MinPr) || (TimeDiff(PriceAskTime,CurrentTime()) > 60))//5个价位止损或开仓超过60秒
             {
                If (Sell_J > 0)
                {
                   A_SendOrder(Enum_Buy,Enum_ExitToday,Lots,data2[0].Ask1);//买平今仓
                }
                Else If(Sell_L > 0)
                {
                   A_SendOrder(Enum_Buy,Enum_Exit,Lots,data2[0].Ask1);//买平老仓
                }
                KF=0;
             }
          }
          Else 
          {
             If (KF == 0)
             {
                If ((data2[0].BidVol1 > BidVol_Max) && (data2[0].Bid1 > Bid_Max))//当前Tick的买1量大于前三笔最大买1量,且价格上涨,买开
                {
                   A_SendOrder(Enum_Buy,Enum_Entry,Lots,data2[0].Ask1 + MinPr * OverPrice_M);
                   //发出委托,以对手价超M个最小变动价位买开仓
                   PriceBid = data2[0].Ask1 + Minpr * OverPrice_M;
                   PriceBidTime = CurrentTime();
                   KF = 1;
                }
                If ((data2[0].AskVol1 > AskVol_Max) && (data2[0].Ask1 < Ask_Max))//当前Tick的卖1量大于前三笔最大卖1量,且价格下跌,卖开
                {
                   A_SendOrder(Enum_Sell,Enum_Entry,Lots,data2[0].Bid1 - MinPr * OverPrice_M);
                   //发出委托,以对手价超M个最小变动价位卖开仓
                   PriceAsk = data2[0].Bid1 - Minpr * OverPrice_M;
                   PriceAskTime = CurrentTime();
                   KF = 1;
                }
             }
          }
       }
    End

    我们选择螺纹1910合约进行算法交易模型回测,回测日志如下:

     

    TICK逐笔数据案例一:挂单统计策略TICK数据回测
    超长k线数据案例一:超长k线数据测试 量化交易

    超长k线数据案例一:超长k线数据测试

    前言 问题一:超长的K线数据有什么用? 以上期所的螺纹钢合约为例,螺纹钢2009年挂牌交易至今,已经有超过10年的历史数据。前8年的历史数据囊括了2009年的急涨急跌行情、2011年的震荡行情、201...