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 4

 

Si reformulamos el problema como "con qué frecuencia se llama al código MQL5 desde el núcleo terminal", entonces todo debería medirse mal:

  1. Deberíamos eliminar todo el código MQL5 innecesario y dejar un par de contadores en una función desnuda para minimizar el coste de la propia medición
  2. Encontrar un punto de entrada OnXXXX adecuado y un método de generación forzada de llamadas desde el núcleo. Aquí tenemos que hacer una construcción de prueba separada para la medición.

En este caso, después de haber construido un polígono, realmente se puede medir todos los gastos generales en las llamadas MQL5 y obtener una característica interesante. Como es nuestra costumbre, a continuación, optimizar todo varias veces.

Esta es una tarea interesante y nos ocuparemos de ella.

 
fxsaber:


¡Ya lo tengo!

Sí, lo tenemos.

Lo siento, lo pasé por alto.

 
Renat Fatkhullin:

Si reformulamos el problema como "con qué frecuencia se llama al código MQL5 desde el núcleo terminal", entonces todo debería medirse mal:

  1. Deberíamos eliminar todo el código MQL5 innecesario y dejar un par de contadores en una función desnuda para minimizar el coste de la propia medición
  2. Encontrar un punto de entrada OnXXXX adecuado y un método de generación forzada de llamadas desde el núcleo. Aquí tenemos que hacer una construcción de prueba separada para la medición.

En este caso, después de haber construido un polígono, realmente se puede medir todos los gastos generales en las llamadas MQL5 y obtener una característica interesante. Como es nuestra costumbre, a continuación, optimizar todo varias veces.

Esta es una tarea interesante y lo haremos.

¡Gracias por no dejar cosas tan geeky sin atención!

Probablemente, necesitamos una construcción separada para medir la velocidad de llegada de los paquetes de cotización. Justo lo que quería medir.

[Eliminado]  
Renat Fatkhullin, fxsaber - gracias por la aclaración.
 
fxsaber:

Por favor, haga otra prueba de velocidad MT5 en una cuenta real

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Probando 'CopyTicks'

fxsaber, 2016.09.13 11:11 AM

si a través de OrderSendAsync envío dos limitadores (BuyLimit1_price < BuyLimit2_price) dentro del spread, ¿generará la bolsa dos ticks consecutivos con mejora bid-price al mismo tiempo (con precisión de 1ms)?

Permítanme explicar lo que esto hará.

Cuando se envía BuyLimit1 dentro del spread, nos llegará un tick desde la bolsa con la hora de su nacimiento (generará un nuevo Bid). Después de BuyLimit2 - otro tick con su hora de nacimiento. La diferencia de estos dos tiempos es la característica de velocidad de entrega de las órdenes de trading MT5 a la bolsa.

Para que las pérdidas monetarias de tal experimento sean mínimas, puede enviar no dos BuyLimits de forma asíncrona, sino BuyLimit y SellLimit dentro del spread y elegir algún instrumento comercial poco líquido.

 

Antes de comparar, tenemos que "terminar" todo el complejo de operaciones comerciales

(recepción de datos, justificación de operaciones, recepción de confirmación de operaciones).

Añadido Build 1395, real

2016.09.14 17:30:03.100 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': accepted sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56 placed for execution in 3750.466 ms
2016.09.14 17:30:06.851 Trades  'xxxxx': cancel order #44309414 sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:10.014 Trades  'xxxxx': deal #29388895 sell 1.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:10.014 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:10.385 Trades  'xxxxx': deal #29388914 sell 4.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:12.374 Trades  'xxxxx': accepted exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:12.375 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market placed for execution in 2360.902 ms
2016.09.14 17:30:12.398 Trades  'xxxxx': deal #29389024 buy 1.00 BR-11.16 at 47.25 done (based on order #44309578)
2016.09.14 17:30:12.401 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.006 Trades  'xxxxx': accepted exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.007 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market placed for execution in 606.852 ms
2016.09.14 17:30:13.009 Trades  'xxxxx': deal #29389140 buy 4.00 BR-11.16 at 47.25 done (based on order #44309644)
2016.09.14 17:30:13.015 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74 placed for execution in 342.736 ms
2016.09.14 17:30:13.668 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.712 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.716 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79 placed for execution in 48.228 ms
2016.09.14 17:30:13.718 Trades  'xxxxx': deal #29389165 buy 5.00 BR-12.16 at 47.79 done (based on order #44309680)
2016.09.14 17:30:13.721 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.740 Trades  'xxxxx': accepted exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.741 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market placed for execution in 20.867 ms
2016.09.14 17:30:13.778 Trades  'xxxxx': deal #29389166 sell 5.00 BR-11.16 at 47.29 done (based on order #44309682)
 

Foro sobre negociación, sistemas automatizados de negociación y comprobación de estrategias de negociación

FORTS. Preguntas sobre la ejecución

Renat Fatkhullin, 2016.08.23 16:35

Solo tienes que esperar 5-10 ms e intentarlo de nuevo.

Lo que pasa es que obtienes la confirmación de la transacción inmediatamente, pero los detalles completos de la transacción llegan de forma asíncrona después de eso. Puede tardar de 0 a N ms, normalmente entre 1-2 ms (depende del ping, claro).

Debido a esta circunstancia, la comparación con QLUA no es favorable a MT5.
 
prostotrader:

Antes de comparar, tenemos que "terminar" todo el complejo de operaciones comerciales

(recepción de datos, justificación de operaciones, recepción de confirmación de operaciones).

Añadido Build 1395, real


Acabo de hacer una operación similar manualmente: 11.7 ms

2016.09.14 18:17:26.298	Trades	'10321': order #44324961 buy limit 1.00 / 1.00 BR-12.16 at 47.00 done in 11.759 ms
2016.09.14 18:17:26.295	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00 placed for execution
2016.09.14 18:17:26.293	Trades	'10321': accepted buy limit 1.00 BR-12.16 at 47.00
2016.09.14 18:17:26.286	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00
 
Renat Fatkhullin:

No quiere ver el informe real, sino utilizar su propio método defectuoso para medir el tiempo de transacción.

Y no quiere admitir sus errores, prefiriendo creer cifras monstruosas de su script erróneo.

Acabo de hacer una operación similar manualmente: 11,7 ms.

¿De qué estás hablando, Renate?

Esto es un extracto del log de Temninal, ¡no de mi propio log!

 
fxsaber:
Debido a esta circunstancia, es necesario ajustar ligeramente la comparación con QLUA no a favor de MT5.

No es necesario ajustar nada. Mi frase era para el 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:

ulong ExtTicks=0;
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- salida del ping al servidor de comercio en milisegundos
   PrintFormat("AsyncTradesTest: last ping %.2f ms, build %d",TerminalInfoInteger(TERMINAL_PING_LAST)/1000.0,TerminalInfoInteger(TERMINAL_BUILD));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   Print(EnumToString(trans.type)," ",trans.symbol,": ",trans.price," ",result.order," time: ",(GetMicrosecondCount()-ExtTicks)/1000.0," ms");
  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
   static bool started=false;
//--- ejecuta la serie una vez en el primer tick
   if(!started)
     {
      started=true;
      //--- rellene la consulta
      MqlTradeRequest req={};
      MqlTradeResult  res={};

      req.volume      =1;
      req.symbol      =_Symbol;
      req.price       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      req.sl          =0;
      req.tp          =0;
      req.deviation   =100;
      req.type_filling=ORDER_FILLING_RETURN;
      req.action      =TRADE_ACTION_DEAL;
      req.type        =ORDER_TYPE_BUY;
      req.magic       =2016;
      //--- ejecuta el bucle de operación
      ExtTicks=GetMicrosecondCount();
      Print("Start...");
      OrderSendAsync(req,res);
     }
  }

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

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

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.