MT5 y la velocidad en acción

 

La MT5 es una plataforma ágil. Pero hay cuellos de botella que anulan todos los esfuerzos de negociación rápida.

Me gustaría recoger los problemas aquí, discutirlos y resolverlos en algún lugar con mi propio esfuerzo, en algún lugar con la ayuda de los Desarrolladores.

 

HistorySelect.


Esta es una característica increíblemente cara. Y, por desgracia, ninguna cantidad de caché puede hacer que su velocidad sea aceptable ahora.


Por ejemplo, en los EA de campo de batalla es importante trabajar con datos reales. En particular, que los ticks de Market Watch y CopyTicks no estén desactualizados si es posible.

Para ello, existen mecanismos no muy buenos, pero obligados, para comprobar la pertinencia de los datos de precios actuales. Una parte de este mecanismo consiste en detectar situaciones en las que una operación sobre un símbolo ha pasado más tarde que el último tick. Esto no ocurre raramente, por lo que es importante saber si la garrapata actual está o no actualizada.


Para esta detección, es necesario poder acceder al historial de ofertas recientes. Se hace utilizando el HistorySelect de la siguiente manera esquemática.

void OnTick()
{
  MqlTick Tick;

  if (SymbolInfo(_Symbol, Tick) && HistorySelect(Tick.time, INT_MAX)) // Взяли история торгов со времени текущего тика.
    // Проверяем актуальность тика через сравнение Tick.time_msc и DEAL_TIME_MSC.
}


Desafortunadamente, tal llamada de HistorySelect toma de 5 a 30 milisegundos (lo medí yo mismo en Release-EX5). Cuando el Asesor Experto hace varias actualizaciones de este tipo en OnTick (en el buen sentido, se debe hacer después de cada pausa. Por ejemplo, después de cada OrderSend.), entonces todo se vuelve insanamente caro/largo. HistorySelect puede consumir colectivamente varios segundos en un solo OnTick.


Queridos desarrolladores, ¿por qué es tan caro? Esta función puede ejecutarse instantáneamente con una implementación adecuada.


Por favor, piense en introducir este tipo de funciones para trabajar con el historial.

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

Cerrarían completamente los frenos de HistorySelect. Porque solucionaría el problema de conseguir las últimas ofertas muy baratas. Ahora mismo, es un tormento en ejecución de combate.


No siempre es posible controlar las últimas operaciones a través de OnTradeTransaction, por lo que es urgente trabajar rápidamente con el historial.

 

Acceso a los eventos ChartEvent y TradeTransaction.


Se ha sugerido una idea y una de las posibles implementaciones. Así que lo copio aquí.

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

Errores, fallos, preguntas

Sergey Dzyublik, 2020.05.20 00:47

Sugerencia a los desarrolladores.
Por favor, considere la posibilidad de añadir en MQL una función que permita a los usuarios llamar independientemente al procesamiento de los "mensajes" acumulados en OnChartEvent desde el código personalizado.
1) Esto permitiría llamar al manejo de OnChartEvent entre las iteraciones de un cálculo que consume tiempo, haciendo que la GUI del usuario al menos responda de alguna manera sin construir un huerto de: pool de tareas, transferencia de datos, sincronización de estados, guardar y restaurar el contexto...
2) Esto permitiría utilizar OnChartEvent en los scripts.

Gracias.

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

Bichos, errores, preguntas

Sergey Dzyublik, 2020.05.20 13:39

No del todo, preferiría llamar a esta función como HandleNextEvent, una posible firma:

bool HandleNextEvent (ENUM_EVENT_TYPE);


Cuando se llama, de forma similar a GetNextEvent, comprueba si el ENUM_EVENT_TYPE especificado está presente en la cola,
y si este evento está presente, pasa automáticamente el control al código de usuario del manejador correspondiente (OnChartEvent, OnTrade, OnTradeTransaction, ... (gracias a fxsaber por el añadido)).
Devuelve true si había un evento en la cola, en caso contrario devuelve false.


Posible caso de uso:

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....

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

Errores, fallos, preguntas

Sergey Dzyublik, 2020.05.20 14:38

2) Así es. Si me interesa el procesamiento de un evento en particular, y no de todos los eventos del sistema, estaría bien poder procesar sólo este tipo de eventos, dejando el procesamiento de otros eventos en el modo habitual.
3) Si se llama de nuevo a HandleNextEvent durante el proceso - llamar y procesar. Lo único que puede ocurrir es el desbordamiento de pila, pero esto es problema del usuario y del código, no del desarrollador.
4) Los eventos que no entran en el filtro permanecen en la misma secuencia y serán llamados cuando el usuario devuelva el control al sistema, como es habitual.


