Но на практике использование AccountFreeMarginCheck уже само по себе возвращает 134 ошибку,
Правильно.
как если бы просто сразу выставлять ордер, когда средств недостаточно.
Неправильно.
Какой смысл тогда в такой проверке?
Именно в этом и смысл - не отправлять заведомо ошибочный приказ.
Хорошо, но тогда получается, что совсем не все возвраты _LastError считаются ошибками. Можно где-то посмотреть весь список таких кодов?
Хорошо, но тогда получается, что совсем не все возвраты _LastError считаются ошибками. Можно где-то посмотреть весь список таких кодов?
Ошибками считаются все коды возврата торгового сервера, отличные от ERR_NO_ERROR, после совершения торговых операций (функция AccountFreemarginCheck() не выполняет торговую операцию), а также фатальные ошибки во время исполнения кода: деление на ноль, выход за пределы массива, работа с невалидным указателем.
- www.mql5.com
Кстати, может кто подскажет, раньше при возникновении ошибки требовалось выждать некоторый тайм-аут прежде чем повторно отправлять запрос.
Как сейчас с этим? Я что-то не обнаружил в документации упоминаний о тайм-аутах.
Кстати, может кто подскажет, раньше при возникновении ошибки требовалось выждать некоторый тайм-аут прежде чем повторно отправлять запрос.
Как сейчас с этим? Я что-то не обнаружил в документации упоминаний о тайм-аутах.
выжидать тайм-аут нужно для тех ошибок, которые причиной имеют то, что после тайм-аута скорее всего изменится. Всё так как и раньше.
Ошибками считаются все коды возврата торгового сервера, отличные от ERR_NO_ERROR, после совершения торговых операций (функция AccountFreemarginCheck() не выполняет торговую операцию), а также фатальные ошибки во время исполнения кода: деление на ноль, выход за пределы массива, работа с невалидным указателем.
Заранее извиняюсь за занудство, но раз затронули тему... откуда мы знаем, что функция AccountFreemarginCheck() не выполняет торговую операцию? Возврат ошибки ведь точно такой же как для OrderSend со слишком большим объемом. Как понять, что из списка кодов возвратов торгового сервера является результатом именно торговой операции, а что нет?
все правильно
если Вы не проверите этого, Вас может отправить в бан торговый сервер
например, маржа за один лот находится в переменной ltMGN
if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,SymbolInfoDouble(_Symbol,SYMBOL_BID),ltMGN)==true)...
затем баланс делим на ltMGN и получаем количество лотов (максимум) который мы можеи открыть
однако, мы не учли спред, который уменьшит средства
поэтому, нужно баланс умножить на риск, например 0.9 (90%)
затем, после расчета лота, нам необходимо умножить лот на маржу по символу за 1 лот, т.е. на ltMGN
и сравнить со свободной маржей
удачи!
- www.mql5.com
откуда мы знаем, что функция AccountFreemarginCheck() не выполняет торговую операцию?
Определяется очень просто. Нужно вызвать функцию и посмотреть во вкладку "Журнал" окна "Терминал". Торговые запросы отображаются именно там. Функций, приводящих к отправке торгового приказа, всего пять:
- OrderSend()
- OrderClose()
- OrderDelete()
- OrderModify()
- OrderCloseBy()
- www.mql5.com
Определяется очень просто. Нужно вызвать функцию и посмотреть во вкладку "Журнал" окна "Терминал". Торговые запросы отображаются именно там. Функций, приводящих к отправке торгового приказа, всего пять:
- OrderSend()
- OrderClose()
- OrderDelete()
- OrderModify()
- OrderCloseBy()
Спасибо за пояснения!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите разобраться, как правильно сделать проверку на достаточность средств, чтобы она гарантированно устраивала Market?
В рекомендациях самого маркета предлагается использовать
AccountFreeMarginCheck()
вот здесь полный код: https://www.mql5.com/ru/articles/2555#not_enough_money
Но на практике использование AccountFreeMarginCheck уже само по себе возвращает 134 ошибку, как если бы просто сразу выставлять ордер, когда средств недостаточно. Какой смысл тогда в такой проверке? При том, что сам маркет похоже вообще не допускает никаких ошибок при проверке робота.
Как быть?