Обсуждение статьи "Ордерa, позиции и сделки в MetaTrader 5" - страница 3

 

Renat:

Yedelkin:

Цитата из статьи: "При потере подключения к торговому серверу терминал периодически предпринимает попытки восстановить связь".

С какой частотой осуществляются  попытки восстановить связь?

Раз в 5 секунд

Ещё вопрос на эту же тему. А как работает функция TerminalInfoInteger(TERMINAL_CONNECTED): осуществляет ли она незамедлительно попытку достучаться до сервера при её вызове, или же берёт данные о наличии/отсутствии подключения из окружения mql5-программы, обновляемого раз в 5 секунд?

Иными словами, можно ли при потере подключения рассчитывать на то, что вызов функции TerminalInfoInteger(TERMINAL_CONNECTED) возвратит актуальные сведения о текущем реальном состоянии соединения, независимо от того, что сам терминал в такой ситуации проверяет связь только раз в 5 секунд?

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала - Документация по MQL5
 
Функция возвращает текущее состояние соединения без каких-либо попыток поднять коннект. Реконнекты работают автоматически и независимо.
 
Renat:
Функция возвращает текущее состояние соединения без каких-либо попыток поднять коннект. Реконнекты работают автоматически и независимо.

Понял так, что при потере подключения функция TerminalInfoInteger(TERMINAL_CONNECTED) вернёт те данные, которые сформировались после последнего 5-секундного реконнекта. Спасибо!

 
Нет. Функция покажет текущее сиюсекундное состояние коннекта. Никакие 5 сек тут не причем.
 
Renat:
Нет. Функция покажет текущее сиюсекундное состояние коннекта. Никакие 5 сек тут не причем.   

Ох, что-то тяжко сегодня наука постигается..

Получается, что в случае потери подключения функция TerminalInfoInteger(TERMINAL_CONNECTED) покажет текущее реальное состояние соединения, но при этом не будет  пытаться восстановить связь. ОК, для моих целей это очень удобно. Спс!

 

Скажите пожалуйста, если функция OrderSend вернула true и result.order иметь тикет ордера (result.order!=0), гарантирует ли это что ордер принят брокером и он находится во вкладке торговля или на этом этапе запрос принят только сервером брокера но не биржей?

И второй вопрос, может ли быть ситуация когда OrderSend вернула true, а result.order==0 ?

 
Aleksey Gunin:

Скажите пожалуйста, если функция OrderSend вернула true и result.order иметь тикет ордера (result.order!=0), гарантирует ли это что ордер принят брокером и он находится во вкладке торговля или на этом этапе запрос принят только сервером брокера но не биржей?

Гарантирует.

И второй вопрос, может ли быть ситуация когда OrderSend вернула true, а result.order==0 ?

Нет.

 
fxsaber:

Гарантирует.

Нет.

Только на днях добавили уточнение для функции OrderSend, посмотрите онлайн справку.

 
Rashid Umarov:

Только на днях добавили уточнение для функции OrderSend, посмотрите онлайн справку.

Разве это касается маркет-ордеров?

Каждый принятый ордер хранится на торговом сервере в ожидании обработки до тех пор, пока не наступит одно из условий для его исполнения:

  • истечение срока действия,
  • появление встречного запроса,
  • срабатывание ордера при поступлении цены исполнения,
  • поступление запроса на отмену ордера.
Отсутствует уточнение, что сам Терминал всегда вызывает OrderCheck перед OrderSendAsync, а OrderSend - это надстройка над OrderSendAsync

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Типичные ошибки и способы их устранения при работе с торговым окружением

fxsaber, 2018.02.20 12:23

Условная схема реализации штатной OrderSend (без таймаута)
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// Условный алгоритм реализации штатной OrderSend
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // условно-схематичный вызов
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


Из этой схемы хорошо видно, что при выставлении маркет-ордера через OrderSendAsync на том же MetaQuotes-Demo невозможно гарантированно поймать событие выставления соответствующего ордера до момента, пока ордер не будет исполнен или отклонен. Т.е. в MT5 нет никаких простых механизмов оценивания промежуточных результатов своего OrderSendAsync.


OrderSend выполняется до тех пор, пока в OnTradeTransaction не придет Result.request_id равный этом же значению у OrderSendAsync. Либо же завершается аварийно по таймауту. Поэтому результат OrderSend зависит только от типа сообщения в OnTradeTransaction с соответствующим request_id.

Было бы полезно услышать про формирование самого request_id. Если правильно понимаю, то это счетчик отправленных на торговый сервер приказов с момента запуска/коннекта Терминала/Счета. Сам Терминал анализирует приходы сообщений от торгового сервера и либо только одному присваивает нужный request_id (что сомнительно), либо обнуляет request_id до определенного сообщения (вероятнее всего). Такое поведение позволило некоторое время назад добиться соответствия Истории торгов с выходом из OrderSend. Но из-за того, что только одно сообщение в OnTradeTransaction видно с нужным request_id, возникает неприятная ситуация в асинхронном режиме, приведенная в цитате выше.

 

Доброе время суток, обнаружил несоответствия для MqlTradeResult.deal и MqlTradeResult.order

1) Описание (Справочник MQL5)


2) Торговля в реальном времени

Ставлю рыночные ордера (TRADE_ACTION_DEAL). Вывожу функцией Print значения MqlTradeResult:


при этом в журнале deal фигурирует:

Пробовал "засыпать" функцией Sleep на пару секунд и выводить данные снова (когда сделка уже точно совершена и позиция открыта), номер сделки не появлялся.


3) Тестер Стратегий

Здесь заполняются все поля:



Чем вызваны такие различия?

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