全部 TBQuant功能 TBL语言 TB开户 问答专区 其他
主连合约888用A_DeleteOrder撤单不成功
2022-04-20 15:24

实验代码如下:
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传进去。

 

下一篇: 信号闪烁问题
kyover

A_DeleteOrderEx 用报单索引来撤单,这样精确。

用symbol来撤单是很危险的,如果多策略组合交易,撤到别的策略下的单子就不可控了

2022-04-21 07:47
superfafa
@kyover

确实换成A_DeleteOrderEx就可以了。

2022-04-21 15:30
kyover

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

2022-04-20 15:44
superfafa
@kyover

需要的,图表中用Buy(lots, theoryprc, Enum_Signal_NotSend);记录信号,实际发单用A函数。

既然有对具体合约的开单:A_SendOrderEx(gMapSymbol, Enum_Buy, Enum_Entry, KaiVol, OrderPrc, OrderIds);

应该就有对应的对具体合约的撤单:A_DeleteOrder(gMapSymbol,OrderId);

如果目前没有,可不可以提这样的需求?

2022-04-20 18:41
m29098980
@superfafa

可以做到的,只是你这个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

2022-05-22 21:19
您未登录,请先 登录注册 后发表评论
顶部