主连合约888用A_DeleteOrder撤单不成功

实验代码如下: Params //此处添加参数 Vars //此处添加变量 Global Integer Ordered; Global Integer OrderId; Global String gMapSymbol; Defs //此处添加公式函数 Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次 OnInit() { } OnReady() { Array<String> Symbols; GetLayerOrderMapSymbols(Symbols); gMapSymbol = Symbols[0]; } OnTimer(Integer id,Integer millsecs) { Bool Ret = A_DeleteOrder(OrderId); FileAppend("C:\\debug.txt", Text(SystemDateTime) + gMapSymbol + " ====delet:OrderId:" + Text(OrderId) + ",Ret:" + IIFString(Ret, "True", "False")); } //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { If(Ordered == 0) { Ordered = 1; Array<Integer> OrderIds; A_SendOrderEx(gMapSymbol, Enum_Buy, Enum_Entry, 2, 0, OrderIds); OrderId = OrderIds[0]; FileAppend("C:\\debug.txt", Text(SystemDateTime) + gMapSymbol + " ==== OrderId:" + Text(OrderId)); CreateTimer(5000, 0, 1); } } 现象:映射主力合约,下单能成功,5S后撤单不成功(但是Ret的值照样为True)。如果直接加载在具体合约上,撤单成功。 问题:系统是不是要加一个函数对具体合约撤单,把gMapSymbol传进去。

A_DeleteOrderEx 用报单索引来撤单,这样精确。 用symbol来撤单是很危险的,如果多策略组合交易,撤到别的策略下的单子就不可控了

回复:确实换成A_DeleteOrderEx就可以了。

你如果用a函数这种订单管理的系统就不要用软件的映射功能了,映射功能是专门为图表系统制作的功能,a函数可以自由报单,不需要这个功能,容易出错

回复:需要的,图表中用Buy(lots, theoryprc, Enum_Signal_NotSend);记录信号,实际发单用A函数。 既然有对具体合约的开单:A_SendOrderEx(gMapSymbol, Enum_Buy, Enum_Entry, KaiVol, OrderPrc, OrderIds); 应该就有对应的对具体合约的撤单:A_DeleteOrder(gMapSymbol,OrderId); 如果目前没有,可不可以提这样的需求?

回复:可以做到的,只是你这个orderid太片面了,而且容易被污染. 你应该先查找所有的未成交的委托订单,然后遍历所有订单匹配合约,最后删除超时挂单 以下是我自己写的超时撤单函数:大家相互交流 Params String Sym; Numeric Times; Vars Order MyOrd; Array<Integer> ordID; Integer i; Begin If(A_GetUnFillOrderIDs(Sym,ordID)) { For i=0 to GetArraySize(ordID)-1 { If(A_GetOrder(ordID[i],MyOrd)) { If(DateTimeDiff(MyOrd.createDateTime,CurrentDate+currentTime)>Times) { A_DeleteOrderEx(ordID[i]); } } } If(GetArraySize(ordID)>0)Return True; } Return False; End