反手信号,平仓成交后再发开仓单案例

//------------------------------------------------------------------------
//仅适用于反手,若信号超过两个以上会出错.
Params
    Numeric FastLength(5);// 短期指数平均线参数
    Numeric SlowLength(20);// 长期指数平均线参数
Vars
    Series<Numeric> AvgValue1; 
    Series<Numeric> AvgValue2;
    Series<Numeric> cc;
    //订单管理
    global array<integer> orderids;
    global Signal       sig_tp;
Defs
    bool print_signal(signal sig)
    {
        print("-----");
        print("图层:"+text(sig.index));
        print("时间:"+DateTimeToString(sig.datetime));
        If(sig.side == Enum_Buy)
        {
            print("方向:买入");
        }Else
        {
            print("方向:卖出");
        }
        If(sig.comboffset == Enum_Entry)
        {
            print("开平:开仓");
        }Else If(sig.comboffset == Enum_Exit)
        {
            print("开平:平仓");
        }Else
        {
            print("开平:平今");
        }
        print("价格:"+text(sig.price));
        print("数量:"+text(sig.volume));
        print("操作源:"+sig.createsource);
        If(sig.flag == Enum_Signal_History)
        {
            print("flag:历史");
        }Else If(sig.flag == Enum_Signal_NotSend) 
        {
            print("flag:不发");
        }else
        {
            print("flag:不矫正");
        }   
        return true;
    }
       
    Bool A_SendOrderEx_signal(signal sig,ArrayRef<Integer> orderid,integer status=0,bool price_off_sw = False,integer price_offset=1)
    {
        //status:1-开平互转 2-净头寸 待完成
        //price_off_sw true:开启委托偏移 
        //price_offset 委托偏移跳数,不开启无效 
        numeric price;
        If(price_off_sw)
        {
            If(sig.side == Enum_Buy)
            {
                price = Q_AskPrice + price_offset * MinMove * PriceScale;
            }
            Else
                price = Q_bidprice - price_offset * MinMove * PriceScale;
        }
        If(status == 1)
        {
            //开平互转待处理
            return A_SendOrderex(data[sig.index].Symbol, sig.side, sig.comboffset, sig.volume, sig.price, orderid);
        }Else If(status == 2)
        {
            //净头寸待处理
            return A_SendOrderex(data[sig.index].Symbol, sig.side, sig.comboffset, sig.volume, sig.price, orderid);
        }Else return A_SendOrderex(data[sig.index].Symbol, sig.side, sig.comboffset, sig.volume, sig.price, orderid);
    }
Events
    OnReady()
    {
        PrintClear;
    }
    OnBar(ArrayRef<Integer> indexs)
    {
        If(IsTradeEnabled)//自动交易
        {
            if(close[1] > open[1] and MarketPosition<>1)
            {
                Buy(1, open);
            }
    
            If(close[1] < open[1] and MarketPosition<> -1)
            {
                SellShort(1, open);
            }
        }
    }
    OnSignal(ArrayRef<Signal> signals)
    {
        print("***signal***");
        Array<Integer> orderid;
        numeric i;
        numeric size;
        size = GetArraySize(signals);
        for i = 0 to size -1 
        {
                print_signal(signals[0]);
        }
        If(signals[0].flag ==0 and  size == 2 and signals[0].comboffset <> Enum_Entry and signals[1].comboffset == Enum_Entry)
        {
            A_SendOrderEx_signal(signals[0], orderids);
            sig_tp = signals[1];
        }Else
        {
            A_SendOrderEx_signal(signals[0], orderid);
        }
        
    }
    OnFill(FillRef ordFill)
    {
        print("***fill***");
        If(ordfill.volume == ordfill.fillVolume and ordfill.orderId == orderids[0])//平仓单已全部成交
        {
            Array<Integer> orderid;
            A_SendOrderEx_signal(sig_tp, orderid);//报开仓单
        }
    }

实测效果

onbar部分的信号逻辑是全部可以自行替换的,模板里纯粹是为了测试方便,没有任何交易逻辑,勿莽撞实盘。

自定义函数部分的根据signal数据保单的函数,还未完工,不支持锁仓或者开平互转,待更新

请问老师,如何实现反手的同步逻辑,而避免平仓单没有成交,就又开反向仓
交易助手对于图表信号产生的“部分成交”委托单的平仓单无能为力?
A_OpenOrderEntryOrExit:未成交的平仓单取值问题
为什么相同条件,平仓后不能反手开仓?
只对未成交的平仓单进行撤单
平仓延迟反手
有请大神写段代码:平仓单未成交,每10秒撤回重新提交,直到成交为止,谢谢!
开仓后没有信号
反手延时开仓
平仓反手策略为什么只平仓不反手