Форум трейдеров » Торговые роботы, советники, индикаторы » Как правильно сравнивать числа с плавающей запятой.
+ Подписаться
  1. 933
    Комментарии
    13
    Темы
    938
    Репутация Pro
    Аватар для loewe  
    Клиент WHC

    4 Медалей

    Как правильно сравнивать числа с плавающей запятой.

    Я, предположительно, понял причину несрабатывания ордеров.
    Ордера не срабатывают только если цена ТОЧНО доходила до уровня и не пересекала его.
    В эксперте производится сравнение
    Ask <= orderBUYSTOP_Price
    где orderBUYSTOP_Price цена открытия (например, 4508.5)
    Когда Ask достигает 4508.5 равенства НЕ НАСТУПАЕТ из-за проблемы представления чисел с плавающей запятой в памяти.
    Как корректно исправить эксперт, чтобы этого не происходило пока не знаю (может кто подскажет).
    Или NormalizeDouble использовать,
    или CompareDoubles из (#include <stdlib.mqh>), разбив <= на < и = (CompareDoubles).
    Есть у кого-нибудь элегантное решение?

    Заранее спасибо.
    Недоступно! Pro 0
    Поделиться
    Просмотров: 3,990
  2. 513
    Комментарии
    7
    Темы
    514
    Репутация Pro
    Аватар для MOHCTP  
    В начале пути

    3 Медалей
    умножить 4508.5 на 10 и округлить к целому, потом уже сравнивать целые числа
  3. 933
    Комментарии
    13
    Темы
    938
    Репутация Pro
    Аватар для loewe  
    Клиент WHC

    4 Медалей
    Цитата Сообщение от MOHCTP Посмотреть сообщение
    умножить 4508.5 на 10 и округлить к целому, потом уже сравнивать целые числа
    Спасибо за совет.
    В чем Вы видите преимущество Вашего способа перед NormalizeDoublе?
    Есть оператор
    Ask <= orderBUYSTOP_Price
    его надо сделать 100% работающим.
    При Вашем способе надо будет вводить дополнительно целые переменные и производить каждый раз пересчет.

    Будет ли надежно работать
    NormalizeDoublе(Ask, 1) <= NormalizeDoublе(orderBUYSTOP_Price, 2)?
  4. 513
    Комментарии
    7
    Темы
    514
    Репутация Pro
    Аватар для MOHCTP  
    В начале пути

    3 Медалей
    сами же говорите, что проблема при сравнении двух одинаковых double числел
    так сравнивайте целые, там таких проблем нет
    надёжно ли работает NormalizeDouble, я не знаю, это к разработчикам
    если лень делать каждый раз пересчёт - сделайте отдельную функцию
  5. 339
    Комментарии
    22
    Темы
    341
    Репутация Pro
    Аватар для Andrey4-min  
    В начале пути

    4 Медалей
    Цитата Сообщение от loewe Посмотреть сообщение
    Спасибо за совет.
    В чем Вы видите преимущество Вашего способа перед NormalizeDoublе?
    Есть оператор
    Ask <= orderBUYSTOP_Price
    его надо сделать 100% работающим.
    При Вашем способе надо будет вводить дополнительно целые переменные и производить каждый раз пересчет.

    Будет ли надежно работать
    NormalizeDoublе(Ask, 1) <= NormalizeDoublе(orderBUYSTOP_Price, 2)?
    Сделайте вот так:

    NormalizeDoublе(Ask, Digits) <= NormalizeDoublе(orderBUYSTOP_Price, Digits)

    Digits - количество цифр после десятичной точки в цене текущего инструмента.

    Всё будет работать как надо...
  6. 933
    Комментарии
    13
    Темы
    938
    Репутация Pro
    Аватар для loewe  
    Клиент WHC

    4 Медалей
    Цитата Сообщение от MOHCTP Посмотреть сообщение
    ...сделайте отдельную функцию
    Хорошая мысль.
    Например, так:

    d2i(Ask) <= d2i(orderBUYSTOP_Price)

    int d2i(double pD){
    double koef = 1.0;
    switch (Digits){
    case 5:
    koef *= 10.0;
    case 4:
    koef *= 10.0;
    case 3:
    koef *= 10.0;
    case 2:
    koef *= 10.0;
    case 1:
    koef *= 10.0;
    }
    int ret = pD * koef;
    return (ret);
    }
  7. 1,401
    Комментарии
    13
    Темы
    1409
    Репутация Pro
    Аватар для Karakurt  
    Мастер форумных наук

    5 Медалей
    Ответ очень простой: не надо использовать равенство при сравнении чисел с плавающей запятой. Используйте только неравенство.

    А NormalizeDoublе() использовать никогда не повредит. Особенно при вычисляемой цене.
  8. 933
    Комментарии
    13
    Темы
    938
    Репутация Pro
    Аватар для loewe  
    Клиент WHC

    4 Медалей
    Цитата Сообщение от Karakurt Посмотреть сообщение
    ...Используйте только неравенство...
    Отличная мысль.
    Требует, правда, дополнительной работы по правильному вычислению уровней (в существующих советниках).

Вверх
РегистрацияX

чтобы писать, читать, комментировать