Ошибки, баги, вопросы - страница 2821
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да вроде тут дело не в функции, а в том, что константы не нормализуются компилятором (хотя следовало бы).
Тогда одни те же константы в DLL и MQL будут не совпадать.
Тогда одни те же константы в DLL и MQL будут не совпадать.
Тоже верно. Да и к тому же любая нормализация - это потеря точности, поэтому я пожалуй погорячился с нормализацией констант.
Просто подправить текущий алгоритм нормализации.
Просто подправить текущий алгоритм нормализации.
даже не знаю, является ли это ошибкой алгоритма.
Только округление не через штатные round(), ceil(), floor() т.к. они тоже возвращают double.Действительно, нельзя сравнивать double. Просто жёсткое правило.
Или, как говорит Слава, через эпсилон или через умножение (например на 1/_Point) с преобразованием в int c округлением.
А через эти, тем более они работают быстрее штатных:
Проще и быстрее, конечно же, через эпсилон:
Только округление не через штатные round(), ceil(), floor() т.к. они тоже возвращают double.
А через эти, тем более они работают быстрее штатных:
Может и быстрее, да только неправильнее.
Вы то сами пробовали?
Попробуйте:
Выход:
должно быть 12346, т.к. это ceil ("Возвращает ближайшее сверху целое числовое значение.")в первом случае получается 12345, т.к. значимых цифр в типе double 17, а у вас 18
Действительно, нельзя сравнивать double. Просто жёсткое правило.
Конечно, можно и иногда даже нужно сравнивать double напрямую между собой.
Например, при Оптимизации OnTick вызывается иногда триллион раз. Штатный Тестер для того, чтобы понять, исполнять висящий лимитник или нет, делает сравнение текущей соответствующей цены символа и цены лимитника. Делает это для каждой отложки перед каждым OnTick вызовом. Т.е. таких проверок делается десятки и сотни миллиардов раз.
И делается это каждый раз через нормализацию. Так вот - это жуткое расходование вычислительных ресурсов впустую. Т.к. цены и отложенных ордеров и символа предварительно нормализованы. Поэтому могут и должны сравниваться между собой напрямую.
Не на ровном месте MQL-кастомный Тестер уделывает нативный штатный Тестер по производительности.
fxsaber:
Конечно, можно и иногда даже нужно сравнивать double напрямую между собой.
Например, при Оптимизации OnTick вызывается иногда триллион раз. Штатный Тестер для того, чтобы понять, исполнять висящий лимитник или нет, делает сравнение текущей соответствующей цены символа и цены лимитника. Делает это для каждой отложки перед каждым OnTick вызовом. Т.е. таких проверок делается десятки и сотни миллиардов раз.
И делается это каждый раз через нормализацию. Так вот - это жуткое расходование вычислительных ресурсов впустую. Т.к. цены и отложенных ордеров и символа предварительно нормализованы. Поэтому могут и должны сравниваться между собой напрямую.
Не на ровном месте MQL-кастомный Тестер уделывает нативный штатный Тестер по производительности.
NormalizeDouble() очень дорогая функция. Поэтому про нее лучше забыть.
Вот скрипт, который демонстрирует разницу между NormalizeDouble() и нормализацию с помощью int:
результат:
ЗЫ причем нормализация через int получается еще и точнее (это можно увидеть по количеству девяток после последней цифры нормализации - выделено синим.)NormalizeDouble() очень дорогая функция. Поэтому про нее лучше забыть.
Вот скрипт, который демонстрирует разницу между NormalizeDouble() и нормализацию с помощью int:
результат:
ЗЫ причем нормализация через int получается еще и точнее (это можно увидеть по количеству девяток после последней цифры нормализации - выделено синим.)а если суммировать не через double, а через long, тогда результат еще более впечатляет, т.к. суммирование через int (умножение и округление с последующим делением итоговой суммы) вычесляется быстрее обычной суммы double.
результат:
а если суммировать не через double, а через long, тогда результат еще более впечатляет, т.к. суммирование через int (умножение и округление с последующим делением итоговой суммы) вычесляется быстрее обычной суммы double.
результат:
Decimal для сравнения добавьте.
Ошибся ссылкой, там не полная реализация.