Ahora tenemos que hacer muletillas para llegar a los mismos TradeTransaction-events dentro del código en ejecución.

Los Asesores Expertos realmente necesitan esta característica para la aplicación de combate.

 
fxsaber:

No siempre es posible controlar las transacciones recientes a través de OnTradeTransaction, por lo que es pertinente un trabajo rápido con el historial.

Por favor, dé un ejemplo de cuándo no es posible controlar.

 
prostotrader:

Por favor, dame un ejemplo en el que no haya control.

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

Peculiaridades de mql5, consejos y trucos

fxsaber, 2020.04.23 19:51

Las flechas de apertura/cierre que MT5 coloca automáticamente en tiempo real se basan en los eventos de TradeTransaction.


Acabo de ver que estos eventos (apertura y cierre de una docena de posiciones) no llegaron al terminal por una interrupción momentánea de la conexión - fue tan casual, que estaba sentado en mi PC y los miré de primera mano. Por lo tanto, no hay flechas correspondientes.


Y, como se ha dicho a veces aquí, no se puede confiar en OnTradeTransaction en los EA de combate. Lástima que no haya un mecanismo público fiable para tratar con OrderSendAsync.


Y también cuando se colocan varios OrderSend dentro del código. Cuando un OrderSend depende del anterior.

 
fxsaber:

También al colocar múltiples OrderSend dentro del código. Cuando un OrderSend depende del OrderSend anterior.

Si se interrumpe la comunicación, tampoco se añadirá nada al historial.

Llevo más de 5 años utilizandoOrderSendAsync (entonces había problemas con OrderSend) + OnTradeTransaction() sólo en modo de combate - ¡sin problemas!

Si hay una interrupción de la conexión, entonces se averigua por el asistente que se asigna a cada orden (en FOREX es difícil de hacer porque los nombres de los símbolos no están estandarizados).

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

Si se interrumpe la comunicación, tampoco se añadirá nada al historial.

Llevo más de 5 años utilizandoOrderSendAsync (entonces había problemas con OrderSend) + OnTradeTransaction() sólo en modo de combate - ¡sin problemas!

No se puede dejar de notar cómo se le ha hincado el diente a Async+OnTrade durante años. Si haces la actualización de datos a través de este mecanismo y todo lo demás, no hay problema.

Por favor, no digas aquí "no sabes cocinar", al menos.

 
fxsaber:

No se puede dejar de notar como se ha estado presionando por Async+OnTrade durante años. También se hacen actualizaciones de datos a través de este mecanismo y todo lo demás, porque no hay ningún problema.

Por favor, no reclames que "simplemente no sabes cocinar" aquí al menos.

Estás "luchando" por microsegundos y al mismo tiempo estás escribiendo toneladas de código, lo que también te hace perder tiempo,

y el 99% de las veces no lo necesitas.

 
Te animo a que te expreses sólo de forma constructiva.
 
fxsaber:

Acceso a los eventos ChartEvent y TradeTransaction.

Se ha sugerido una idea y una de las posibles implementaciones. Así que lo copio aquí.

Ahora, para poder acceder a esos TradeTransaction-events dentro del código en ejecución, tenemos que muletear.

Estás haciendo muletas en una dirección equivocada:

Dejar en las funciones OnXXX sólo la copia de eventos (parámetros) en cola y llamar a la función principal OnMain. Mueve todo su código a las funciones duplicadas de On2XX. Y llame a estas funciones duplicadas On2XX desde el OnMain en la secuencia que necesite, pasándoles a su vez los datos de las colas como parámetros.

A continuación, ejecute las mediciones y mostrar la ganancia de velocidad, y entonces usted puede sugerir para complementar MQL con la funcionalidad adecuada. Pero, ¿por qué añadir, si ya lo has hecho todo tú aquí y ahora?

 
A100:

Deja las funciones OnXXX sólo copiando eventos (parámetros) en la cola y llamando a la función principal OnMain. Mueve todo el código a las funciones duplicadas de On2XX. Y llame a estas funciones duplicadas On2XX desde el OnMain en la secuencia que necesite, pasándoles a su vez los datos de la cola como parámetros.

Por favor, dame un esquema-código rudimentario de esta idea. A primera vista parece un completo malentendido.

Mientras se ejecuta la función OnMain no hay forma de conocer el estado de la cola real actual. La única solución para hacer esto es un programa espía como se indica en el enlace.

Razón de la queja: