"Плавающая" ошибка PositionSelect() - страница 4

 
prostotrader:

Ещё раз, для "кандидатов", "докторов", "профессоров" и "академиков".

Любое событие, приходящее в OnTradeTransaction() может потерятся 

Поэтому я считаю ошибкой, что после прихода значащаго события TRADE_TRANSACTION_HISTORY_ADD

данные в терминало о позиции не обновляются! 

В справке (https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Один торговый запрос, отправленный из терминала вручную или через торговые функции OrderSend()/OrderSendAsync(), может порождать на торговом сервере несколько последовательных торговых транзакций. При этом очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других. Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

 Поэтому вообще непонятно зачем нужна эта функция. Просто не надо ей пользоваться и все. Надо самостоятельно анализировать историю ордеров и сделок. 

 
Dmitry Fedoseev:

В справке (https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

 Поэтому вообще непонятно зачем нужна этой функцией. Просто не надо ей пользоваться и все. Надо самостоятельно анализировать историю ордеров и сделок. 

Спасибо. К тому же можно не пользоваться и всеми остальными функциями :)  (без обид)
 

Что касается ордеров, позиций и сделок.

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


Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

Что касается этой фразы.

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

 
MQ Alexander:

Что касается ордеров, позиций и сделок.

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


Что касается этой фразы.

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

Большое спасибо!

А мне автомат датите (на худой конец ружо), чтобы поучаствовать в расстреле? :) 

 

MQ Alexander!

Хотелось бы получить более расширеное пояснение по сделкам и позициям.

Потому что ВЫ писали:

 

Изменение позиции в терминале происходит строго в результате получения сделочной транзакции, соответственно её получение является гарантией того что позиция поменялась.

 А на деле получается следующее:

Тестовый эксперт билд 1375 демо открытия(был запущен 2 раза)

//+------------------------------------------------------------------+
//|                                              Test_deff_order.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
uint  order_req_id;
ulong order_ticket;
ulong magic=987142563;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   OrderPlace();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
    switch( trans.type )
    {
      case TRADE_TRANSACTION_REQUEST:
        if((order_req_id > 0) && (order_req_id==result.request_id))
        {
          if(result.retcode==TRADE_RETCODE_PLACED) order_ticket=result.order;
        }
      break;
      case TRADE_TRANSACTION_DEAL_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("Deal done. Ticket: ",trans.order);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("History done. Ticket: ",order_ticket);
         if(HistoryOrderSelect(order_ticket))
         {
           double vol_cur = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_CURRENT);
           double vol_init = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_INITIAL);
           datetime time_setup=datetime(HistoryOrderGetInteger(order_ticket,ORDER_TIME_SETUP));
           double deals_vol = GetDealsVolume(Symbol(),order_ticket,time_setup);
           Print("Volume initial: ",vol_init," Volume current: ",vol_cur," Deals done: ",deals_vol);
           if(PositionSelect(Symbol()))
           {
            Print("Position exists.");
           }
           else
           {
            Print("Position NOT exists.");
           }
         }
        }
      break;
    }
  }
///----
double GetDealsVolume(const string a_symbol,const ulong a_ticket,const datetime start)
  {
   double volume=0;
   if(HistorySelect(start-180,TimeTradeServer()+180))
     {
      int deals=HistoryDealsTotal();
      if(deals>0)
        {
         for(int i=deals-1; i>=0; i--)
           {
            ulong deal_ticket=HistoryDealGetTicket(i);
            ulong ticket=ulong(HistoryDealGetInteger(deal_ticket,DEAL_ORDER));
            if(( ticket>0) && (ticket==a_ticket))
              {
               volume+=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
              }
           }
        }
     }
   return( volume );
  } 
//---
//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void OrderPlace()
{
  ResetLastError();
  MqlTradeRequest request={0};
  MqlTradeResult  result={0};
  order_ticket=0;
  order_req_id=0;
    
//--- Fill structure
  request.action=TRADE_ACTION_DEAL;//PENDING;
  request.magic=magic;
  request.symbol=Symbol();
  request.volume=1;
  double step=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE); 
  request.price=0;//SymbolInfoDouble(Symbol(), SYMBOL_ASK);//-step;
  request.type = ORDER_TYPE_BUY;//BUY_LIMIT;
  request.comment = "";      
  request.type_filling = ORDER_FILLING_IOC; ///
  request.type_time = ORDER_TIME_DAY;
  if(OrderSendAsync(request, result))
  {
    if(result.retcode==TRADE_RETCODE_PLACED) 
    {
      order_req_id=result.request_id;
    }
    else
    {
      Print( __FUNCTION__, ": Error! Retcode: ",GetLastError());
    }
  }
  else
  {
    Print( __FUNCTION__, ": Order not sent!");
  }
}   
//+------------------------------------------------------------------+

 А вот, результаты:

 

Оба раза тразакция TRADE_TRANSACTION_HISTORY_ADD пришла первой, но

в первом случае позиции небыло, а во втором - была!

Как же понимать это

Забыл приколоть лог терминала:

2016.08.15 15:37:14.935 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:17.694 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:17.702 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 8 ms
2016.08.15 15:37:17.721 Trades  '1007932': deal #7487011 buy 1.00 GAZR-9.16 at 13897 done (based on order #50942179)
2016.08.15 15:37:46.456 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897
2016.08.15 15:37:46.463 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897 placed for execution in 7 ms
2016.08.15 15:37:46.497 Trades  '1007932': deal #7487015 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942187)
2016.08.15 15:37:50.348 Experts expert Test_deff_order (GAZR-9.16,M1) removed
2016.08.15 15:37:51.845 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:53.776 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:53.786 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 9 ms
2016.08.15 15:37:53.807 Trades  '1007932': deal #7487017 buy 1.00 GAZR-9.16 at 13898 done (based on order #50942195)
2016.08.15 15:37:58.632 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898
2016.08.15 15:37:58.639 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898 placed for execution in 7 ms
2016.08.15 15:37:58.664 Trades  '1007932': deal #7487020 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942197)
2016.08.15 15:41:52.483 Experts expert Test_deff_order (GAZR-9.16,M1) removed
 

prostotrader, а позвольте Вам интимный вопрос. Вы за что так любите исторические ордера и не любите сделки? :-))

MQ Alexander ведь сказал:

Что касается ордеров, позиций и сделок.

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

 А в Вашем случае case

case TRADE_TRANSACTION_DEAL_ADD


почти пустой...

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

 
Dennis Kirichenko:

prostotrader, а позвольте Вам интимный вопрос. Вы за что так любите исторические ордера и не любите сделки? :-))

MQ Alexander ведь сказал:

 А в Вашем случае case


почти пустой...

Отвечаю Вам на Ваш интимный вопрос.

Вы, вероятно работатете на ФОРЕКС и имеете дело с одним ордером,

поэтому так настойчиво "лезите" в проблему, которую даже не понимаете.  

Представьте, что в машине два руля и два водителя, которые оба смотрят только на

дорогу. Как 1-ый водитель узнает, что второй повереул руль (допустим вправо)? 

И ещё посмотрите внимательно

 

Вся Ваша примитивная логика строится на исполнении рыночного ордера, так вот,

довожу ло Вашкго сведения, что ещё есть лимитные и отложеннве ордера, которые

могут исполняться не полностью, а частями. 

 
prostotrader:

И ещё посмотрите внимательно

И что я там должен увидеть?!

А Вы понимаете, что Вы случайно получаете информацию о позиции в case TRADE_TRANSACTION_HISTORY_ADD?

И Вам об этом уже говорили...
 

prostotrader:

Вся Ваша примитивная логика строится на исполнении рыночного ордера, так вот,

довожу ло Вашкго сведения, что ещё есть лимитные и отложеннве ордера, которые

могут исполняться не полностью, а частями. 

Деточка, не Вам судить о моей примитивной логике...
 
Dennis Kirichenko:
Деточка, не Вам судить о моей примитивной логике...

А кто будет судить?

Я сужу о Ваших способностях по Вашим высказываниям!

Картина явно неприглядная :( 

 

 Так понятней "профессор"?

И что-то я не припомню чтобы MQ Alexander делигировал Вас отвечать за него. 

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