EA混合买入和卖出订单

 
你好。

我试图编写一个EA的代码,在我的代码中的某些地方,我必须更新已建和待建订单 的止损。我显示了一个关于订单信息的警报。

当我运行它时,我收到一个消息:"计数。2 买入订单的止损为1.44705。46450421订单类型。1".

orderType:1意味着订单46450421是一个OP_SELL订单,它确实是,但为什么它触发测试 "if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) "而不是 "if ((orderType == OP_SELL || orderType == OP_SELLSTOP))"?

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();
      if(/*OrderMagicNumber()==Magic &&*/ OrderSymbol()==Symbol())
      {      
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {
            if (!(isSLinTheZone && areBuyOrdersInProfitAt(NormalizeDouble(Low[1] - NbPipsTolerance*Point*10,Digits))))
               if (NormalizeDouble(OrderStopLoss(), Digits) != longSL) { 
                  if (Debug) {
                     Alert("LongSL: " + longSL);
                     Alert("Order SL: " + NormalizeDouble(OrderStopLoss(), Digits));
                     Alert("Modif required");
                     Alert("Count: " + cnt + " Stoploss " + longSL + " for buy order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), longSL, OrderTakeProfit(),0, Yellow);
                  //cnt = total-1;
               }
         }
         
         if ((orderType == OP_SELL || orderType == OP_SELLSTOP)) { 
            if (!(isSLinTheZone && areSellOrdersInProfitAt(NormalizeDouble(High[1] + NbPipsTolerance*Point*10 + Spread*Point*10,Digits))))
               if (NormalizeDouble(OrderStopLoss(), Digits) != shortSL) { 
                  if (Debug) {
                     Alert("ShortSL: " + shortSL);
                     Alert("Order SL: " + NormalizeDouble(OrderStopLoss(), Digits));
                     Alert("Modif required");
                     Alert("Count: " + cnt + " Stoploss " + shortSL + " for sell order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), shortSL, OrderTakeProfit(),0, Yellow);
                  //cnt = total-1; 
               }
         }   
      } // end of if
   } // end of for


请帮助 :-)

丹尼尔
 

 
ubzen:


我已经更新了这个帖子。
 

对于初学者来说,尝试使用整数表示法并再次运行测试。看看这是否能解决你的问题,然后我们再来讨论一下。编辑:我认为这与ordertype将从0开始的事实有关,而orderselect将保持最后选择的订单 的位置。

 
ubzen:

对于初学者来说,尝试使用整数表示法并再次运行测试。看看这是否解决了你的问题,然后我们再讨论一下。

这并没有改变什么。我不明白的是,在警报信息中,OrderType()等于1,这意味着它是一个卖单。而它确实是一个卖单,但买单的代码被执行。我真的很迷茫。我试着循环,直到OrderSelect(...)返回true,正如上面的代码中出现的那样。我想也许它不能选择订单。但不管有没有,它的效果都是一样的。
 
ubzen:

编辑:我认为这与ordertype将从0开始的事实有关,而orderselect将保持最后选择的订单的位置。

可能是......。

试着将orderType 声明为它不可能是的东西。

int orderType = 10;

. . . . 然后看看会发生什么,如果你没有得到任何信息,那么你的订单选择 就不工作了。

 
RaptorUK:

可能是......。

试着把orderType 声明为它不可能是的东西

......然后看看会发生什么,如果你没有得到任何信息,那么你的订单选择就不工作了。


如果我首先声明:int orderType = 10,它的工作原理完全一样。

我也试过总是使用OrderType()而不是声明一个变量,但也有同样的问题。

我还试着在修改订单之前调用OrderSelect(...),但没有变化。

 
你是在后台测试器中测试的还是在演示账户中测试的?
 
ubzen:
你是在后台测试器还是在演示账户中测试?

我是在现场测试。我把EA放在图表上,看它做什么,我使用 "要求确认"复选框
 

添加一些Print();语句,这样你就可以看到哪里出了问题。

if(/*OrderMagicNumber()==Magic &&*/ OrderSymbol()==Symbol())
      {      
         Print("orderType = ",orderType);
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {

. . . . 然后在专家选项卡中看一下。

 
是否有可能问题来自于使用salaires的手动确认?