int start() { int rc = GetLastError(); if (rc != ERR_NO_ERROR) { /* Runtime errors like zero divide */ printError("Occured in previous tick", rc); } /* Rest of the handler */ }
Дело не в том как её вывасти, дело в том как её обойти эту ошибку,
тестер вспотыкается и тестирование прекращается.
В моем примере обработчик выводит сообщение в лог. Ничто не мешает обрабатывать любым другим способом.
Не вполне ясно, что значит обойти. Ошибку можно исправить, чему очень может помочь подробная трассировка.
И всетаки нашел.
Есть такой индикатор WPR (Williams’ Percent Range, %R), формула расчёта, согласно описанию на сайте
%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100
Так вот просто начинаем подставлять значения те которые сделают ошибку деления на ноль
double dMaxHigh=High[iHighest(NULL,0,MODE_HIGH,14,1)];
double dMinLow=Low[iLowest(NULL,0,MODE_LOW,14,1)];
ExtWPRBuffer[i]=-100*(dMaxHigh-Close[i])/(dMaxHigh-dMinLow);
Подставим цифры которые вполне могут встретиться в рынке
double dMaxHigh=1,2860
double dMinLow=1,2860
ExtWPRBuffer[i]=-100*(1,2860-1,2860)/(1,2860-1,2860);
Собственно деление на ноль мы получили и тестер выдав эту ошибку
дальше тестировать не хочит.
А ситуация возникает на открытии бара. Когда залотав все дыры
в истории с помощью скрипта мы получаем равенство High = Low.
Допускаем такой момент, что дырка в истории у нас как раз имеет
размер в 14 баров. И вот на этих 14 барах и вспотыкается тестер.
Каким образом не допускать эту ошибку, когда хочится что-бы
дыр в истории небыло, ну и естественно расчёт по формуле шел.
Пол ночи искал какой пример привести для полного понимания.
И всетаки нашел.
Есть такой индикатор WPR (Williams’ Percent Range, %R), формула расчёта, согласно описанию на сайте
%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100
Так вот просто начинаем подставлять значения те которые сделают ошибку деления на ноль
Каким образом не допускать эту ошибку, когда хочится что-бы
дыр в истории небыло, ну и естественно расчёт по формуле шел.
Все очень просто:
- формула для людей, а не для компьютера
- всегда и во всех языках нужно проверять делитель на ноль перед
делением
Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.
Все очень просто:
- формула для людей, а не для компьютера
- всегда и во всех языках нужно проверять делитель на ноль перед
делением
Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.
Так что мне то делать есть выход из этой ситуации?
Отслеживаете Вы в программе деление на ноль, это правильно. Вот то что останавливаете не очень одыкватно при таких ситуациях.
Самое что интересное индикатор же не останавливает свой расчёт, а расчитавыет далее переходя к новому бару.
double dMaxHigh=High[iHighest(NULL,0,MODE_HIGH,14,1)]; double dMinLow=Low[iLowest(NULL,0,MODE_LOW,14,1)]; if ( MathAbs(dMaxHigh-dMinLow) < Point ) ExtWPRBuffer[i]=-100*(dMaxHigh-Close[i])/Point; else ExtWPRBuffer[i]=-100*(dMaxHigh-Close[i])/(dMaxHigh-dMinLow);
Все очень просто:
- формула для людей, а не для компьютера
- всегда и во всех языках нужно проверять делитель на ноль перед
делением
Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.
Так что мне то делать есть выход из этой ситуации?
Отслеживаете Вы в программе деление на ноль, это правильно. Вот то что останавливаете не очень одыкватно при таких ситуациях.
Самое что интересное индикатор же не останавливает свой расчёт, а расчитавыет далее переходя к новому бару.
Я третий раз повторяю: "проверять всегда и везде все делители самостоятельно". Странно, что программист не понимает таких базовых вещей.
Извините за назойливость, я новичок в программировании, вы не могли бы разъяснить метод поиска и исправления ошибки "zero divide" через линейную логику, очень сложно использовать метафизику, на начальной стадии развития.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как обработать такую ошибку?