Discusión sobre el artículo "WebRequest multiflujo asincrónico en MQL5"

 

Artículo publicado WebRequest multiflujo asincrónico en MQL5:

En el artículo se analiza una biblioteca que permite aumentar la efectividad del trabajo con solicitudes HTTP en MQL5. La ejecución de WebRequest en el modo no bloqueante se ha implementado en flujos adicionales usando gráficos y expertos auxiliares, intercambio de eventos personalizados y lectura de recursos compartidos. Se adjuntan los códigos fuente.

La implementación de los algoritmos requiere con frecuencia el análisis de información de diferentes fuentes externas, en concreto de Internet. MQL5 ofrece la función WebRequest para enviar solicitudes HTTP al "mundo exterior", pero dicha función, por desgracia, tiene un defecto muy notable. Esta función es sincrónica, y por eso bloquea el funcionamiento del experto durante todo el tiempo de ejecución de la solicitud. Recordemos que para cada experto en MetaTrader 5 se reserva un único flujo, que ejecuta consecutivamente las llamadas disponibles a las funciones API en el código, y que también inicia los manejadores de los eventos entrantes (tales como los ticks, los cambios en la profundidad de mercado de BookEvent, el temporizador, las transacciones comerciales, los eventos del gráfico, etc). En cada momento se ejecuta solo un fragmento de código, mientras que las demás "tareas" esperan su momento en las colas, hasta que el fragmento actual no retorne el control al núcleo.

Por ejemplo, si el experto debe procesar nuevos ticks en tiempo real, y además de ello, debe comprobar periódicamente las noticias económicas en uno o varios sitios web, no resultará posible ejecutar ambas misiones sin perjuicio alguno para una u otra. En cuanto el WebRequest se ejecuta en el código, el experto se queda "colgado" en la línea con la llamada de la función, y el evento sobre los nuevos ticks se omitirá. Incluso teniendo en cuenta que los ticks omitidos se pueden leer después con la ayuda de la función CopyTicks, el momento de la toma decisiones ya se habrá dejado escapar. Así, esta situación se ilustra con la ayuda de un diagrama UML de secuencialidad:

Diagrama de secuencia de procesamiento de eventos con código de bloqueo en un flujo

Fig.1 Diagrama de secuencia de procesamiento de eventos con código de bloqueo en un flujo

Autor: Stanislav Korotky

 

Como siempre, ¡fuerte! Si se pudiera generalizar la biblioteca, se podría crear un conjunto de herramientas listo para crear fácilmente asincronía de cualquier función. Al mismo tiempo multiplataforma.

Este método podría ser utilizado para crear OrderSendAsync para MT4, por ejemplo.

¡Gracias por el artículo!

 
fxsaber:

Como siempre, ¡fuerte! Si se pudiera generalizar la biblioteca, se podría crear un conjunto de herramientas listo para crear fácilmente asincronía de cualquier función. Al mismo tiempo multiplataforma.

Usando este método podría crear OrderSendAsync para MT4, por ejemplo.

Sí, empecé a hacer un sistema de gestión de órdenes de grupo para MT4 con comandos de plugin en los mensajes una vez hace mucho tiempo, pero no fue terminado. No he comprobado como funcionan los recursos en MT4, aunque a juzgar por la documentación debería ser como en MT5.

 
Stanislav Korotky:

No he comprobado como funcionan los recursos en MT4, aunque según la documentación debería ser como en MT5.

Sí, todo es como en MT5. Solo que en la actual build de MT4 hay un bug que hace imposible el intercambio

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

Bugs, fallos, preguntas

fxsaber, 2018.09.17 18:38

ResourceReadImage en MT4 con tal bug que es imposible leer el recurso
#property strict

class RESOURCE
{
public:
  const string Name;

  RESOURCE( const string sName = __FILE__ ) : Name("::" + sName )
  {
  }

  ~RESOURCE( void)
  {
    ::ResourceFree(this.Name);
  }

  virtual bool Set( const uint &Data[], const uint Width = 1, const ENUM_COLOR_FORMAT ColorFormat = COLOR_FORMAT_XRGB_NOALPHA ) const
  {
    return(::ResourceCreate(this.Name, Data, Width, (Width == 0) ? ::ArraySize(Data) : ::ArraySize(Data) / Width, 0, 0, Width, ColorFormat));
  }

  int Get( uint &Data[] ) const
  {
    uint Width;
    uint Height;

    return(::ResourceReadImage(this.Name, Data, Width, Height) ? ::ArraySize(Data) : 0);
  }
};

void OnStart()
{
  RESOURCE Resource;
  
  uint DataIn[] = {0};  
  Resource.Set(DataIn);
   
  uint DataOut[];
  Resource.Get(DataOut);
  
  Print(DataOut[0]); // MT5x64 (build 1881) - 0, MT4 (build 1126) - 4278190100 (valores aleatorios)
}


ResourceSave escribe correctamente, pero ResourceReadImage tiene un gran bug. ¿Es posible arreglarlo? No lo he comprobado en MT5x32....


Quizás este método ayude a que la lectura de recursos sea correcta en MT4. No lo he probado.

 

Por cierto, se puede prescindir de los gráficos completos - OBJ_CHART. Los scripts se cargan en ellos. Y WebRequest y OrderSend trabajan allí.

He dado un ejemplo de cómo hacer un comercio indicador sin gráficos adicionales.

Por lo tanto, puede utilizar iCustom-indicador como un gestor, y se pondrá en marcha WebRequest en su guión para cada WebRequestAsync.

El diseño debe ser más simple y más fiable, porque no habrá ventanas adicionales.

 
fxsaber:

Por cierto, se puede prescindir de los gráficos completos - OBJ_CHART. Los scripts se cargan en ellos. Y WebRequest y OrderSend trabajan allí.

Di un ejemplo de cómo hacer un comercio indicador sin gráficos adicionales.

Por lo tanto, puede utilizar iCustom-indicador como un gestor, y se ejecutará WebRequestAsync en su guión para cada WebRequestAsync.

El diseño debe ser más simple y más fiable, porque no habrá ventanas adicionales.

¿puede enlazar a este ejemplo?

 
Maxim Kuznetsov:

¿Puedo tener un enlace a este ejemplo?

Aquí y aquí.


ZY El usuario probablemente se sorprenderá si el Indicador de Mercado comienza a operar....

 
fxsaber:

Aquí y aquí.


ZY Probablemente, el usuario se sorprenderá si Mercado-indicador comienza a operar...

jeez, es sólo una transferencia de eventos.... pensé :-)

 
Maxim Kuznetsov:

mierda, es sólo un evento.... pensé :-)

No hay ningún evento.

 
fxsaber:

No hay ningún evento.

Es el script el que ejecuta las órdenes.

y cómo obtiene las órdenes es otra cuestión.

 
Maxim Kuznetsov:

el script ejecuta las órdenes.

Otra cosa es cómo recibe las órdenes.

El script no recibe órdenes, lo activa el indicador en cualquier cantidad.