zero divide - страница 3

 
mt4trade:
Ну почему же нечего, когда она ловится? Вообще все подобные ошибки я нахожу этим способом. А "сомнительные формулы" разве чем-то принципиально отличаются от моего тестового кода? Функция GetLastError() должна ее ловить! Плюс проверки у меня практически везде стоят. И эксперту "сто лет в обед", все относительно недавние правки проверены. Ошибка же появляется лишь иногда. Может дело не в моем коде? В чем тогда?

Функция GetLastError(), если ловит, но не устраняет.

А ZeroNo избавляет от нежелательных нулей в знаменателях! При Флэте часто составляющие значения котировок повторяются, а у Вас может быть формула для анализа движения цены.

Поставьте сразу, не ожидая Zero и нет проблем, только не так, как у МММ! ;)

 

Перед любой операцией деления проверять условие: Знаменатель>Zero; а в глобальной секции:

#define     Zero     0.00000001


 
Это - как вопрос армянскому радио: "Можно ли использовать кефир в качестве противозачаточного средства? И как принимать - до того, или после?". Ответ: "Вместо того".
 
tara:

Перед любой операцией деления проверять условие: Знаменатель>Zero; а в глобальной секции:

#define     Zero     0.00000001


Да, везде вижу эти проверки, но это лишнее условие в колене, и отвлекает от принципиальной задачи действий. Я сокращаю многие чужие функции для моих целей.
 

Да, код загромождается и хуже читается, а для меня сейчас 2000 строк - перегруз.

Но,- на безрыбии и сам раком станешь:)

 
Пустое. Любая конструкция, где теоретически м.б. деление на зеро, должна начинаться как: if(муе-мое != 0) - делайте что угодно.
 

Вот кстати, недавно натолкнулся на подобную ошибку. В выходной день. Сделал пошаговую распринтовку присваиваний и вычислений. Оказалось, что по какой то  причине (подозреваю просто отсутствие связи с сервером, но это я не проверил тогда) выражение

double LotVal = MarketInfo(0,MODE_TICKVALUE);

возвращает = 0. Соответственно и

lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk/(_Digits*PotPips*LotVal),2); также равен 0. 

Советник просто останавливался.

 
locol91:

Вот кстати, недавно натолкнулся на подобную ошибку. В выходной день. Сделал пошаговую распринтовку присваиваний и вычислений. Оказалось, что по какой то  причине (подозреваю просто отсутствие связи с сервером, но это я не проверил тогда) выражение

double LotVal = MarketInfo(0,MODE_TICKVALUE);

возвращает = 0. Соответственно и

lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk/(_Digits*PotPips*LotVal),2); также равен 0. 

Советник просто останавливался.

А может быть, что на этом баре не было тиков?

И советник не должен останавливаться, а просто ждать тика! Проверьте код!

 
borilunad:

А может быть, что на этом баре не было тиков?

И советник не должен останавливаться, а просто ждать тика! Проверьте код!

 При  контроле открытия нового бара? Сам факт начала образования нового бара говорит о том что тик есть. Но это даже и не то, ошибка выходила при тестировании на истории. А там неважно есть тик или нет.Я добавил вот это  double LotVal = MarketInfo(0,MODE_TICKVALUE);if (LotVal <1)LotVal =10;. Ошибка перестала появляться.

.

 
locol91:

 При  контроле открытия нового бара? Сам факт начала образования нового бара говорит о том что тик есть. Но это даже и не то, ошибка выходила при тестировании на истории. А там неважно есть тик или нет.Я добавил вот это  double LotVal = MarketInfo(0,MODE_TICKVALUE);if (LotVal <1)LotVal =10;. Ошибка перестала появляться.

Если периодически новое значение бывает равно нулю, логичнее использовать старое ненулевое значение, а не назначать его принудительно.

    double LotValPrev=10;

//------------------Start----------------
    double LotVal = MarketInfo(0,MODE_TICKVALUE);
    if(LotVal <1)
       LotVal = LotValPrev;
    else
       LotValPrev=LotVal; 
Причина обращения: