Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
WHRoeder: этот код хорош (особенно проверка "добавлено" и "по умолчанию")? Это также может послужить легкой последней ссылкой для тех, кто посетил эту тему и просто перешел на последнюю страницу (как это сделал я)
Этот код не является точным.
Как можно использовать if( !MathAbs( a - b ) > Point/2) для сравнения на равенство? Это скажет вам, что 1.4999 == 1.5000.
if( ! (MathAbs(1.4999 - 1.5000 > 0.00005 )
if( ! (0.0001 > 0.00005 )
if( ! (true )
if( false ) 1.4999 is NOT equal to 1.5000
Я использую
или для двойных значений, которые не являются фактическими ценами, более высокая точность
Сообщение Raptors об этом коде
Так что если вы используете,
Я тестировал этот метод различными способами и не нашел сценария, в котором он не вернул бы ожидаемый или желаемый результат.Окончательный код... Спасибо WHRoeder
И, возможно, вторичная функция для сравнения всех других двойных чисел, которые не являются ценами...
Смотрите также "Справочник MQL4 > Основы языка > Типы данных > Вещественные типы (double, float)" в части использования малого числа для сравнения.
Возможно, кто-то знает, как лучше написать 0.00...1 в expon
Есть еще кое-что интересное, что я нашел, потенциально связанное с "// 0 compare не нуждается в этой функции".
Возможно, это ошибка только в последних версиях, не уверен. Сравнение с 0 больше не работает корректно. Мне пришлось прибегнуть к чему-то недружелюбному, например;
outcome=(int(outcome*100)/100.0); // Разрешение 2 цифры
Только для того, чтобы убедиться, что 0-значения действительно закончились как 0-значения.
WHRoeder, спасибо. Нужно больше исследований :)
Я думаю, что в этой теме слишком много ненужной сложности.
Постарайтесь максимально облегчить жизнь программиста. Напишите определения (или перейдите к методам, если это действительно необходимо) в тех классах, где вам нужны двойные сравнения:
Когда вам нужно сравнить два двойных числа, используйте это в условии, подобном этому:
Если вы хотите проверить, является ли двойка нулем (или очень, очень близка к нулю), используйте условие, подобное этому:
В качестве примечания, поскольку я вижу много сообщений, говорящих о делениях:
При инкапсуляции мы склонны забывать об издержках кода, который "отдан на аутсорсинг" некоторым вспомогательным методам. Напомните себе, чтоделения очень дороги с вычислительной точки зрения! Особенно, когда, завернув их в красивые утилитарные методы где-нибудь в утилитарных классах, мы начинаем использовать их повсюду в индикаторах или советниках и уже давно забыли, какие вычислительные действия они выполняют. При использовании тестера стратегий мы платим за свою неаккуратность большим количеством ненужного времени.
Эмпирическое правило: Сложение и вычитание выполняются гораздо быстрее, чем умножение и деление. Операция деления занимает больше всего времени.Оптимизируйте деление- везде, где это возможно! Если знаменатель фиксированный, как в этом цикле...
то замените знаменатель x на его инвертированное значение 1/x:
Также, если результат деления всегда один и тот же, выполните вычисления один раз и сохраните результат в переменной, чтобы использовать его везде в коде (например, в циклах):
Будьте здоровы,
A.T.