Советник смешивает ордера на покупку и продажу

 
Здравствуйте,

Я пытаюсь написать советника и в каком-то месте моего кода мне нужно обновить стоплосс открытых и отложенных ордеров. Вывожу оповещение с информацией об ордере.

Когда я запускаю его, я получаю сообщение типа: "Count: 2 Stoploss 1.44705 для ордера на покупку: 46450421 orderType: 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:


Я обновил сообщение.
 

Для начала попробуйте использовать целочисленные представления и запустите тест снова. Посмотрите, решит ли это вашу проблему, а затем мы поговорим об этом подробнее. Edit: Я думаю, это как-то связано с тем, что ordertype будет начинаться с 0. А orderselect будет сохранять последний выбранный заказ на месте.

 
ubzen:

Для начала попробуйте использовать целочисленные представления и запустите тест снова. Посмотрите, решит ли это вашу проблему, а затем мы поговорим об этом подробнее.

Это ничего не изменило. Что я не понимаю, так это то, что в оповещении OrderType() равен 1, что означает, что это ордер на продажу. и это действительно ордер на продажу, но выполняется код ордера на покупку. Я совсем запутался. Я пытался зациклиться, пока OrderSelect(...) не вернет true, как показано в коде выше. Я подумал, что, возможно, он не может выбрать ордер. Но и с ним, и без него все происходит точно так же.
 
ubzen:

Edit: Я думаю, это как-то связано с тем, что ordertype будет начинаться с 0. А orderselect будет сохранять последний выбранный заказ на месте.

Может быть...

Попробуйте объявить orderType как то, чем он не может быть ... например.

int orderType = 10;

... и посмотрите, что произойдет, если вы не получите никаких сообщений, значит ваш выбор ордера не работает.

 
RaptorUK:

Может быть...

Попробуйте объявить orderType как то, чем он не может быть... например.

... и посмотрите, что произойдет, если вы не получите никаких сообщений, значит ваш выбор заказа не работает.


Он работает точно так же, если я сначала объявляю: int orderType = 10;

Я также попробовал использовать OrderType() всегда вместо объявления переменной, но возникла та же проблема.

Я также попытался вызвать OrderSelect(...) непосредственно перед изменением заказа, но никаких изменений.

 
Вы тестируете это в бэк-тестере или в демо-аккаунте?
 
ubzen:
Вы тестируете это в бэк-тестере или на демо-аккаунте?

Я тестирую в реальном времени. Я накладываю советника на график и смотрю, что он делает, и я использую флажок "Запрашивать подтверждение".
 

Добавьте несколько операторов Print();, чтобы вы могли увидеть, что идет не так... например.

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

... затем посмотрите на вкладку "Эксперты".

 
Возможно ли, что проблема возникает из-за использования ручного подтверждения salaires?
Причина обращения: