MT5 y la velocidad en acción - página 9

 
fxsaber:

Resulta ser un hecho frecuente. No se han llamado las funciones de negociación.

SymbolInfoTick no es un mal retraso a veces. La HFT puede tener mucha experiencia con estos desfases inesperados.

Por favor, pregunte a los desarrolladores para encontrar las razones. Mientras tanto, es obvio que en los EA de batalla su perfilador es imprescindible.

¿Qué mostrará la prueba en el terminal "vacío"?

void OnStart()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one SymbolInfoTick: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("SymbolInfoTick max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   start=GetMicrosecondCount();
   for(int i=0; i<count; i++)
      SymbolInfoTick(_Symbol, Tick);
   end=GetMicrosecondCount()-start;
   Print(count," SymbolInfoTick = ",DoubleToString(end/1000.0,2)," ms");
  }

Debería ser algo así:

2020.06.04 11:02:30.123 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.138 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:30.138 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 14.85 ms
2020.06.04 11:02:31.433 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.051 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:31.448 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.17 ms
2020.06.04 11:02:33.064 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.035 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:33.079 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.12 ms

A menos que nos diga con detalle qué está haciendo, cómo está cargando exactamente el terminal, nos será difícil encontrar las razones.

 
Anton:

¿Qué mostrará la prueba en un terminal "vacío"?

Debería ser algo así:

        SymbolInfoTick max time: 0.034 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 8.56 ms
        SymbolInfoTick max time: 0.047 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.04 ms
        SymbolInfoTick max time: 0.045 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.02 ms

A menos que nos diga en detalle lo que está haciendo, exactamente cómo está poniendo la carga en el terminal, será difícil para nosotros encontrar las razones.

100K iteraciones no es un indicador. Dado que la función no siempre se ralentiza, pero a veces.

De hecho, tengo que desactivar trozos del EA de combate hasta que deje de frenar. Entonces puedo proporcionar el código. Tengo que esperar.

 
fxsaber:

De hecho, necesito desactivar trozos del asesor de combate hasta que los frenos se detengan. Entonces puedo proporcionar el código. Tengo que esperar.

Ejecute este EA en algunos personajes para obtener un resultado rápido.

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

void OnTick()
{
  MqlTick Tick[1];
  
  if (_B(CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1), 1)) // Не знаю, влияет это или нет.
    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
}


Lo tengo en cinco minutos.

        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 9 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 3 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 4 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 5 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.


Parece que es suficiente con dejar sólo esto (sin CopyTicks) en el EA.

    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
 
fxsaber:

100K iteraciones no es un indicador. Como la función no siempre se ralentiza, pero a veces.

Propongo cambiar el concepto de definición de la solidez de una función.

Una función es rápida si no hay picos en su tiempo de ejecución.


Como se ha demostrado anteriormente, incluso las funciones simples tienen estos picos. A veces muy grandes. No tengo ni idea de qué tiene que ver esto. Pero es obvio que todas las funciones críticas para el comercio deben ser comprobadas para la presencia de picos utilizando el método sugerido anteriormente. Es decir, ejecutamos y controlamos los picos superiores a un milisegundo durante un par de horas.


Hay que conseguir que no haya picos al menos en un Terminal vacío. Las iteraciones rápidas de 100K resultan ser nada.

 
fxsaber:

Propongo cambiar el concepto de definición de la solidez de una función.

Una función es rápida si no hay picos en su duración.


Como se ha mostrado anteriormente, incluso las funciones simples tienen estos picos. A veces muy grandes. No tengo ni idea de qué tiene que ver esto. Pero es obvio que todas las funciones críticas para el comercio deben ser comprobadas para la presencia de picos utilizando el método sugerido anteriormente. Es decir, ejecutamos y controlamos los picos superiores a un milisegundo durante un par de horas.


Hay que conseguir que no haya picos al menos en un Terminal vacío. Las iteraciones rápidas de 100K resultan ser nada.

A veces ocurre que el temporizador muestra una cantidad de tiempo acumulada si otra tarea está en marcha. Por ejemplo, puede ocurrir cuando se trabaja con el lienzo - cuando la función de visualización establece la tarea para mostrar sin crear una imagen y vuelve. Después de eso cualquier otra función se ejecuta secuencialmente, por ejemplo el mismo comentario, sin embargo el proceso de mapeo del lienzo se inicia en el lenguaje de la CPU y sólo después de eso se muestra el kanvas. Al medir el tiempo se puede ver que el comentario tarda mucho en salir, pero la función de visualización del kanvas se ejecuta en 0 ms.

 
fxsaber:

y controlar los picos superiores a un milisegundo durante un par de horas.

Tenemos que asegurarnos de que no haya picos, al menos en un terminal vacío. Las iteraciones rápidas de 100K resultaron ser inútiles.

He redactado un Asesor Experto de este tipo para la supervisión.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    MqlTick Ticks[];
    
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, 1));
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));
    _B2(CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));

    _B2(HistorySelect(Tick.time, INT_MAX));
    
    _B2(HistoryDealsTotal());
    _B2(HistoryDealGetTicket(0));
    _B2(HistoryDealGetInteger(0, DEAL_MAGIC));
    _B2(HistoryDealGetDouble(0, DEAL_PRICE));
    _B2(HistoryDealSelect(0));

    _B2(HistoryOrdersTotal());
    _B2(HistoryOrderGetTicket(0));
    _B2(HistoryOrderGetInteger(0, ORDER_MAGIC));
    _B2(HistoryOrderGetDouble(0, ORDER_PRICE_CURRENT));
    _B2(HistoryOrderSelect(0));
    
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    _B2(TimeTradeServer());
    
    _B2(OrdersTotal());
    _B2(OrderSelect(0));
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
    
    _B2(PositionsTotal());
    _B2(PositionSelect(Symb));
    _B2(PositionSelectByTicket(0));
    _B2(PositionGetDouble(POSITION_PRICE_CURRENT));
    _B2(PositionGetInteger(POSITION_MAGIC));
    _B2(PositionGetString(POSITION_SYMBOL));
    
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
    _B2(AccountInfoInteger(ACCOUNT_MARGIN_MODE));
    
    MqlTradeRequest Request = {0};
    MqlTradeCheckResult CheckResult;

    _B2(OrderCheck(Request, CheckResult));
    
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);
}


Obtuve el resultado en cinco minutos de seguimiento.

        Alert: Time[Test6.mq5 18: HistorySelect(Tick.time,INT_MAX)] = 21 ms.
        Alert: Time[Test6.mq5 24: HistoryDealSelect(0)] = 4 ms.
        Alert: Time[Test6.mq5 10: SymbolInfoTick(Symb,Tick)] = 24 ms.
        Alert: Time[Test6.mq5 14: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 4 ms.
        Alert: Time[Test6.mq5 30: HistoryOrderSelect(0)] = 3 ms.
        Alert: Time[Test6.mq5 35: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 2 ms.


SZZY Con este valor del parámetro de entrada hay muchas menos alertas.

input int inAlertTime = 10; // Нижний порог в миллисекундах


Pero el resultado también es más significativo.

        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 19 ms.
        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 13: SymbolInfoTick(Symb,Tick)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 148 ms.
        Alert: Time[Test6.mq5 74: SymbolName(0,true)] = 11 ms.
 

Por último, en mi caso, modificar un montón de pedidos a veces lleva entre 3 y 10 segundos por pedido. Después vuelve a tardar 0,1 segundos.

He sacado los registros del servidor - es instantáneo allí.


Es muy desagradable en un Asesor Experto de batalla.

2020.06.04 15:24:48.771 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 61 ms.
2020.06.04 15:25:21.729 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 29 ms.
2020.06.04 15:27:57.842 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 142 ms.


Unos valores fantásticos.

 
fxsaber:

Por último, conmigo la modificación de un montón de pedidos a veces tarda entre 3 y 10 segundos por pedido. Después vuelve a tardar 0,1 segundos.

Los registros del servidor elevados - allí al instante.

La situación se repitió en otro servidor comercial.

El terminal modificó la posición de apertura en 2,5 segundos. En el servidor - 2 milisegundos.

Lo más probable es que este sea también el origen de los problemas con la ejecución de FORTS.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.03.30
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 

Retransmite.

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

Plataforma MetaTrader 5 build 1700 beta: Proyectos en MetaEditor y herramientas sintéticas

Renat Fatkhullin, 2017.12.14 12:47

Es un indicador de la calidad de la comunicación. El porcentaje de paquetes de red retransmitidos en el protocolo TCP/IP.

Se calcula globalmente a nivel de interfaz de red para todas las aplicaciones en todo el sistema operativo. Cuando sospeche que hay lentitud y problemas, mire esta métrica. Crítico cuando el servidor del corredor está muy lejos. Por ejemplo, para los comerciantes asiáticos y un corredor en Europa.

Ya con una tasa de retransmisión del 3% se puede decir que no se puede comerciar. El nivel extremo de retransmisiones viene dado por una mala wifi.

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

Nuevo MetaTrader 5 build 2360: Integración ampliada con SQLite

Renat Fatkhullin, 2020.04.06 12:33

La norma debería ser menos del 1%. Y ya un 3% de pérdida de red acaba con los servicios de baja latencia.

Por ejemplo, nuestras retransmisiones son del 0,68 al 0,75% con, obviamente, más usuarios (tenemos 17k online en MetaQuotes-Demo). Y servimos a todo el mundo, no a Moscú/Rusia.

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

Bichos, errores, preguntas

Renat Fatkhullin, 2017.12.17 23:03

Son estadísticas de la interfaz de red de todo el ordenador, donde Metatrader es sólo uno de los usuarios. No está necesariamente relacionado con el servidor de comercio.

Las estadísticas generales pueden ser fácilmente corrompidas por un navegador web después de fallar en el acceso a algún sitio con problemas y distante. También es posible que una wifi local tenga un conflicto de red y obtenga decenas de retransmisiones porcentuales en momentos aleatorios.

En caso de un 20% de retransmisiones no habrá conexión con el servidor de comercio y las reconexiones serán constantes e interminables. El terminal tiene una conexión constante e incluso un 3-5% de retransmisiones será fatal para que mantenga conexiones largas.

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

Bichos, errores, preguntas

Renat Fatkhullin, 2017.12.18 11:36

Tenga en cuenta que se trata de una característica técnica de su pila TCP/IP local , comunicada por el sistema operativo, y no un indicador de la calidad de una conexión concreta con los servidores de comercio. Incluye toda la actividad de la red, incluida la actividad del sistema/teléfono.


Se sabe que la conexión de un clúster de negociación es de alta calidad y se registran muchos parámetros (es una funcionalidad estándar de la plataforma), recogiendo instantáneas de un minuto y su posterior análisis.

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

Bichos, errores, preguntas

Renat Fatkhullin, 2017.12.18 00:13

Comprobado.

Ninguno de los nodos de nuestro clúster de demostración, incluido el de Asia, tuvo ningún reinicio o aumento del nivel de retransmisión durante todo el día (y también en otros días). Todo está entre el 0,5% y el 1,5% normal.


Parece que tengo muchos.

Ya es medianoche, los cotizantes rara vez se actualizan. Las retransmisiones aumentan ante mis ojos. Quiero poner la Alerta en el VPS a un valor alto > 1% para operar con baja latencia. Pero con valores tan grandes esta idea carece de sentido.


¿Qué puedo recomendar? ¿Hacer tracert al servidor de comercio? ¿Algún tipo de programa de control? En general, ¿cómo asegurarse de que la MT5 está preparada para la baja latencia?


ZS En cuanto las cotizaciones comienzan a moverse más rápido, el índice cae muchas veces.

 
fxsaber:

Retransmisores.


Parece que tengo mucho.

De 5 a 6 de la mañana:

Hogar (óptica, ETH al router, cable al ordenador) - 8-19%, ping 60-70

VPS en los Países Bajos (actualmente 1 MT5 con 9 gráficos de divisas/11) - 1,2-1,6%, ping 3,7

Razón de la queja: