События клиентского терминала - страница 4

 
Urain: когда слать повторный приказ?
по логике вещей нужно считать, что ордер выставлен при наличии ответа сервера в виде номера тикета или считать, что ордер не выставлен при возврате -1 , если идет разговор о причине не открытия ордера, то, конечно, было бы полезно получать ответ от сервера в виде отрицательного числа с кодом состояния ордера - в обработке, реквота.... Считаю, что удобнее было бы получать ответ сервера не в виде события терминала, а в виде флага состояния последнего запроса - проверил флаги, повторил открытие ордера в случае необходимости или подождал пока реквоты закончатся, хотя следом напрашивается вопрос про очередь
 
Renat

Проясните пожалуйста моё заблуждение:

отсылая запрос я передаю OrderSend() структуру result, будет ли изменяться состояние этой структуры в процессе прохождения её по OnTrade() или будет получен ответ единожды, те принимает ли терминал структуру в поступеньчатую обработку ?

Сергеев говорит что нет, я грешным делом по началу думал что да.

 
IgorM:
по логике вещей нужно считать, что ордер выставлен при наличии ответа сервера в виде номера тикета или считать, что ордер не выставлен при возврате -1 , если идет разговор о причине не открытия ордера, то, конечно, было бы полезно получать ответ от сервера в виде отрицательного числа с кодом состояния ордера - в обработке, реквота.... Считаю, что удобнее было бы получать ответ сервера не в виде события терминала, а в виде флага состояния последнего запроса - проверил флаги, повторил открытие ордера в случае необходимости или подождал пока реквоты закончатся, хотя следом напрашивается вопрос про очередь
Именно, всё это нужно рассматривать на фоне нескольких ордеров, и обработки исполнения в OnTrade.
 
Urain:

Проясните пожалуйста моё заблуждение:

отсылая запрос я передаю OrderSend() структуру result, будет ли изменяться состояние этой структуры в процессе прохождения её по OnTrade() или будет получен ответ единожды, те принимает ли терминал структуру в поступеньчатую обработку ?

Сергеев говорит что нет, я грешным делом по началу думал что да.

OnTrade() - это просто обработчик события Trade - события "что-то изменилось в торговой ситуации". Оно возникает после прихода сообщения от торгового сервера. Значит, структура result, которую вернула OrderSend(), никак напрямую не связана с обработчиком OnTrade().
 
Urain:
Именно, всё это нужно рассматривать на фоне нескольких ордеров, и обработки исполнения в OnTrade.
Как только откроется торговля, вы сможете запустить пример и посмотреть при каких обстостоятельствах и как часто вызывается OnTrade().
 
Rosh:
OnTrade() - это просто обработчик события Trade - события "что-то изменилось в торговой ситуации". Оно возникает после прихода сообщения от торгового сервера. Значит, структура result, которую вернула OrderSend(), никак напрямую не связана с обработчиком OnTrade().

Да согласен, но я ведь могу вызвать состояние result внутри OnTrade() просто обратившись к глобально объявленой структуре, вопрос состоит именно в этом:

как меняется состояние result внутри OnTrade() ?

  • один раз и всё
  • по каждому изменению состояния ордера

Там вариантов всего два, ордер принят 10008 или (ордер исполнен или реквот)

 
Urain:

как меняется состояние result внутри OnTrade() ?

Этой структуры там просто нет.
 
Rosh:
Как только откроется торговля, вы сможете запустить пример и посмотреть при каких обстостоятельствах и как часто вызывается OnTrade().

я бы переписал блок OrderSendAsync так

//--- запустим ордера
   int i=0,maxtry=5*deals_async,try=0;
   while(i<deals_async)
     {
      //--- выставим цену на 200 пунктов ниже Bid
      req.price=SymbolInfoDouble(req.symbol,SYMBOL_ASK)-200*_Point;
      ResetLastError();
      //--- пошлем асинхронный запрос
      if(!OrderSendAsync(req,res))
        {
         errors++;
         Print("   #",i,": ошибка ",GetLastError(),", retcode = ",res.retcode);
        }
      else i++;
      if(try>maxtry) break; try++;
     }
 
sergeev:

я бы переписал блок OrderSendAsync так


Не всё так просто, поведение OrderSendAsync() должно немного измениться, чтобы позволить терминалу отправлять запросы после очистки очереди. Когда - не знаю.
 
Rosh:
Этой структуры там просто нет.
MqlTradeRequest req={0};
MqlTradeResult  res={0};
void OnTick()
  {
   OrderSend(req,res);
  }
void OnTrade()
  {
   ulong t=res.order;
  }

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