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...