Скачать MetaTrader 5

zero divide

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nefedov Kirill
2899
Nefedov Kirill  

Как обработать такую ошибку?

Glaswegian
485
Glaswegian  
LastError сохраняет значение между вызовами start()

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 */
}
Nefedov Kirill
2899
Nefedov Kirill  

Дело не в том как её вывасти, дело в том как её обойти эту ошибку, тестер вспотыкается и тестирование прекращается.

Glaswegian
485
Glaswegian  
Вы спрашивали, как обработать ошибку. Про тестер тоже трудно было догадаться.
В моем примере обработчик выводит сообщение в лог. Ничто не мешает обрабатывать любым другим способом.
Не вполне ясно, что значит обойти. Ошибку можно исправить, чему очень может помочь подробная трассировка.
MetaQuotes
Админ
26090
Renat Fatkhullin  
Чтобы избежать ошибки (это ошибка самого программиста) деления на ноль, надо (в любом языке) перед любым делением гарантированно проверять делитель на равенство нулю.
Nefedov Kirill
2899
Nefedov Kirill  
Пол ночи искал какой пример привести для полного понимания.
И всетаки нашел.
Есть такой индикатор 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 барах и вспотыкается тестер.

Каким образом не допускать эту ошибку, когда хочится что-бы дыр в истории небыло, ну и естественно расчёт по формуле шел.

MetaQuotes
Админ
26090
Renat Fatkhullin  
HIDDEN:
Пол ночи искал какой пример привести для полного понимания.
И всетаки нашел.
Есть такой индикатор WPR (Williams’ Percent Range, %R), формула расчёта, согласно описанию на сайте
%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100
Так вот просто начинаем подставлять значения те которые сделают ошибку деления на ноль


Каким образом не допускать эту ошибку, когда хочится что-бы дыр в истории небыло, ну и естественно расчёт по формуле шел.


Все очень просто:
  1. формула для людей, а не для компьютера
  2. всегда и во всех языках нужно проверять делитель на ноль перед делением
У нас везде есть проверки всех делителей на ноль. Это нормальная практика в программировании.

Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.
Nefedov Kirill
2899
Nefedov Kirill  
Renat писал (а):

Все очень просто:
  1. формула для людей, а не для компьютера
  2. всегда и во всех языках нужно проверять делитель на ноль перед делением
У нас везде есть проверки всех делителей на ноль. Это нормальная практика в программировании.

Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.

Так что мне то делать есть выход из этой ситуации?
Отслеживаете Вы в программе деление на ноль, это правильно. Вот то что останавливаете не очень одыкватно при таких ситуациях.
Самое что интересное индикатор же не останавливает свой расчёт, а расчитавыет далее переходя к новому бару.
Andrey Khatimlianskii
59288
Andrey Khatimlianskii  
      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);
MetaQuotes
Админ
26090
Renat Fatkhullin  
HIDDEN:
Renat писал (а):

Все очень просто:
  1. формула для людей, а не для компьютера
  2. всегда и во всех языках нужно проверять делитель на ноль перед делением
У нас везде есть проверки всех делителей на ноль. Это нормальная практика в программировании.

Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.

Так что мне то делать есть выход из этой ситуации?
Отслеживаете Вы в программе деление на ноль, это правильно. Вот то что останавливаете не очень одыкватно при таких ситуациях.
Самое что интересное индикатор же не останавливает свой расчёт, а расчитавыет далее переходя к новому бару.
Я третий раз повторяю: "проверять всегда и везде все делители самостоятельно". Странно, что программист не понимает таких базовых вещей.
burger
20
burger  
Renat:
Я третий раз повторяю: "проверять всегда и везде все делители самостоятельно". Странно, что программист не понимает таких базовых вещей.

Извините за назойливость, я новичок в программировании, вы не могли бы разъяснить метод поиска и исправления ошибки "zero divide" через линейную логику, очень сложно использовать метафизику, на начальной стадии развития.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий