Discusión sobre el artículo "Comparando MQL5 y QLUA - ¿Por qué las operaciones comerciales en MQL5 son hasta 28 veces más rápidas?" - página 5

 

Hoy ha habido un fuerte movimiento en el Brent

Y en este momento MT5 se hizo cargo de estos retrasos.

 
Renat Fatkhullin:

No necesitas ajustar nada. Mi frase era para un caso general "en tu internet y tu ping puede ser cualquier cosa y en realidad dependiendo de tu red obtendrás una transacción en 0-N ms". Y es más probable que sea 0 ms que más.

Aquí está el código de verificación con control de todas las transacciones en modo asíncrono:

Aquí está su salida en una cuenta real en este momento:

Usted debe leer de abajo hacia arriba.

Muestra todas las etapas de las transacciones con el total acumulado del tiempo empleado desde el inicio. Por tipos de transacción puede ver qué se añadió al terminal y cuándo.

El tiempo total es de 11,45 ms.

Muchas gracias por la claridad del código. Según tus resultados, realmente no hay nada que corregir. He cometido un error.
 
prostotrader:

Hoy hubo un fuerte movimiento en Brent.

Y en este momento MT5 se hizo cargo de estos retrasos.

Ten preparadas las teclas de acceso rápido para grabar la pantalla al instante. O grábalo todo a todas horas. Siempre puedes recortar un trozo problemático y presentarlo como prueba. Por ahora, sólo palabras.
 
prostotrader:

¿De qué estás hablando, Renate?

¡Eso es un extracto de la bitácora del Temninal, no de mi propia bitácora!

Sí, así es. Lo siento, lo confundí con un compañero que contaba mal los tiempos.

Esto es lo que pasó en ese momento: es una pregunta para la bolsa - por qué siempre se comporta así en movimientos mínimos y considera normal ejecutar órdenes en ese tiempo.

Usted quería colocar una orden limitada a 47,56 cerca del mercado y es probable que la bolsa ralentizara la aceptación de órdenes para un intervalo de precios cercano a propósito, para que no hubiera sorpresas para ella:


Desde el punto de vista del rendimiento no puede haber dudas, ya que el volumen allí era ridículo, 320 lotes por minuto.

Arriba he mostrado mi rendimiento en un mercado tranquilo.

 
fxsaber:
Ten a mano las teclas de acceso rápido para grabar la pantalla al instante. O grábalo todo a todas horas. Siempre puedes recortar la parte problemática y presentarla como prueba. Por ahora, sólo palabras.
prostotrader:

Hoy hubo un fuerte movimiento en Brent.

Y en este momento MT5 se hizo cargo de estos retrasos.

Solo que MT5 no tiene nada que ver con estos retrasos.

Fue el intercambio que respondió durante tanto tiempo.

 
Renat Fatkhullin:

Sólo MT5 no tiene nada que ver con estos retrasos.

Fue la bolsa la que tardó tanto en responder.

Puede usted por favor resaltar las líneas en su ejemplo-log donde los frenos del intercambio serán visibles cuando se comporta así?

2016.09.14 18:32:53.234 Test (BR-12.16,H1)      TRADE_TRANSACTION_HISTORY_ADD BR-12.16: 0.0 0 time: 11.455 ms
2016.09.14 18:32:53.232 Test (BR-12.16,H1)      TRADE_TRANSACTION_DEAL_ADD BR-12.16: 47.13 0 time: 8.778 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_DELETE BR-12.16: 0.0 0 time: 8.457000000000001 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 8.202999999999999 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 8.151 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 5.196 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 5.171 ms
2016.09.14 18:32:53.227 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_ADD BR-12.16: 0.0 0 time: 4.184 ms
2016.09.14 18:32:53.223 Test (BR-12.16,H1)      Start...
2016.09.14 18:32:49.753 Test (BR-12.16,H1)      AsyncTradesTest: last ping 2.15 ms, build 1417
 

Lo más probable es que se note a partir de aquí, pero sin duda será visible en las dos últimas transacciones:

2016.09.14 18:32:53.234 Test (BR-12.16,H1)      TRADE_TRANSACTION_HISTORY_ADD BR-12.16: 0.0 0 time: 11.455 ms
2016.09.14 18:32:53.232 Test (BR-12.16,H1)      TRADE_TRANSACTION_DEAL_ADD BR-12.16: 47.13 0 time: 8.778 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_DELETE BR-12.16: 0.0 0 time: 8.457000000000001 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 8.202999999999999 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 8.151 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 5.196 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 5.171 ms
2016.09.14 18:32:53.227 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_ADD BR-12.16: 0.0 0 time: 4.184 ms
2016.09.14 18:32:53.223 Test (BR-12.16,H1)      Start...
2016.09.14 18:32:49.753 Test (BR-12.16,H1)      AsyncTradesTest: last ping 2.15 ms, build 1417
 
Renat Fatkhullin:

Lo más probable es que se note a partir de ahora, pero sin duda será visible en las dos últimas transacciones:

Gracias. La ayuda y el artículo son bastante escasos en cuanto a los procesos internos que hay detrás de cada tipo de transacción comercial.

En tu aclaración parece que las primeras cuatro líneas (8ms) no son un intercambio todavía. ¿Dónde se puede leer lo que ocurre realmente? Porque no se entiende y no está claro dónde conseguirlo.

 
fxsaber:

