Может кто-то знает в чем проблема

 

есть такой if

               if(OrderStopLoss()!= OrderOpenPrice())
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Aqua);
                  Alert("OrderStopLoss = " + OrderStopLoss() + "   OrderOpenPrice() = " + OrderOpenPrice());
               }

 после тестирование в журнале куча ошибок

не могу понять, почему он срабатывает, когда OrderStopLoss() и OrderOpenPrice() равны 

  

 

потому что нужно нормализовать данные. в мт4 - такая фишка с даблами. вроде бы и 1,11695 а там скрывается червь в 1,11695000000042

 

  if(NormalizeDouble(OrderStopLoss(),Digits)!= NormalizeDouble(OrderOpenPrice(),Digits))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Aqua);
                  Alert("OrderStopLoss = " + OrderStopLoss() + "   OrderOpenPrice() = " + OrderOpenPrice());
               }
 
Ты устанавливаешь новый стоплосс на место открытия ордера, а где в этот момент текущая цена?
 
Vladislav Andruschenko:

потому что нужно нормализовать данные. в мт4 - такая фишка с даблами. вроде бы и 1,11695 а там скрывается червь в 1,11695000000042

 

такая фишка во всех языках программирования.

так что, нельзя сравнивать double переменные вот так прямо используя просто == , !=

попробуй сделай вот так

if(MathAbs(OrderStopLoss() - OrderOpenPrice()) < 0.00000001)
 
Stanislav Aksenov:

такая фишка во всех языках программирования.

так что, нельзя сравнивать double переменные вот так прямо используя просто == , !=

попробуй сделай вот так

Что могут быть не желаемые результаты при сравнении ненормализованных (или нормализованных до сравнения) double переменных напрямую через ==, !=, < и тому подобное - эт точно, убеждалась на практике.

Но помимо способа сравнения разницы между двумя числами типа double с какой-то малой величиной (по этому способу у меня практического опыта практически нет и поэтому ничего говорить не буду, но согласно Справки, да, он один из рекомендованных), другой обозначенный в Справке способ: сравнение нормализованной в выражении if разницы double переменных с нулевым значением, хороший вариант, имхо, как далеко не раз и не один год убеждалась практически.

Имею в виду сравнение по принципу, подобному как в библиотеке stdlib.mq4 в MetaEditor:

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }

Само собой разумеется, подразумеваю при этом не обязательно обращение к этой или подобной функции, а именно принцип построения в выражении if, когда именно там нормализованная разница чисел типа double, сравнивается (==, !=, < и тому подобное) с нулевым значением. При этом разница между числами типа double может быть вычислена ещё до указания в выражении, но в выражении if при сравнении полученной ранее разницы с нулевым значением, всё равно нужна её нормализация. Как-то так, если кратко.

 
Dina Paches:


Само собой разумеется, подразумеваю при этом не обязательно обращение к этой или подобной функции, а именно принцип построения в выражении if, когда именно там нормализованная разница чисел типа double сравнивается с нулевым значением.

Именно там?

Солнце мое, иди спатки... 

 
Алексей Тарабанов:

Именно там?

Солнце мое, иди спатки... 

Я ещё заявки в Сервисдеск не дописала. Одну новую сегодня отправила. Осталось ещё две.

А так, да, нормализация не только в if не лишней может быть, не спорю с вами. Как и не оспариваю, что нормализация в выражении if - это только в выражении if нормализация. Как-то так.

Там в посте в привязке к сравнению кратко просто написала.

 
Красивая женщина - выспавшеяся женщина. 
 
Алексей Тарабанов:
Красивая женщина - выспавшееся женщина. 

И это верно.

 
Ты очень красива... 
 
Алексей Тарабанов:
Ты очень красива... 

Спасибо.

Алексей, я сейчас отойду от темы. Заявки надо дописать. Потом подремлю какое-то время, а далее решать свои насущные вопросы.

Всего доброго вам. И спокойного доброго сна, если ещё не ложились.