Взрыв мозга!

 

Здравствуйте уважаемые форумчане.

Столкнулся с таким вот глюком... Есть код в котором ясно и чётко прописана что выполнять дальше только при условии

if(OrderType() == OP_BUY || OrderType() == OP_SELL)

После данных строк поставил принт для отладки

Print("OrderType:", OrderType());

После чего с удивлением для себя нахожу в журнале OrderType:2 что в принципе не может быть. Я же поставил исключение такого варианта. Должно быть либо OrderType:0 либо OrderType:1.

Как так то?

Ниже привожу весь код для наглядности...

void Otvetki()
{
   double price;
   for(int i = 0; i<OrdersTotal();i++)
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
   if(OrderSymbol() == Symbol())
   if(OrderMagicNumber() == MAGIC)
   if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
      if(!isSetOrder(OrderStopLoss()))
      { 
         Print("OrderType:",OrderType());
         Print("Ticket:", OrderTicket());
         SetSLTPLOT(OrderLots());
         price = OrderStopLoss();
         if(OrderType() == OP_BUY)   
         {  
            Print("Дошло");
            Log("Событие: Сработала отложка Buy.");
            if(LIMITNIK) OrderSet(OP_BUYLIMIT, LOT, price, price-SL*Point, price+TP*Point, MAGIC, "Ответный");
            else OrderSet(OP_SELLSTOP, LOT, price, price+SL*Point, price-TP*Point, MAGIC, "Ответный");
         }
         if(OrderType() == OP_SELL)
         {
            Log("Событие: Сработала отложка SellLimit");
            if(LIMITNIK) OrderSet(OP_SELLLIMIT, LOT, price, price+SL*Point, price-TP*Point, MAGIC, "Ответный");
            else OrderSet(OP_BUYSTOP, LOT, price, price-SL*Point, price+TP*Point, MAGIC, "Ответный");
         }
      }
   }
}
 

Я бы после цикла for скобки всобачил все-таки... И после каждого if.... и покажите на всяк случай функцию isSetOrder, или попробуйте вывести print до ее вызова

 
bool isSetOrder(double price)
{
   for(int i = 0; i<OrdersTotal();i++)
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
   if(OrderSymbol() == Symbol())
   if(OrderMagicNumber() == MAGIC)
   if(OrderType() > 1)
   {
      if(OrderOpenPrice() == price) return (true);
   }
   return (false);
}

А причем там скобки-то? Синтаксис то правильный!

Всобачил Принт перед isSetOrder. Помогло! Теперь понял в каком направлении надо рыть! Если решу проблему отпишусь обязательно на форум. Но уже сейчас могу сказать что делать цикл в цикле в mql категорически противопоказано если этот цикл подразумевает перебор ордеров.

 
Figar0:

Я бы после цикла for скобки всобачил все-таки... И после каждого if.... и покажите на всяк случай функцию isSetOrder, или попробуйте вывести print до ее вызова


Благодярю за помощь!
 
jhon:

А причем там скобки-то? Синтаксис то правильный!

Всобачил Принт перед isSetOrder. Помогло! Теперь понял в каком направлении надо рыть! Если решу проблему отпишусь обязательно на форум. Но уже сейчас могу сказать что делать цикл в цикле в mql категорически противопоказано если этот цикл подразумевает перебор ордеров.


Ну скобки потому что где-то есть :

   if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   {

где-то нет:

   if(OrderMagicNumber() == MAGIC)
   if(OrderType() == OP_BUY || OrderType() == OP_SELL)

Сложно читать такой код.

А ошибка очевидна. В вызываемой функции запускается еще один перебор ордеров, и выбирается ордер уже другой....

 

Попробуй после вызова:

if(!isSetOrder(OrderStopLoss())) {

опять выбрать ордер:

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

 
jhon:

А причем там скобки-то? Синтаксис то правильный!

Отсутствие скобок может быть синтаксически правильным, но ухудшает читаемость кода. И кроме того, мы же не знаем что там на уме у компилятора. Поэтому скобки лучше ставить даже если после if идёт всего одна команда.