实验代码如下:
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