ФОРТС OrderSendAsync - страница 2

 
ranquild:
При отправке заявки через OrderSendAsync на руках нет id ордера, список активных заявок обновляется не сразу, позиция тем более. Конкретно на следующий тик после заявки (заметно при быстром движении цены на реальном счете) что из торгового окружения поможет узнать, что ранее была отправлена заявка? Не хочется делать свой механизм учета отправленных заявок.

Как у Вас может быть на руках id ордера, если он назначается сервером, после соответствующих проверок и постановки ордера в очередь заявок!? В момент отправки ордера Вы даже не знаете, будет ли он обработан сервером и сможет ли появиться в системе.

Проблему контроля можно решить на стороне пользователя с помощью специальных сценариев. В двух словах сложно объяснить, как они работают.Сценарий запускает следующую задачу из своего списка, как только предыдущая задача будет исполнена. Исполнение задачи контролируется через анализ торгового окружения.

 
Mikalas:

У Вас ошибочное представление о механизме работы.

Всё вовремя обновляется и быстро...

Если Вам трудно сейчас реализовать OrderSendAsync(), то используйте OrderSend() 

Тестовый скрипт

void OnStart()
{
   string symbol = "SBRF-6.15";
   
   if (PositionSelect(symbol))
      PrintFormat("Начальный объем: %f",PositionGetDouble(POSITION_VOLUME));
   PrintFormat("Кол-во активных заявок: %d", OrdersTotal());
   
   MqlTradeRequest request = {0};
   request.action = TRADE_ACTION_DEAL;
   request.symbol = symbol;
   request.volume = 1;
   request.type = ORDER_TYPE_BUY;
   request.type_filling = ORDER_FILLING_FOK;
   
   MqlTradeResult result = {0};
   bool success = OrderSendAsync(request, result);
   if (success)
      PrintFormat("Заявка отправлена успешно");
      
   if (PositionSelect(symbol))
      PrintFormat("Текущий объем: %f",PositionGetDouble(POSITION_VOLUME));
   PrintFormat("Кол-во активных заявок: %d", OrdersTotal());
}


Я что-то не так делаю? Смысл в том, что после успешной OrderSendAsync заявка должна появится в списке активных заявок с состоянием ORDER_STATE_REQUEST_ADD хотя бы.

 
if ( OrderSendAsync( request, result ) )
  {
    if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      req_id = result.request_id; 
    }
  }
 

После получения req_id:

Получаем билет:

void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
  switch( trans.type )
  {
    case TRADE_TRANSACTION_REQUEST:  if ( ( req_id != 0 ) && ( result.request_id == req_id ) )
                                     {
                                       MyOrder = result.order;
                                     } 
                                     break;
  }
}
 
Mikalas:

После получения req_id:

Получаем билет:

Спасибо! Начинаю понимать :)
 
ranquild:
Спасибо! Начинаю понимать :)
:) Обращайтесь... 
Причина обращения: