模型满足开仓条件发出委托信号后,因行情变动快,加之下单手数多等原因,可能无法快速成交。通过加载追价算法交易模型,可及时将没有成交的部分进行自动撤单,然后自动按照编写的价格方式重新发出委托,如果出现价差过大或长时间无法成交等情况则放弃本次交易。源码如下:
//追价示例 Data data0:"m1709"; Vars Numeric N;//下单手数 Numeric T; //时间间隔 Numeric KC; //开仓条件 Numeric NOW; //当前时间 Global_Numeric BKID; //买开委托 Global_Numeric BKFLG; //买开标志 Global_Numeric BKDEL; //买开撤单标志 Global_Numeric BKM; //买开委托手数 Global_Numeric BKT; //买开委托发出时间 Begin //----------------------变量赋值--------------------// N = 2; //下单手数 T = 3; //时间间隔 KC = 1; //开仓条件设为1 NOW = CurrentTime(); //当前时间 //----------------------成交判断--------------------// If(BKFLG == 1) //如果有买开委托 { If(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交 { Commentary("【做多:买开委托成交!】"); BKFLG = 0; //买开标志归0 BKDEL = 0; //买开撤单标志归0 } Else If(F_OrderStatus(BKID) == Enum_Canceled) //如果买开委托被撤单 { If(F_OrderFilledLot(BKID) > 0) //如果买开委托部分成交 { BKM = BKM - F_OrderFilledLot(BKID); //买开委托手数自减成交手数 } If(BKM > 0) //如果买开委托手数大于0 { Commentary("【做多:买开委托追价!】"); BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,Price("Ask1")); //以对价发出买开委托手数的买开委托 BKT = NOW; //买开委托发出时间设为当前时间 } BKDEL = 0; //买开撤单标志归0 } Else If(F_OrderStatus(BKID) == Enum_Declared || F_OrderStatus(BKID) == Enum_FillPart) //如果买开委托全部挂单或部分成交 { If(TimeDiff(BKT,NOW) > T && BKDEL == 0) //如果时间间隔T秒,且未撤单 { Commentary("【做多:买开委托撤单!】"); F_DeleteOrder(F_OrderContractNo(BKID)); //撤掉买开委托挂单 BKDEL = 1; //已发出撤掉买开委托挂单 } } } //----------------------委托处理--------------------// If(BKFLG == 0) //如果没有买开委托 { If(KC == 1) //如果满足开仓条件 { Commentary("【做多:买开委托发出!】"); BKM = N; //买开委托手数设为N手 BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,Price("Bid1")); //以排队价发出买开委托手数的买开委托 BKT = NOW; //买开委托发出时间设为当前时间 BKFLG = 1; //已发出买开委托 } } End
算法交易模型执行效果如下图所示,在第一次委托没有成交时,算法交易模型对委托进行了撤单,撤单后重新追价,确保了委托的成交。
