OnOrder不执行

//------------------------------------------------------------------------ // 简称: zs33_1 // 名称: 小改 // 类别: 公式应用 // 类型: 用户应用 // 测试目的:最多持仓1手;开空最多追单3次,平空不限次数直至成交。防止多次的无谓发单 //------------------------------------------------------------------------ Params Numeric Lots(1);// 交易手数 Vars Series<Numeric> BAR0(0); // BAR索引 Series<Numeric> BarSell(0); // 开仓BAR Series<Numeric> BarE(0); // 平仓BAR Series<Numeric> TickSell(0); // 开仓Tick Series<Numeric> TickExit(0); // 平仓Tick Series<Numeric> StopPrice; //订单变量 Global Array<Integer> Sid;//开仓单号 Global Array<Integer> Eid;//平仓单号 Global Numeric SellJs(0); // 发出开空单计数 Global Numeric ExitJs(0); // 发出平空单计数 Global Numeric HaveS(0); //空单持仓(Position是系统关键字) //Global Numeric CancelS(0);//撤回开空单计数 //Global Numeric CancelE(0);//撤回平仓单计数 Global Numeric MinDiff;////最小变动价/一跳价 //Global Numeric PPP;//基准价 Global Numeric Tick0;//Tick索引 Global Numeric OrderStatuS;//开空单状态 Global Numeric OrderStatuE;//平空单状态 Events OnInit()//策略执行前的初始化事件,只运行一次。/可以订阅数据,数据准备等操作。 { SubscribeTick(Symbol);//订阅TICK行情 HaveS=0; SellJs=0; ExitJs=0; OrderStatuS=5; OrderStatuE=5; } OnReady() { MinDiff=PriceScale*MinMove;//最小变动价/一跳价 } OnOrder(OrderRef Ord)//委托更新事件 { IF (Ord.status==Enum_Filled AND Ord.ORDERID==Sid[0])//开空单已成交 { SellJs=0; // 发出开空单计数 HaveS=1;//持有空单数 OrderStatuS=5;//开空订单状态 Print("开空单已成交,Tick0("+TEXT(Tick0)+")"); } IF (Ord.status==Enum_Declared AND Ord.ORDERID==Sid[0])//开空单已申报(未成交) { OrderStatuS=2; Print("开空单未成交,Tick0("+TEXT(Tick0)+")"); } IF (Ord.status==Enum_Canceled AND Ord.ORDERID==Sid[0])//开空单(已撤单) { OrderStatuS=6; Print("开空单已撤回,Tick0("+TEXT(Tick0)+")"); } //OrderStatuE IF (Ord.status==Enum_Filled AND Ord.ORDERID==Eid[0])//平空单已成交 { ExitJs=0;//发出平空单次数 HaveS=0;//持有空单数 OrderStatuE=5;//平空单状态 Print("平空单已成交,Tick0("+TEXT(Tick0)+")"); } IF (Ord.status==Enum_Declared AND Ord.ORDERID==Eid[0])//平仓单已申报(未成交) { OrderStatuE=2; Print("平空单未成交,Tick0("+TEXT(Tick0)+")"); } IF (Ord.status==Enum_Canceled AND Ord.ORDERID==Eid[0])//平仓单(已撤单) { OrderStatuE=6; Print("平空单已撤回,Tick0("+TEXT(Tick0)+")"); } }//OnOrder OnBarOpen(ArrayRef<Integer> indexs) { Tick0=0; } OnBar(ArrayRef<Integer> indexs) { IF (BarStatus==2) { //开空条件:持有空单数为0(隐含:平空已成)& 开空已成或已撤 &追单不超过3次&准入控制 If(HaveS==0 AND (OrderStatuS==5 OR OrderStatuS==6) AND SellJs<4 And OPEN<=C[1]) { IF (A_SendOrderEx(Enum_Sell,Enum_Entry,Lots,Q_Last+MinDiff*SellJs,Sid ));//开空(市价+点) { BarSell=Bar0; TickSell=Tick0; StopPrice=H[1]; SellJs=SellJs+1; Print("开空单编号="+TEXT(Sid[0])+"/BarSell="+TEXT(BarSell)+"/TickSell="+TEXT(TickSell)); Print("开空单次数="+TEXT(SellJs)); } } IF (OrderStatuS==2 AND (BAR0-BarSell)*120+Tick0-TickSell>10)//撤回开空单 { A_DeleteOrder(Sid[0]); Print("撤回开空单,Tick0("+TEXT(Tick0)+")"); } // 平空条件:持有空单数为1(隐含:开空已成)& 平空已成或已撤 &准入控制 If(HaveS==1 AND (OrderStatuE==5 || OrderStatuE==6) And BAR0>BarSell And H>=StopPrice) { IF (A_SendOrderEx(Enum_BUY,Enum_Exit,Lots,Q_Last-MinDiff*ExitJs,Eid)) { //HaveS=0; BarE=Bar0; TickExit=Tick0; ExitJs=ExitJs+1; Print("平空单编号="+TEXT(Eid[0])+"/BarE="+TEXT(BarE)+"/TickExit="+TEXT(TickExit)+"HaveS="+TEXT(HaveS)); Print("平空单次数="+TEXT(ExitJs)); } } IF (OrderStatuE==2 And (BAR0-BarE)*120+Tick0-TickExit>10)//撤回平空单 { A_DeleteOrder(Eid[0]); Print("撤回平空单,Tick0("+TEXT(Tick0)+")"); } Tick0=Tick0+1; Print("Tick索引="+TEXT(Tick0)+"持空仓量="+TEXT(HaveS)); }// IF (BarSelltatus==2) } 以上是一个测试程序, 测试目的:最多持仓1手;开空最多追单3次,平空不限次数直至成交。防止多次的无谓发单感觉ONORDER域没有执行,以下是我刚实盘运行的情况:ONORDER的PRINT内容无输出请老师帮我看下,难道是我的逻辑本身有问题?不胜感激!!!

你要证明onorder没有触发onorder { print("你好"); }而不是先扔一堆东西进去

我感觉你逻辑是混乱的。你的所有print,都是写在onorder域的if分支结构下,换句话说,如果要print显示内容,不仅要驱动onorder域,还得满足你至少一个分支条件,才有print输出。你因为这个就断定是onorder域没有执行吗?是不是起码在onorder的主结构中写一个print看看到底是onorder没有执行还是没进if分支结构?

回复:好的,我加一行测试onorder,麻烦看下我的逻辑问题(自我感觉很简单的逻辑,就是不知道哪里问题),不胜感激!!!

回复:我加一行测试onorder,重新运行。有成交单,但仍不显示测试行,感觉还是没有进onorder

回复:你的脸为什么是黄的要绿的才是进入了交易的

回复:运行之后暂停策略,之后截图的

回复:运行之后暂停策略,之后截图的

回复:ONBAR域有输出成交时间的

回复:ONBAR域有输出成交时间的

回复:我试了 order域没有问题的你把你if里的条件挨个打印一下bool看看我试了两个 都是false

回复:哦 我没开交易,开了就可以了,Onorder输出没有问题的,是你其他逻辑的问题

回复:很棒,我还没来得及测试