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

 
fxsaber:
Estaba en el ordenador, no hizo ningún cálculo. No cargó la CPU con nada.

19 ms y 48 ms para la ejecución de SymbolInfoTick. Hubo varias docenas de casos en los que la duración fue de cientos de microsegundos. Pero no los cité.


Al parecer, para reproducirlo, hay que hacer funcionar a los asesores de combate durante 24 horas, y luego sólo mirar. En mi opinión, no es realista averiguar qué es lo que inicia esos desfases.

A veces el ordenador puede estar descargando actualizaciones o ejecutando algunas tareas de servicio. Además, las fluctuaciones de la tensión de red pueden afectarla. De esta manera se puede llegar a las tarjetas de red programables, donde toda la lógica del bot se escribe a nivel de hardware :) pero incluso allí habrá retrasos debido a las fluctuaciones del campo cuántico
 
Maxim Dmitrievsky:
A veces la computadora puede estar bombeando actualizaciones o haciendo algunas tareas de servicio. Además, las variaciones de la tensión de la red pueden afectarla. De esta manera se puede llegar a las tarjetas de red programables, donde toda la lógica del bot está cableada :) pero incluso allí habrá retrasos debido a las fluctuaciones del campo cuántico

Los desarrolladores han hecho lo mejor que han podido. Y sin eso, la rama ha proporcionado un código que muestra cómo el tick va por detrás del Market Watch y viceversa. Como la secuencia de llegada de la garrapata está rota y probablemente algo más. En definitiva, se publica un código desagradable y válido para reproducir otras situaciones.

 
Anton:

SymbolInfoTick envía los datos recibidos del servidor del broker. Lo que el servidor envía es lo que se obtiene.

¿Se ejecutaSymbolInfoTick() en modo de bloqueo o en modo de no bloqueo?

Por ejemplo, está en el cuerpo del bucle while y no hay conexión o el mercado está cerrado por fin de semana,
entonces se bloqueará deteniendo el bucle o se ejecutará de forma asíncrona?

 
fxsaber:

cómo la vigilancia del mercado va a la zaga de la vigilancia del mercado y viceversa.

Es decir, ¿SymbolInfoTick capta un nuevo tick y obtenemos un Ask y un Bid diferentes a través del evento Market Watch (sin esperar a que el Market Watch cambie)? No era posible hacerlo hace un año más o menos. SymbolInfoTick y CopyTick y la cosecha siempre conducen al mismo tick. Si obtiene ticks a través de varias funciones OnXXX, por supuesto, obtendrá algo a través de una función, y algo a través de otra...

 
pivomoe:

Es decir, ¿SymbolInfoTick capta un nuevo tick y obtenemos un Ask y Bid diferente a través del sondeo de la copa (sin esperar al evento de cambio de copa)?

Aquí.

 
fxsaber:

Aquí.

Como pensaba, estás probando OnBookEvent y OnTick, no MarketBookGet y SymbolInfoTick. Si se hace la prueba con este esquema, se tendría todo emparejado:

While(1)
{
 Sleep(1)
 Запрос тика через SymbolInfoTick
 Запрос тика через стакан MarketBookGet
 Проверка на совпадение. 
}

p.s. Lea sus mensajes a continuación. Tú también lo entiendes. ¿Por qué necesita OnBookEvent y OnTick? En mi ejemplo Sleep(1) tarda 1-2 milisegundos, la petición y el tick con SymbloInfoTick tarda menos de MICROsegundo. El procesador ya está descansando el 99,9% del tiempo si no hay ticks. ¿Cuál es la ventaja de utilizar OnBookEvent y OnTick?

 
pivomoe:

Como pensaba, estás probando OnBookEvent y OnTick, no MarketBookGet y SymbolInfoTick. Si hicieras las pruebas de acuerdo con este esquema, tendrías todo igualado:

p.s. Lea sus mensajes a continuación. Tú también lo entiendes. ¿Por qué necesita OnBookEvent y OnTick? En mi ejemplo Sleep(1) tarda 1-2 milisegundos, la petición y el tick con SymbloInfoTick tarda menos de MICROsegundo. El procesador ya está descansando el 99,9% del tiempo si no hay ticks. ¿Cuál es el beneficio de usar OnBookEvent y OnTick?

Sin una pizca de diplomacia, estás diciendo tonterías. Sleep(1) es una décima de milisegundo. Sólo veo una teorización.

Los usuarios de OnTick quieren ver una garrapata fresca y no la que llegó al Terminal hace algún tiempo. Puedes poner SymbolInfoTick justo después de MarketBookGet en el código fuente.


Los desarrolladores han reconocido plenamente dos problemas con su silencio.

 
fxsaber:

Sin una pizca de diplomacia, estás diciendo tonterías. Sleep(1) es una docena de milisegundos. Sólo veo una teorización.

Los usuarios quieren ver un tic fresco en OnTick y no un tic que llegó al Terminal hace tiempo. Puedes poner SymbolInfoTick justo después de MarketBookGet en el código fuente.


Los promotores, con su silencio, han reconocido plenamente dos problemas.

No siempre y no cada décima de milisegundo. Comprobado con un simple script

//+------------------------------------------------------------------+
//|                                                    TestSleep.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#define  ITERATIONS 10000
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1=GetMicrosecondCount();
   for(int i=0; i<ITERATIONS; i++)
     {
      Sleep(1);
     }
   ulong t2=GetMicrosecondCount()-t1;
   PrintFormat("total %I64u microseconds (%.3f ms per iteration)",t2,double(t2)/(ITERATIONS*1000.0));
  }
//+------------------------------------------------------------------+

Aquí está mi registro

2020.11.04 13:14:31.590 TestSleep (EURUSD,H1)   total 17058138 microseconds (1.706 ms per iteration)

Los usuarios de OnTick siempre ven la garrapata más reciente.

Los usuarios de OnBookEvent siempre ven el tick más reciente.

Pero si quieres comparar los ticks recibidos con OnTick y los recibidos con OnBookEvent te vas a llevar un chasco porque los eventos se procesan secuencialmente y no en paralelo. Eso es lo que el usuario pivomoe trató de decirle

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Slava:

No siempre y no en todas partes una décima de milisegundo. Comprobado con un simple script

Aquí está mi registro.

Y aquí está mi registro.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  for (int i = 0; i < 5; i++)
    _BV(Sleep(1), 1);
}

Resultado.

2020.11.04 15:19:32.565 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 5326 mcs.
2020.11.04 15:19:32.580 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14928 mcs.
2020.11.04 15:19:32.596 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15930 mcs.
2020.11.04 15:19:32.611 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14910 mcs.
2020.11.04 15:19:32.627 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15941 mcs.

Los usuarios de OnTick siempre ven la garrapata más reciente.

Los usuarios de OnBookEvent siempre ven el tick más reciente.

El resultado de ejecutar el EA en un solo gráfico desde una máquina que no está ocupada de ninguna manera.

2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 6564 mcs.
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [0] 1.17192 1.17192     true     108150
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [1] 1.17192 1.17192    false         30
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [2] 1.17189 1.17191     true      88210
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [3] 1.17189 1.17191    false       6564
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 3888 mcs.
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [0] 1.17192 1.17192    false     117471
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [1] 1.17192 1.17192     true         11
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [2] 1.17192 1.17193     true     882710
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [3] 1.17192 1.17193    false       3888
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       Alert: OnTick-lag! - 4653 mcs.
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [0] 1.17195 1.17195     true      86660
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [1] 1.17195 1.17195    false         11
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [2] 1.17194 1.17194    false     220122
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [3] 1.17194 1.17194     true       4653

Marca ticks idénticos, que son recibidos en diferentes funciones On por los métodos correspondientes. El retraso puede ser de decenas de milisegundos si se ejecuta en seis gráficos en lugar de uno.

Pero si quiere comparar los ticks recibidos en OnTick y los recibidos en OnBookEvent, entonces se decepcionará porque los eventos se procesan secuencialmente, no en paralelo. Lo que el usuario pivomoe trató de decirle

Si un OnBookEvent/OnTick casi vacío se activa 20 milisegundos más tarde que el correspondiente OnTick/OnBookEvent casi vacío, ¿está bien?


ZS Mientras prestas atención al hilo, hay otro código de reproducción aquí. Allí, en Market Watch, los ticks llegan con una hora anterior a la de Market Watch.

 
fxsaber:

Si un OnBookEvent/OnTick casi vacío se activa 20 milisegundos más tarde que el correspondiente OnTick/OnBookEvent casi vacío, ¿está bien?


La cola EA es un recurso bloqueable. Cuando se escribe un evento en la cola, el Asesor Experto espera (a menos que el Asesor Experto esté procesando un evento en ese momento)

Los eventos para el Asesor Experto provienen de la cola de eventos del gráfico correspondiente, que a su vez proviene del ciclo de procesamiento del símbolo correspondiente. Y este bucle de procesamiento no sólo distribuye los eventos a sus propios gráficos, sino que también hace muchas otras cosas.

Ya te he dicho que Windows no es un sistema operativo en tiempo real.

Razón de la queja: