前言
散户眼中的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合约进行算法交易模型回测,回测日志如下: