Скачать MetaTrader 5

zero divide

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не можешь разобраться в коде? Статьи помогут!
Nefedov Kirill
2889
Nefedov Kirill 2007.02.09 19:02 

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

Glaswegian
485
Glaswegian 2007.02.09 19:40  
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
2889
Nefedov Kirill 2007.02.09 20:20  

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

Glaswegian
485
Glaswegian 2007.02.09 20:50  
Вы спрашивали, как обработать ошибку. Про тестер тоже трудно было догадаться.
В моем примере обработчик выводит сообщение в лог. Ничто не мешает обрабатывать любым другим способом.
Не вполне ясно, что значит обойти. Ошибку можно исправить, чему очень может помочь подробная трассировка.
MetaQuotes
Админ
24952
Renat Fatkhullin 2007.02.09 23:35  
Чтобы избежать ошибки (это ошибка самого программиста) деления на ноль, надо (в любом языке) перед любым делением гарантированно проверять делитель на равенство нулю.
Nefedov Kirill
2889
Nefedov Kirill 2007.02.10 07:38  
Пол ночи искал какой пример привести для полного понимания.
И всетаки нашел.
Есть такой индикатор 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
Админ
24952
Renat Fatkhullin 2007.02.10 10:55  
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
2889
Nefedov Kirill 2007.02.10 12:38  
Renat писал (а):

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

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

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

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

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

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

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