ФОРТС: В помощь начинающим - страница 4

 
Sergey Chalyshev:
Причем тут ава? На форуме писать у него нет возможности, вечный бан.
Ок, не знал, что тут забанить могут "частично". Жаль.
 
Sergey Chalyshev:
Причем тут ава? На форуме писать у него нет возможности, вечный бан.

Нет, его разбанили.

Забаненные юзеры зачеркнутым написаны.

 
Andrey Khatimlianskii:

Нет, его разбанили.

Забаненные юзеры зачеркнутым написаны.

Я тоже так думал, лучше у модераторов спросить, они точно знают.
 
Mikhail Filimonov:

Особенности:

Получив подтверждение (TRADE_RETCODE_PLACED ) в коде возврата функции OrderSend() и билет ордера,

 а для функции OrderSendAsync() в OnTradeTransaction(), это совсем не означает, что

ордер действительно ВЫСТАВЛЕН на биржу.

Поэтому нужна дополнительная проверка состояния ордера (ровно как и для других действий над ордером).

if ( OrderSend( request, result ) )
{
  if ( result.retcode == TRADE_RETCODE_PLACED )
  { 
    ticket = result.order;
  }
}

https://www.mql5.com/ru/docs/constants/structures/mqltraderesult

Здесь сказано, что тикет заполняется только тогда когда  тип торговой операции TRADE_ACTION_PENDING.

Если операция TRADE_ACTION_DEAL, вернется ли тикет ордера в result.order?

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

А в каких случаях бывает ошибка 10013 в ответ на вызов OrderCheck() ?

Вот код моего скрипта:

   MqlTradeRequest   m_request;         
   MqlTradeCheckResult m_check_result;  
   
   m_request.action      =TRADE_ACTION_DEAL;
   m_request.symbol      =Symbol();
   m_request.magic       =001;
   m_request.volume      =1.00;
   m_request.type        =ORDER_TYPE_SELL;
   m_request.type_filling=ORDER_FILLING_RETURN;
   if(!OrderCheck(m_request,m_check_result))
      Print(__FUNCTION__+": order check failed.");
   else
      Print(__FUNCTION__+": order check passed.");
   Print(__FUNCTION__+": symbol=",m_request.symbol,", operation=",m_request.type,", volume=",m_request.volume);
   Print(__FUNCTION__+": retcode=",m_check_result.retcode,", balance=",m_check_result.balance,", equity=",m_check_result.equity,", profit=",m_check_result.profit,
            ", margin=",m_check_result.margin,", margin_free=",m_check_result.margin_free,", margin_level=",m_check_result.margin_level,
            ", comment=",m_check_result.comment);

 Вот лог который получаю:

Check (RTS-6.16,M30)    OnStart: retcode=10013, balance=0.0, equity=0.0, profit=2.121995790965272e-314, margin=0.0, margin_free=0.0, margin_level=0.0, comment=Invalid request
Check (RTS-6.16,M30)    OnStart: symbol=RTS-6.16, operation=1, volume=1.0
Check (RTS-6.16,M30)    OnStart: order check failed.
 
igorbel:

А в каких случаях бывает ошибка 10013 в ответ на вызов OrderCheck() ?

Вот код моего скрипта:

 Вот лог который получаю:

Прошел когда добавил m_request.expiration  =0, хотя в справке написано:

Exchange Execution

Торговый ордер на открытие позиции в режиме Exchange Execution (биржевой режим исполнения торговых приказов). Требуется указание 5 полей:

  • action
  • symbol
  • volume
  • type
  • type_filling

Можно также задать значения полей magic и comment. 

 

На этом однако странности не заканчиваются. 

1 лот Buy:

Check (RTS-6.16,M30) OnStart: retcode=0, balance=530863.24, equity=538989.4399999999, profit=2.121995790965272e-314, margin=211242.25, margin_free=319620.99, margin_level=255.1522907941001, comment=Done

Check (RTS-6.16,M30) OnStart: symbol=RTS-6.16, operation=0, volume=1.0

 Маржа для операции 211242.25, то же что и текущая маржа - всё правильно так как текущая короткая позиция по RTS-6.16 2 контракта. Начальная маржа для 1 контракта RTS-6.16 17388.75

Добавляю еще один лот.

2 лот Buy:

Check (RTS-6.16,M30) OnStart: retcode=0, balance=651428.4399999999, equity=659212.76, profit=2.121995790965272e-314, margin=211242.25, margin_free=440186.19, margin_level=312.0648260468727, comment=Done

Check (RTS-6.16,M30) OnStart: symbol=RTS-6.16, operation=0, volume=2.0

Всё ок, т.к. текущая поза 2 Sell, маржа остается без имзенений.

Теперь 3 контракта Buy:

2016.04.28 01:26:47.319 Check (RTS-6.16,M30) OnStart: retcode=0, balance=651428.4399999999, equity=658739.4, profit=2.121995790965272e-314, margin=246019.75, margin_free=405408.69, margin_level=267.7587470111648, comment=Done

2016.04.28 01:26:47.319 Check (RTS-6.16,M30) OnStart: symbol=RTS-6.16, operation=0, volume=3.0

Значение маржи сразу 246019.75. Откуда? За 1 контракт всего 17к. А что с другими полями (в предыдущих случаях тоже)? Откуда такой эквити и баланс? У меня на счету даже нет столько. margin_free тоже неправильное, про profit и не говорю.

Кто-нибудь может у себя проверить, может что то не то делаю? 


 
igorbel:

Прошел когда добавил m_request.expiration  =0, хотя в справке написано:

Всегда инициализируйте все переменные и структуры нулями сразу после объявления. У вас в поле expiration какой-то мусор был, вот и получали ошибку.

MqlTradeRequest   m_request;         
MqlTradeCheckResult m_check_result; 

ZeroMemory(m_request);
ZeroMemory(m_check_result);
// теперь заполняйте нужные поля
 
Sergei Vladimirov:

Всегда инициализируйте все переменные и структуры нулями сразу после объявления. У вас в поле expiration какой-то мусор был, вот и получали ошибку.

Спасибо. Но от OrderCheck() пришлось отказаться, практически бесполезная функция на ФОРТС по крайней мере. Во-первых, дает непонятные результаты. Но даже когда значения более менее верные, всегда есть вероятность, что ордер отклонят на бирже. Поэтому приходится смотреть статус ордера ORDER_STATE_REJECTED и можно еще смотреть комментарий. Потом уменьшать объем в ордере и отправлять снова. Всё это конечно не ускоряет торговлю, но что делать :(
Причина обращения: