Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Если хотите локализовать ошибку, отчасти поможет такой "шаблон":
Не обязательно деление на ноль.
У меня была сборка с несколькими #include <***.mqh> и, когда в тексте основного модуля я неправильно обратился к одной функции,
то компиляция прошла нормально, а при работе эксперта, в журнале стала проскакивать эта ошибка.
Подробностей уже не помню, давно было, но причину нашел с большим трудом.
Это другое - ошибка при "позднем связывании". В этом случае работа программы также прерывается, но при новом тике не возобновляется, а возобновляется при повторной инициализации.
https://docs.mql4.com/ru/runtime/imports
Потому, что при делении на ноль выполнение программы немедленно прерывается.
https://docs.mql4.com/ru/runtime/errors
Нет, НЕ прерывается. Я провел простой эксперимент. Вставил следующий код сразу перед окончанием функции start():
// test zero divide
int nltestZD, nltest0=0;
nltestZD = 5 / nltest0;
Эксперт... РАБОТАЕТ!
В логе:
2013.01.19 01:12:42 2012.05.29 00:00 e-<skipped>: start() 1 ERR=4013 ERR_ZERO_DIVIDE dt=2012.05.29 00:00
2013.01.19 01:12:42 2012.05.29 00:00 e-<skipped>: ... ... <info>
2013.01.19 01:12:42 2012.05.28 23:59 e-<skipped>: zero divide
2013.01.19 01:12:42 2012.05.28 23:58 e-<skipped>: zero divide
То есть, деление на ноль не должно вышибать эксперта, а мой код должен ловить эту ошибку и, как видим, ловит.
А вот если не ловит, то почему???
Нет, НЕ прерывается. Я провел простой эксперимент. Вставил следующий код сразу перед окончанием функции start():
// test zero divide
int nltestZD, nltest0=0;
nltestZD = 5 / nltest0;
Эксперт... РАБОТАЕТ!
В логе:
2013.01.19 01:12:42 2012.05.29 00:00 e-<skipped>: start() 1 ERR=4013 ERR_ZERO_DIVIDE dt=2012.05.29 00:00
2013.01.19 01:12:42 2012.05.29 00:00 e-<skipped>: ... ... <info>
2013.01.19 01:12:42 2012.05.28 23:59 e-<skipped>: zero divide
2013.01.19 01:12:42 2012.05.28 23:58 e-<skipped>: zero divide
То есть, деление на ноль не должно вышибать эксперта, а мой код должен ловить эту ошибку и, как видим, ловит.
А вот если не ловит, то почему???
Тут ловить нечего! В сомнительных формулах подставляйте защиту от нуля! Например:
double ZeroNo = МаthMax(Ваш знаменатель, 1*Point) и ставьте это ZeroNo на место Вашего знаменателя в Ваших формулах!
Нет, НЕ прерывается. Я провел простой эксперимент. Вставил следующий код сразу перед окончанием функции start():
// test zero divide
int nltestZD, nltest0=0;
nltestZD = 5 / nltest0;
Эксперт... РАБОТАЕТ!
В логе:
2013.01.19 01:12:42 2012.05.29 00:00 e-<skipped>: start() 1 ERR=4013 ERR_ZERO_DIVIDE dt=2012.05.29 00:00
2013.01.19 01:12:42 2012.05.29 00:00 e-<skipped>: ... ... <info>
2013.01.19 01:12:42 2012.05.28 23:59 e-<skipped>: zero divide
2013.01.19 01:12:42 2012.05.28 23:58 e-<skipped>: zero divide
То есть, деление на ноль не должно вышибать эксперта, а мой код должен ловить эту ошибку и, как видим, ловит.
А вот если не ловит, то почему???
А вот если не ловит, то почему???
Тут ловить нечего! В сомнительных формулах подставляйте защиту от нуля! Например:
double ZeroNo = МаthMax(Ваш знаменатель, 1*Point) и ставьте это ZeroNo на место Вашего знаменателя в Ваших формулах!
... и ставьте это ZeroNo на место Вашего знаменателя в Ваших формулах!
От ошибки это спасёт, но расчёт может увести очень далеко от правды. Лучше всё-таки (в общем случае) остановить вычисления и сообщить о проблеме.
В частных случаях может быть допустимым.
Тут ловить нечего! В сомнительных формулах подставляйте защиту от нуля! Например:
double ZeroNo = МаthMax(Ваш знаменатель, 1*Point) и ставьте это ZeroNo на место Вашего знаменателя в Ваших формулах!
Почитайте документацию по моей ссылке, там много нового и интересного:) Не ловится потому, что при делении на ноль работа была прервана, а при поступлении нового тика - возобновлена. Код ошибки сохранился и был распечатан Вашей программой, но где была ошибка - Вам неведомо:( Подобие шаблона, выложенное мною, по крайней мере, поможет определить, при выполнении какой функции произошла ошибка, но лог будет не детским:)
Так у меня то функция start() в случае той, "коварной" ошибки, почему-то НЕ возобновляет работу. То есть эксперт прерывает работу совсем. В случае же вставки специального деления на ноль этого не происходит. Почему??
Шаблон Ваш конечно полезен, но думаю он делает примерно то же, что мой код. Впрочем, поразбираюсь с ним и со ссылкой еще.
Шаблон Ваш конечно полезен, но думаю он делает примерно то же, что мой код. Впрочем, поразбираюсь с ним и со ссылкой еще.
Если надумаете превратить его в полноценный шаблон MQL4, просьба выложить здесь, или в кодобазе.
Делает он действительно почти то же, но с трассировкой.