Gracias. La ayuda y el artículo son bastante escasos en cuanto a los procesos internos que hay detrás de cada tipo de transacción comercial.

En tu aclaración resulta que las primeras cuatro líneas (8ms) no son un intercambio todavía. ¿Dónde se puede leer lo que ocurre realmente? Porque no se entiende y no está claro dónde hay que subrayarlo.

No, yo no he dicho eso.

Esbocé el código apresuradamente y no describí todos los campos. Compruebe usted mismo en el depurador cada entrada a la función de mi script e imprima más campos, por favor.

 
fxsaber:

Gracias. La ayuda y el artículo están bastante mal escritos sobre los procesos internos que hay detrás de cada tipo de operación comercial.

Un ejemplo de un posible oyente de eventos de negociación se da en el artículo Por dónde empezar al crear un robot de comercio para la Bolsa de Moscú MOEX

//+------------------------------------------------------------------+
//|TradeTransactionListener.mq5
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PrintFormat("LAST PING=%.f ms",
               TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Función TradeTransaction|
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   static int counter=0;   // contador de llamadas a OnTradeTransaction()
   static uint lasttime=0; // hora de la última llamada OnTradeTransaction()
//---
   uint time=GetTickCount();
//--- si la última transacción fue hace más de 1 segundo
   if(time-lasttime>1000)
     {
      counter=0; // significa que se trata de una nueva operación comercial y que puede restablecer el contador
      if(IS_DEBUG_MODE)
         Print("Nueva operación comercial);
     }
   lasttime=time;
   counter++;
   Print(counter,". ",__FUNCTION__);
//--- resultado de la ejecución de la solicitud de operación
   ulong            lastOrderID   =trans.order;
   ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
   ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- el nombre del personaje en el que se produjo la transacción
   string trans_symbol=trans.symbol;
//--- tipo de transacción
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   switch(trans.type)
     {
      case  TRADE_TRANSACTION_POSITION:   // cambiar de posición
        {
         ulong pos_ID=trans.position;
         PrintFormat("MqlTradeTransaction: Position  #%d %s modified: SL=%.5f TP=%.5f",
                     pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
        }
      break;
      case TRADE_TRANSACTION_REQUEST:     // enviar una solicitud de operación
         PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
         break;
      case TRADE_TRANSACTION_DEAL_ADD:    // añadir una transacción
        {
         ulong          lastDealID   =trans.deal;
         ENUM_DEAL_TYPE lastDealType =trans.deal_type;
         double        lastDealVolume=trans.volume;
         //--- identificador de la transacción en el sistema externo - ticket asignado por la Bolsa de Moscú
         string Exchange_ticket="";
         if(HistoryDealSelect(lastDealID))
            Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
         if(Exchange_ticket!="")
            Exchange_ticket=StringFormat("(MOEX deal=%s)",Exchange_ticket);

         PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot   %s",EnumToString(trans_type),
                     lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD: // añadir una orden al historial
        {
         //--- identificador de la orden en el sistema externo - ticket asignado por la Bolsa de Moscú
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_FILLED)
           {
            if(HistoryOrderSelect(lastOrderID))
               Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("(MOEX ticket=%s)",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
      default: // otras transacciones 
        {
         //--- identificador de la orden en el sistema externo - ticket asignado por la Bolsa de Moscú
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_PLACED)
           {
            if(OrderSelect(lastOrderID))
               Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("MOEX ticket=%s",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
     }
//--- billete de pedido 
   ulong orderID_result=result.order;
   string retcode_result=GetRetcodeID(result.retcode);
   if(orderID_result!=0)
      PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//--- 
  }
//+------------------------------------------------------------------+
//| traduce los códigos numéricos de las respuestas a cadenas mnemocodes |
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
  {
   switch(retcode)
     {
      case 10004: return("TRADE_RETCODE_REQUOTE");             break;
      case 10006: return("TRADE_RETCODE_REJECT");              break;
      case 10007: return("TRADE_RETCODE_CANCEL");              break;
      case 10008: return("TRADE_RETCODE_PLACED");              break;
      case 10009: return("TRADE_RETCODE_DONE");                break;
      case 10010: return("TRADE_RETCODE_DONE_PARTIAL");        break;
      case 10011: return("TRADE_RETCODE_ERROR");               break;
      case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
      case 10013: return("TRADE_RETCODE_INVALID");             break;
      case 10014: return("TRADE_RETCODE_INVALID_VOLUME");      break;
      case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
      case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
      case 10017: return("TRADE_RETCODE_TRADE_DISABLED");      break;
      case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
      case 10019: return("TRADE_RETCODE_NO_MONEY");            break;
      case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
      case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
      case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION");  break;
      case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
      case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
      case 10025: return("TRADE_RETCODE_NO_CHANGES");          break;
      case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT");  break;
      case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT");  break;
      case 10028: return("TRADE_RETCODE_LOCKED");              break;
      case 10029: return("TRADE_RETCODE_FROZEN");              break;
      case 10030: return("TRADE_RETCODE_INVALID_FILL");        break;
      case 10031: return("TRADE_RETCODE_CONNECTION");          break;
      case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
      case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");        break;
      case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");        break;
      case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
      case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
      default:
         return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
         break;
     }
//---
  }
//+------------------------------------------------------------------+