A函数撤单问题

Params
    //此处添加参数
    Numeric length1(5);
Vars
    Global Numeric CD(0);
    Global Map<Integer,Order> my_order;
    Series<Numeric> ma5;
Events
    
    OnOrder(OrderRef ord)
    {
        my_order[ord.orderid]=ord;
        If(ord.status == Enum_Declared)
        {
            If(CD==1 Or CD==-1)
            A_DeleteOrderEx(ord.orderid);
        }
    }
        OnBar(ArrayRef<Integer> indexs)
        {
              MA5=Average(Close[1],Length1);
     If (MarketPosition>0 And Close[1]<MA5 )
            {
               CD=1;       
            }
     If( MarketPosition<0 And  Close[1]>MA5  )
            {
               CD=-1;
            }
                }

 

老师,我这样用一个全局变量放到A函数里好像不行,那请问我要写收盘价破5均线就把所有单撤掉,应该怎么写?给我提供个思路也行,谢谢。

这个代码,不知道为什么,一发单立马就被撤了

请教A函数撤单问题
撤单问题
撤单的问题
用A函数撤单问题---
撤单的几个小问题咨询
A函数撤单时,有多个订单同时撤单,出现警告撤单间隔时间少于5秒,如果处理
高频撤单问题
请教A_DeleteOrderEx撤单问题
关于撤单的问题
关于图表交易系统开平仓撤单问题

你这个思路不对

收盘价破5均线的时候,委托单状态又没有发生改变,那就不会驱动onorder域运行,你写在onorder域里的代码就不会执行

先想好你的业务逻辑是什么东西驱动的,这个很关键,每次直播课讲解开发案例的时候我都会强调,这个是最基础的。

你的撤单逻辑是收盘价跌破5均线,这个明显和行情有关,和订单状态无关,所以应该写在行情驱动的事件域里。那么行情驱动三个事件域,onbar,onbaropen,onbarclose,只有onbar,符合你收盘价实时监控的要求,所以肯定是要再onbar里写撤单代码。

接下来处理撤单的业务逻辑,使用a_deleteorder,根据函数说明,需要订单编号。这就要求你在发单的时候就必须记住这个订单的编号。如果你是sendorderex报单,那么执行的时候就会要求记录一个订单号。如果你是用buysell命令,那么就需要在每次出信号的时候去onorder域里等这个信号的报单然后再记录编号,而且注意这个报单不要和其他信号搞混。

总的来说思路就是这样,如果还觉得难以下手,建议再多看几个系统的demo练练手,提升一下开发水平

太感谢了,辛苦老师解答