Безубыток

 
Привет! Подскажите пожалуйста что я не так делаю, вот код функции безубытка:
void BU(int cmd)
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==Magic1||OrderMagicNumber()==Magic2||OrderMagicNumber()==Magic3||OrderMagicNumber()==Magic4))
           {
            if(OrderType()==cmd)
              {
                  if(cmd==OP_BUY&&(Ask-OrderOpenPrice())<StopLevel)return;
                  if(cmd==OP_SELL&&(OrderOpenPrice()-Bid)<StopLevel)return;
                  if(OrderStopLoss()==OrderOpenPrice())return;
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),0,0))
                 {
                  Print("Order not Breakeven! Error = ",GetLastError());
                 }
              }  
           }
        }
     }
  }
Он работает, но очень часто выдает ошибку 1! Я так понимаю что он пытается повторно выставить стоп лосс по уже существующей цене, но я ведь прописал:
if(OrderStopLoss()==OrderOpenPrice())return;
Почему так происходит?
 
Maksim Neimerik:
Привет! Подскажите пожалуйста что я не так делаю, вот код функции безубытка:Он работает, но очень часто выдает ошибку 1! Я так понимаю что он пытается повторно выставить стоп лосс по уже существующей цене, но я ведь прописал:Почему так происходит?

Старые грабли - сравнение двух вещественных чисел. Либо нормализуйте и сравнивайте, либо сравнивайте разность с какой-то дельтой. Мне больше нравится второй способ, он универсальнее:

if (MathAbs(OrderStopLoss() - OrderOpenPrice()) < Point / 10)
{
  // нельзя модифицировать
}
 
Ihor Herasko:

Старые грабли - сравнение двух вещественных чисел. Либо нормализуйте и сравнивайте, либо сравнивайте разность с какой-то дельтой. Мне больше нравится второй способ, он универсальнее:

Блин, сам не допер)) Спасибо большое!