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

//------------------------------------------------------------------------ //仅适用于反手,若信号超过两个以上会出错. 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数据保单的函数,还未完工,不支持锁仓或者开平互转,待更新