Как сделать проверку на достаточность средств без возвращения ошибки?

 

Помогите разобраться, как правильно сделать проверку на достаточность средств, чтобы она гарантированно устраивала Market?

В рекомендациях самого маркета предлагается использовать 

AccountFreeMarginCheck()

вот здесь полный код:  https://www.mql5.com/ru/articles/2555#not_enough_money

Но на практике использование AccountFreeMarginCheck уже само по себе возвращает 134 ошибку, как если бы просто сразу выставлять ордер, когда средств недостаточно. Какой смысл тогда в такой проверке? При том, что сам маркет похоже вообще не допускает никаких ошибок при проверке робота. 

Как быть?

   

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
 
leon_17:

Но на практике использование AccountFreeMarginCheck уже само по себе возвращает 134 ошибку,

Правильно.

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

Неправильно.

Какой смысл тогда в такой проверке?

Именно в этом и смысл - не отправлять заведомо ошибочный приказ.
   

 
Ihor Herasko: 

Хорошо, но тогда получается, что совсем не все возвраты _LastError считаются ошибками. Можно где-то посмотреть весь список таких кодов? 

 
leon_17:

Хорошо, но тогда получается, что совсем не все возвраты _LastError считаются ошибками. Можно где-то посмотреть весь список таких кодов? 

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

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера
  • www.mql5.com
Коды возврата торгового сервера - Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Кстати, может кто подскажет, раньше при возникновении ошибки требовалось выждать некоторый тайм-аут прежде чем повторно отправлять запрос.

Как сейчас с этим? Я что-то не обнаружил в документации упоминаний о тайм-аутах. 

 
PapaYozh:

Кстати, может кто подскажет, раньше при возникновении ошибки требовалось выждать некоторый тайм-аут прежде чем повторно отправлять запрос.

Как сейчас с этим? Я что-то не обнаружил в документации упоминаний о тайм-аутах. 

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

 
Ihor Herasko:

Ошибками считаются все коды возврата торгового сервера, отличные от 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

и сравнить со свободной маржей

удачи!

Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
  • www.mql5.com
SymbolInfoDouble - Получение рыночной информации - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
leon_17:

откуда мы знаем, что  функция AccountFreemarginCheck() не выполняет торговую операцию? 

Определяется очень просто. Нужно вызвать функцию и посмотреть во вкладку "Журнал" окна "Терминал". Торговые запросы отображаются именно там. Функций, приводящих к отправке торгового приказа, всего пять:

  1. OrderSend()
  2. OrderClose()
  3. OrderDelete()
  4. OrderModify()
  5. OrderCloseBy()
Остальные функции, находящиеся в разделе "Торговые функции" справки, работают сугубо "внутри" терминала.
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ihor Herasko:

Определяется очень просто. Нужно вызвать функцию и посмотреть во вкладку "Журнал" окна "Терминал". Торговые запросы отображаются именно там. Функций, приводящих к отправке торгового приказа, всего пять:

  1. OrderSend()
  2. OrderClose()
  3. OrderDelete()
  4. OrderModify()
  5. OrderCloseBy()
Остальные функции, находящиеся в разделе "Торговые функции" справки, работают сугубо "внутри" терминала.

Спасибо за пояснения!

Причина обращения: