" Error de PositionSelect() flotante - página 4

 
prostotrader:

Una vez más, para "candidatos", "doctores", "profesores" y "académicos".

Cualquier evento que llegue a OnTradeTransaction() puede perderse

Por eso creo que es un error que después de recibir el evento significativoTRADE_TRANSACTION_HISTORY_ADD

los datos del terminal no se actualizarán.

En Ayuda(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Una solicitud de operación enviada manualmente desde el terminal o a través de las funcionesOrderSend()/OrderSendAsync() puede generar varias operaciones consecutivas en el servidor de operaciones. El orden de llegada de estas transacciones al terminal no está garantizado, por lo que no podemos construir nuestro algoritmo de negociación esperando la llegada de unas transacciones comerciales después de otras. Además, las transacciones pueden perderse al ser entregadas desde el servidor al terminal.

Por lo tanto, no está claro para qué se necesita esta función. Simplemente, no deberías usarlo, eso es todo. Tienes que analizar tú mismo el historial de pedidos y operaciones.

 
Dmitry Fedoseev:

En Ayuda(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Por lo tanto, no está claro para qué se necesita esta función. Simplemente no deberías usarlo, eso es todo. Tienes que analizar tú mismo el historial de órdenes y operaciones.

Gracias. Además, tampoco tienes que utilizar todas las demás funciones :) (sin ofender)
 

En cuanto a las órdenes, posiciones y transacciones.

Tal y como está escrito en la ayuda, la secuencia de las transacciones no está garantizada: una transacción de transferencia de órdenes al historial puede recibirse antes que una transacción de un trato.
Elcambio de una posición en el terminal es estrictamente el resultado de la recepción de una transacción comercial, por lo que su recepción es una garantía de que la posición ha cambiado.
La obtención de una transacción para transferir una orden al historial sólo garantiza que la orden ha dejado de estar activa (abierta) y se ha trasladado al historial de órdenes.


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

En cuanto a esta frase.

Parece que se quedó en la documentación de una de las versiones iniciales del terminal con comercio asíncrono. Se eliminará en un futuro próximo. Los culpables serán ejecutados.

 
MQ Alexander:

En cuanto a las órdenes, posiciones y transacciones.

Tal y como está escrito en la ayuda, la secuencia de las transacciones no está garantizada: una transacción de transferencia de órdenes al historial puede recibirse antes que una transacción de un trato.
Elcambio de una posición en el terminal es estrictamente el resultado de la recepción de una transacción comercial, por lo que su recepción es una garantía de que la posición ha cambiado.
La obtención de una transacción para transferir una orden al historial sólo garantiza que la orden ha dejado de estar activa (abierta) y se ha trasladado al historial de órdenes.


En cuanto a esta frase.

Parece que se quedó en la documentación de una de las versiones iniciales del terminal con comercio asíncrono. Se eliminará en un futuro próximo. Los culpables serán ejecutados.

¡Muchas gracias!

¿Y yo una ametralladora (o al menos un rifle), para participar en el tiroteo? :)

 

¡MQ Alexander!

Me gustaría una explicación más amplia de las operaciones y posiciones.

Porque tú escribiste:

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

Y de hecho resulta lo siguiente:

Prueba de apertura de la demo de Expert Advisor build 1375 (se ejecutó 2 veces)

//+------------------------------------------------------------------+
//|                                              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!");
  }
}   
//+------------------------------------------------------------------+

Y aquí, los resultados:

Ambas veces TRADE_TRANSACTION_HISTORY_ADD fue la primera, pero

en el primer caso no había posición, pero en el segundo sí.

¿Cómo debo entenderlo?

Me olvidé de adjuntar el registro de la terminal:

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, déjame hacerte una pregunta íntima. ¿Por qué le gustan tanto las órdenes históricas y no le gustan los intercambios? :-))

DijoMQ Alexander:

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

Como está escrito en la Ayuda - la secuencia de las transacciones entrantes no está garantizada - la transacción de transferencia de orden a la historia puede ser recibida antes de la transacción.
Elcambio de una posición en el terminal es estrictamente el resultado de la recepción de una transacción comercial, por lo que su recepción es una garantía de que la posición ha cambiado.
La obtención de una transacción para transferir la orden al historial sólo garantiza que la orden ha dejado de estar activa (abierta) y ha sido transferida al historial de órdenes.

Y en su caso

case TRADE_TRANSACTION_DEAL_ADD


casi vacío...

Y otro comentario lírico. En el concepto de MT5, la presencia de una orden histórica refleja el hecho de que hubo un intento de realizar una operación. Y no es el hecho de que se haya ejecutado. Y para averiguarlo tenemos que remitirnos al comercio. Ya refleja el resultado de la operación comercial. Entonces es más lógico tratar las transacciones en su código...

 
Dennis Kirichenko:

prostotrader, déjame hacerte una pregunta íntima. ¿Por qué le gustan tanto las órdenes históricas y no le gustan los intercambios? :-))

MQ Alexander dijo:

Y en su caso


está casi vacío...

Estoy respondiendo a su pregunta íntima.

Probablemente trabaje en el mercado FOREX y se ocupe de una sola orden,

Así que insistes en "mentir" en un tema que ni siquiera entiendes.

Imagina que hay dos volantes en un coche y dos conductores que sólo miran el

el camino. ¿Cómo puede saber el primer conductor que el otro está girando (digamos que hacia la derecha)?

También fíjate bien:

Toda su lógica primitiva se basa en la ejecución de una orden de mercado, así que,

Le informo que hay órdenes limitadas y pendientes

que puede no ser ejecutado en su totalidad, sino que puede ser ejecutado en partes.

 
prostotrader:

Además, fíjate bien:

¡¿Y qué debería ver allí?!

¿Te das cuenta de que accidentalmente obtienes información de posición en el caso TRADE_TRANSACTION_HISTORY_ADD?

Y ya le han dicho que...
 

prostotrader:

Toda su lógica primitiva se basa en la ejecución de una orden de mercado, así que,

Me gustaría llamar su atención sobre la existencia de órdenes limitadas y pendientes

que puede no ejecutarse en su totalidad sino por partes.

Cariño, no eres tú quien debe juzgar mi lógica primitiva...
 
Dennis Kirichenko:
No eres quien para juzgar mi lógica primitiva...

¿Y quién va a juzgar?

¡Juzgo sus capacidades por sus declaraciones!

Está claro que la foto no es bonita :(

¿Está más claro, "Profesor"?

Y no recuerdo queMQ Alexander haya delegado en ti para que respondas por él.

Razón de la queja: