Discusión sobre el artículo "WebRequest multiflujo asincrónico en MQL5" - página 3

 
Stanislav Korotky:

WebRequest no funciona en indicadores (y esta librería permite saltarse esta limitación). Un hilo separado en MT se asigna sólo a expertos y scripts, pero los scripts no funcionan con eventos.

Ya veo, gracias. No lo sabía.

 
Stanislav Korotky:

En MT4 1146 los recursos son totalmente funcionales. La idea puede ser portado con seguridad a la cuarta versión.

 
fxsaber:

Sí, esa es la idea. Pero sólo funcionará en MT5.

He implementado esta idea (con objetos gráficos).

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.

El resultado es el siguiente.

Los scripts no funcionan porque no puedo pasarles un parámetro al inicio - parece que los scripts no son nada amigables con las plantillas de gráficos. El hecho de que se las arreglan para ejecutarlos en absoluto con la ayuda de la biblioteca Expert.mqh (aunque sin parámetros), por analogía con Asesores Expertos - parece ser un feliz accidente.

Si ejecutas las web-requests no en scripts sino en Expert Advisors, el esquema funciona a medias. Es decir, los parámetros de entrada funcionan normalmente y conseguimos pasar el nombre del recurso con datos al Asesor Experto. Pero por alguna razón, en los Asesores Expertos lanzados en objetos gráficos sólo se dispara el evento OnInit, mientras que, por ejemplo, OnTick u OnTimer no. No es muy agradable ejecutar una petición web en OnInit, pero es posible. Sin embargo, toda esta lógica se ralentiza terriblemente, porque abrir un objeto gráfico para cada petición causa mucha sobrecarga.

 
Stanislav Korotky:

Implementado esta idea (con objetos gráficos).

El resultado es el siguiente.

Los scripts no funcionan porque no puedo pasarles un parámetro al lanzarlos - parece que los scripts no son para nada amigables con las plantillas de gráficos. El hecho de que puedan ser lanzados usando la librería Expert.mqh (aunque sin parámetros), por analogía con los Asesores Expertos - parece ser un feliz accidente.

Tuve que estudiar el tema. Los scripts son ejecutados por la plantilla y en un gráfico normal, pero sin la posibilidad de establecer parámetros de entrada. Así que el método PlaySound definitivamente funcionará.

Si ejecutamos las consultas web no en scripts sino en Asesores Expertos, el esquema funciona a medias. Es decir, los parámetros de entrada funcionan normalmente y conseguimos pasar el nombre del recurso con datos al Asesor Experto. Pero por alguna razón, en los Asesores Expertos lanzados en objetos gráficos sólo se dispara el evento OnInit, mientras que, por ejemplo, OnTick u OnTimer no. No es muy agradable ejecutar una petición web en OnInit, pero es posible. Sin embargo, toda esta lógica se ralentiza terriblemente, porque la apertura de un objeto gráfico para cada solicitud le da un montón de sobrecarga.

Nada me funciona.

 
fxsaber:

Tuve que estudiar el tema. Las secuencias de comandos se ejecutan por la plantilla y en un gráfico regular, pero sin la posibilidad de establecer parámetros de entrada. Así que el método PlaySound definitivamente funcionará.

Nada funciona para mí.

El conjunto que envié en un mensaje privado funciona para mí a través de OnInit en el Asesor de Expertos. Se puede ver en los registros. Envíame tus registros.

 

Estoy publicando una variante alternativa de lanzamiento de solicitudes web - con la ayuda de objetos gráficos, en la que se aplica una plantilla con un ayudante experto. Se puede utilizar tanto de expertos como de indicadores. Las dependencias son las mismas que en el artículo. Directamente nuevos archivos de la aplicación del enfoque:

  • multiwebobjectworker.mqh - archivo de cabecera con clases comunes;
  • multiwebobjectworker.mq5 - Asesor Experto de trabajo que realiza consultas web dentro de objetos-gráficos;
  • multiwebindicator.mq5 - indicador sin búfer que demuestra el lanzamiento de consultas web;

Para cada consulta se crea un objeto, se crea un experto-asesor en él, el objeto se elimina cuando la consulta ha terminado. Los datos de la consulta y los resultados se intercambian mediante recursos, como en el artículo.

A juzgar por los registros, este mecanismo no proporciona un paralelismo completo de la ejecución de consultas, porque los objetos probablemente comparten una cola de eventos común. Ejemplo de registro:

2018.11.14 15:11:58.492 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS1 129912254742671349
2018.11.14 15:11:58.694 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS2 129912254742671350
2018.11.14 15:11:58.819 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS3 129912254742671351
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnInit
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Reading request \Indicators\multiwebindicator.ex5::WRS_0_129912254742671348
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Got 64 bytes in request
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: GET https://google.com/ User-Agent: n/a 5000 
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnInit
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Reading request \Indicators\multiwebindicator.ex5::WRS_1_129912254742671348
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Got 60 bytes in request
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: GET https://ya.ru User-Agent: n/a 5000 
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnInit
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Reading request \Indicators\multiwebindicator.ex5::WRS_2_129912254742671348
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Got 72 bytes in request
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: GET https://www.startpage.com/ User-Agent: n/a 5000 
2018.11.14 15:11:59.162 multiwebobjectworker (EURUSD,H1)        129912254742671350: Done in 187 ms
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671350
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Got 16592 bytes in response
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   GET https://ya.ru
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   Received 3734 bytes in header, 12775 bytes in document
2018.11.14 15:11:59.256 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnDeinit
2018.11.14 15:11:59.272 multiwebobjectworker (EURUSD,H1)        129912254742671349: Done in 297 ms
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671349
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Got 12688 bytes in response
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   GET https://google.com/.
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   Received 790 bytes in header, 11813 bytes in document
2018.11.14 15:11:59.350 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnDeinit
2018.11.14 15:11:59.833 multiwebobjectworker (EURUSD,H1)        129912254742671351: Done in 749 ms
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671351
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Got 45212 bytes in response
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   GET https://www.startpage.com/
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   Received 822 bytes in header, 44307 bytes in document
2018.11.14 15:11:59.849 multiwebindicator (EURUSD,H1)   > > > Async WebRequest workers finished 3 tasks in 1357 ms
2018.11.14 15:11:59.880 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnDeinit
Archivos adjuntos:
 
Stanislav Korotky:

Prueba el Resource_Data.mqh actualizado, los retrasos al transferir páginas web deberían desaparecer.

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/es/code/22166

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

const RESOURCEDATA<uchar> Resource("::" + __FILE__); // Recurso para la transferencia de datos (bytes)
uchar BytesIn[];
const int Init = ArrayResize(BytesIn, 1000000);

void TestResource()
{
  uchar BytesOut[];

  Resource = BytesIn;
  Print(Resource.Get(BytesOut));
}

void OnStart()
{
  BENCH(TestResource());
}


Versión antigua

1000000
Time[TestResource()] = 103746


Nueva versión

1000000
Time[TestResource()] = 5222
 
fxsaber:

Prueba el Resource_Data.mqh actualizado, los retrasos al transferir páginas web deberían desaparecer.

Versión antigua

Nueva versión

¿Qué has tenido que hacer para acelerar 20 veces? ¿Se mantiene la compatibilidad con el código antiguo, no es necesario cambiar las llamadas al cliente?

 
Stanislav Korotky:

¿Qué has tenido que hacer para acelerar 20 veces? La compatibilidad con el código antiguo se mantiene, no hay que cambiar las llamadas al cliente?

La compatibilidad se mantiene.

Foro sobre negociación, sistemas de negociación automatizados y prueba de estrategias de negociación.

Bibliotecas: TradeTransactions

fxsaber, 2018.12.09 01:23 pm.

En los fuentes de la librería está Convert.mqh, que convierte rápidamente un array de un tipo en un array de otro.

TypeToBytes era lento (ahora solo se usa si ninguno de los tipos de array es múltiplo del otro) en arrays grandes.

TypeToBytes no se utiliza para uchar[].

 
Buen artículo, gracias. ¿Qué tal el modo asíncrono de WinINet?