mt4trade: Ну почему же нечего, когда она ловится? Вообще все подобные ошибки я нахожу этим способом. А "сомнительные формулы" разве чем-то принципиально отличаются от моего тестового кода? Функция GetLastError() должна ее ловить! Плюс проверки у меня практически везде стоят. И эксперту "сто лет в обед", все относительно недавние правки проверены. Ошибка же появляется лишь иногда. Может дело не в моем коде? В чем тогда?
А ZeroNo избавляет от нежелательных нулей в знаменателях! При Флэте часто составляющие значения котировок повторяются, а у Вас может быть формула для анализа движения цены.
Поставьте сразу, не ожидая Zero и нет проблем, только не так, как у МММ! ;)
Это - как вопрос армянскому радио: "Можно ли использовать кефир в качестве противозачаточного средства? И как принимать - до того, или после?". Ответ: "Вместо того".
Перед любой операцией деления проверять условие: Знаменатель>Zero; а в глобальной секции:
#define Zero 0.00000001
Да, везде вижу эти проверки, но это лишнее условие в колене, и отвлекает от принципиальной задачи действий. Я сокращаю многие чужие функции для моих целей.
Вот кстати, недавно натолкнулся на подобную ошибку. В выходной день. Сделал пошаговую распринтовку присваиваний и вычислений. Оказалось, что по какой то причине (подозреваю просто отсутствие связи с сервером, но это я не проверил тогда) выражение
double LotVal = MarketInfo(0,MODE_TICKVALUE);
возвращает = 0. Соответственно и
lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk/(_Digits*PotPips*LotVal),2); также равен 0.
Вот кстати, недавно натолкнулся на подобную ошибку. В выходной день. Сделал пошаговую распринтовку присваиваний и вычислений. Оказалось, что по какой то причине (подозреваю просто отсутствие связи с сервером, но это я не проверил тогда) выражение
double LotVal = MarketInfo(0,MODE_TICKVALUE);
возвращает = 0. Соответственно и
lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk/(_Digits*PotPips*LotVal),2); также равен 0.
Советник просто останавливался.
А может быть, что на этом баре не было тиков?
И советник не должен останавливаться, а просто ждать тика! Проверьте код!
И советник не должен останавливаться, а просто ждать тика! Проверьте код!
При контроле открытия нового бара? Сам факт начала образования нового бара говорит о том что тик есть. Но это даже и не то, ошибка выходила при тестировании на истории. А там неважно есть тик или нет.Я добавил вот это double LotVal = MarketInfo(0,MODE_TICKVALUE);if (LotVal <1)LotVal =10;. Ошибка перестала появляться.
При контроле открытия нового бара? Сам факт начала образования нового бара говорит о том что тик есть. Но это даже и не то, ошибка выходила при тестировании на истории. А там неважно есть тик или нет.Я добавил вот это double LotVal = MarketInfo(0,MODE_TICKVALUE);if (LotVal <1)LotVal =10;. Ошибка перестала появляться.
Если периодически новое значение бывает равно нулю, логичнее использовать старое ненулевое значение, а не назначать его принудительно.
Ну почему же нечего, когда она ловится? Вообще все подобные ошибки я нахожу этим способом. А "сомнительные формулы" разве чем-то принципиально отличаются от моего тестового кода? Функция GetLastError() должна ее ловить! Плюс проверки у меня практически везде стоят. И эксперту "сто лет в обед", все относительно недавние правки проверены. Ошибка же появляется лишь иногда. Может дело не в моем коде? В чем тогда?
Функция GetLastError(), если ловит, но не устраняет.
А ZeroNo избавляет от нежелательных нулей в знаменателях! При Флэте часто составляющие значения котировок повторяются, а у Вас может быть формула для анализа движения цены.
Поставьте сразу, не ожидая Zero и нет проблем, только не так, как у МММ! ;)
Перед любой операцией деления проверять условие: Знаменатель>Zero; а в глобальной секции:
#define Zero 0.00000001
Перед любой операцией деления проверять условие: Знаменатель>Zero; а в глобальной секции:
#define Zero 0.00000001
Да, код загромождается и хуже читается, а для меня сейчас 2000 строк - перегруз.
Но,- на безрыбии и сам раком станешь:)
Вот кстати, недавно натолкнулся на подобную ошибку. В выходной день. Сделал пошаговую распринтовку присваиваний и вычислений. Оказалось, что по какой то причине (подозреваю просто отсутствие связи с сервером, но это я не проверил тогда) выражение
double LotVal = MarketInfo(0,MODE_TICKVALUE);
возвращает = 0. Соответственно и
lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk/(_Digits*PotPips*LotVal),2); также равен 0.
Советник просто останавливался.
Вот кстати, недавно натолкнулся на подобную ошибку. В выходной день. Сделал пошаговую распринтовку присваиваний и вычислений. Оказалось, что по какой то причине (подозреваю просто отсутствие связи с сервером, но это я не проверил тогда) выражение
double LotVal = MarketInfo(0,MODE_TICKVALUE);
возвращает = 0. Соответственно и
lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk/(_Digits*PotPips*LotVal),2); также равен 0.
Советник просто останавливался.
А может быть, что на этом баре не было тиков?
И советник не должен останавливаться, а просто ждать тика! Проверьте код!
А может быть, что на этом баре не было тиков?
И советник не должен останавливаться, а просто ждать тика! Проверьте код!
При контроле открытия нового бара? Сам факт начала образования нового бара говорит о том что тик есть. Но это даже и не то, ошибка выходила при тестировании на истории. А там неважно есть тик или нет.Я добавил вот это double LotVal = MarketInfo(0,MODE_TICKVALUE);if (LotVal <1)LotVal =10;. Ошибка перестала появляться.
.
При контроле открытия нового бара? Сам факт начала образования нового бара говорит о том что тик есть. Но это даже и не то, ошибка выходила при тестировании на истории. А там неважно есть тик или нет.Я добавил вот это double LotVal = MarketInfo(0,MODE_TICKVALUE);if (LotVal <1)LotVal =10;. Ошибка перестала появляться.