Programación asíncrona y multihilo en MQL - página 19

 
Igor Makanu:
...


Una vez más, responda a la pregunta: ¿por qué necesita esto el terminal de comercio?

...

¿Funciona el terminal en un hilo? Si está en varios hilos, ¿es por eso que se necesita)?

 
Реter Konow:

Hay que razonar mucho.

Hmm, ¿es ahí donde vas tú también? - ¿Escribes mucho, pero no lees y no quieres desarrollarte? - Usted no habría tenido tiempo en mi enlace, no sólo para entender el artículo, pero incluso leer, aquí está la última que he encontrado, aquí está mi código en el "3 pantallas Elder", escribió a alguien, tengo una estructura de código es siempre sobre eso (siempre que no será más modificaciones que cambian la lógica básica, hay código ... mejor no recordar lo que se puede hacer alcódigo estructurado inicialmente lineal (( ) )

void OnTick()
  {
   int takeprofit,stoploss,hstart=0; 
   double lot,h[];
   CopyClose(symbol,PeriodSecondary,hstart,HistoryCount,h);
   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();
   if(NewBar())
     {
      DeleteOrdersLimits(Magic);
      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }
  }
//+------------------------------------------------------------------+

a continuación será todas las funciones de servicio, pero el código principal - el TC en sí es el más legible y la lógica más lineal, siempre escribí así, en los profesores de la universidad sólo tales fuentes aceptadas como el trabajo entregado, de lo contrario no pasará ))))


¿qué sentido tiene? - Intento decir una vez más: el multihilo debe utilizarse sólo si no hay otra solución, ¡nadie de los programadores adecuados se pondrá a trabajar con operaciones asíncronas! - ¡Duele! ))))


un ejemplo será de usted: responda a la pregunta ¿por qué un terminal de comercio lo necesita?

 
Yuriy Asaulenko:
Sí, están en los muelles, pero en realidad no lo están. Por lo que he entendido.
Volchansky escribió sobre esto y Renat le respondió.
En general, me resulta difícil imaginar por qué son necesarias las devoluciones de llamada en un programa de un solo hilo sin interacción con software de terceros.

Lo he probado ahora. Todo está funcionando.

Aunque no tienen ninguna utilidad práctica en MQL.

 
Igor Makanu:

Responde a la pregunta ¿por qué necesita esto el terminal de comercio?

Se han olvidado de la sobrecarga del multihilo. Y no son insignificantes).
 
Igor Makanu:
...


Un ejemplo sería de usted: responda a la pregunta ¿por qué necesita el terminal de comercio?

Ya le he contestado. Lo estás ignorando.

1. Necesito el multithreading porque mis programas son mucho más complejos. Quiero combinar muchas funciones pesadas en un solo programa. Visualización tridimensional, comunicación con el servidor, interfaz gráfica de usuario y cálculos diversos. Un solo hilo no es suficiente. Por lo tanto, debo dividir el programa en partes o utilizar el multithreading incorporado. Si no está disponible, entonces dividiré el programa en partes.

2. el terminal es multihilo por sí mismo. Pregunte a sus desarrolladores por qué necesita el multithreading. Por qué necesito el multithreading - véase el punto 1.

 

Igor Makanu

ejemplo de usted: responda a la pregunta de por qué el terminal de comercio lo necesita.

Bueno, la más obvia es un hilo de interfaz separado, especialmente crítico para las guineas, aunque yo mismo prescindo de él.

ZS: No defiendo el multithreading, en todo caso.

 
Реter Konow:

Ya le he contestado. Lo estás ignorando.

1. Necesito el multithreading porque mis programas son mucho más complejos. Quiero combinar muchas funciones muy pesadas en un solo programa. Visualización tridimensional, comunicación con el servidor, interfaz gráfica de usuario y cálculos diversos. Un solo hilo no es suficiente. Así que debo dividir el programa en partes o utilizar el multithreading nativo. Si no está, entonces dividiré el programa en partes.

2) El Terminal es multihilo en sí mismo. Por qué necesita el multihilo: pregúntele a sus desarrolladores. Por qué necesito el multihilo - véase el punto 1.

También ignoras lo que te dicen, ya lo he escrito: ¡las moscas se separan, las chuletas se separan!

En su tema sobre su enfoque de las interfaces gráficas, le han dicho que su código es ineficiente y cree que lanzando las funciones a un hilo separado aumentará el rendimiento? - No aumentará el rendimiento, pero creará la molestia adicional de sincronizar todo ahora ))))

Recordando en 4pd en los hilos sobre android - dispositivos, los usuarios están convencidos de la eficacia de la versión del firmware sólo por la cantidad de memoria libre, y todo lo contrario - cuanto más memoria libre, más fresco el firmware, pero por desgracia no hay comprensión de que el sistema operativo debe utilizar de manera eficiente todos los recursos - incluyendo la memoria, si hay mucha memoria libre, no necesariamente el sistema operativo utiliza los recursos de manera eficiente. Así que en tu caso, no puedes obtener rendimiento en un solo hilo, por lo que necesitas más hilos. - ¿Tal vez no se trate delas capacidades del lenguaje (plataforma, sistema operativo...) sino del desarrollador? - ¿Quizás no es eficiente? ;) - He comprobado los GUIs de la serie de artículos y en KB del año pasado, no he visto ningún retraso evidente, todo funciona a buen nivel. He mirado el código fuente de esos códigos, los esquemas de recorrido de los elementos de la interfaz, los propios enfoques de la POO, todos ellos muy similares a los principios de los gráficos en Windows: ¿por qué a ellos les funciona y a ti no? )))))) - ¿Quizás el planteamiento inicial no era correcto después de todo, osu formación teórica cojea de ambas patas?

 
Igor Makanu:

También ignoras lo que se te ha escrito, ya lo he hecho: ¡vueltas separadas - chuletas separadas! La interfaz gráfica de usuario y la estrategia comercial no deben ejecutarse en un solo código!

En su tema sobre su enfoque de las interfaces gráficas, se le dijo que su código es ineficiente y cree que lanzando funciones en un hilo separado aumentará el rendimiento? - No aumentará el rendimiento, pero creará la molestia adicional de sincronizar todo ahora ))))

Recordando en 4pd en los hilos sobre android - dispositivos, los usuarios están convencidos de la eficacia de la versión del firmware sólo por la cantidad de memoria libre, y todo lo contrario - cuanto más memoria libre, más fresco el firmware, pero por desgracia no hay comprensión de que el sistema operativo debe utilizar de manera eficiente todos los recursos - incluyendo la memoria, si hay mucha memoria libre, no necesariamente el sistema operativo utiliza los recursos de manera eficiente. Así que en tu caso, no puedes obtener rendimiento en un solo hilo, por lo que necesitas más hilos. - ¿Tal vez no se trate de las capacidades del lenguaje(plataforma, sistema operativo...) sino del desarrollador? - ¿Tal vez no es eficiente? ;) - He comprobado los GUIs de la serie de artículos y en KB del año pasado, no he visto ningún retraso evidente, todo funciona a buen nivel. He mirado el código fuente de esos códigos, los esquemas de recorrido de los elementos de la interfaz, los propios enfoques de la POO, todos ellos muy similares a los principios de los gráficos en Windows: ¿por qué a ellos les funciona y a ti no? )))))) - ¿quizás el planteamiento inicial no era el correcto después de todo, o tu formación teórica está coja de las dos patas?

¿Qué te hace pensar que algo es ineficaz o que no funciona para mí? Ve a mi perfil y mira cómo funcionan las cosas. Precisamente porque las cosas funcionan y evolucionan, asumo que la necesidad del multithreading es inminente.

 
Vict:

Bueno, la más obvia es un hilo de interfaz separado, especialmente crítico para guini, aunque yo mismo prescindo de él.

ZS: No estoy defendiendo el multithreading, en todo caso.

Bueno, no tiene productos en el Mercado. Entonces por qué hacer una GUI en MKL cuando se puede hacer fácilmente en C#, que ahora se conecta fácilmente a MKL. Y esa interfaz gráfica ya se ejecuta inherentemente en su propio hilo.

 
Igor Makanu:

void OnTick()
  {
   MqlTask obj1;
   MqlTask obj2;
   MqlTask obj3;
   MqlTask obj4;

   int takeprofit,stoploss,hstart=0; 
   double lot,h[];

   bool success = false;

   CTask *task1 = obj1.CALLBACK_FUNC(CopyClose(symbol,PeriodSecondary,hstart,HistoryCount,h));   //Выполняется асинхронно в пуле потоков
   success = task1 -> Run();
   success = task1 -> Wait(0);  
   

   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();

   if(NewBar())
     {
      CTask *task2   = obj2.CALLBACK_FUNC(DeleteOrdersLimits(Magic));  //Выполняется асинхронно в пуле потоков
      success = task2 -> Run();
      success = task2 -> Wait(0);

      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CTask *task3 = obj3.CALLBACK_FUNC(CalcTakeProfitStopLoss(takeprofit,stoploss));  //Выполняется асинхронно в пуле потоков
         success = task3 -> Run();
         success = task3 -> Wait(0);

         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CTask *task4 = obj4.CALLBACK_FUNC(CalcTakeProfitStopLoss(takeprofit,stoploss));  //Выполняется асинхронно в пуле потоков
         success = task4 -> Run();
         success = task4 -> Wait(0);

         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }

     delete task1;  //Очищаем ресурсы
     delete task2;
     delete task3;
     delete task4;
  }
//+------------------------------------------------------------------+


Este es un ejemplo de escritura de código lineal asíncrono en un hilo.
Asumiendo que la funcionalidad de EventLoop se implementa en mql y es implementada por los desarrolladores de ThreadPool.
El usuario no necesita entrar en los hilos. Los desarrolladores deberían encargarse de ello y escribir las clases correspondientes.
El programa se ejecuta en un único hilo, mientras que los collabs regulares no bloqueantes se ejecutan en un pool de hilos.
Ahora sustituye tus funciones simples en colbacks por funciones con cálculos pesados o que requieran concurrencia.
Mega conveniente y todo en paralelo ))



Archivos adjuntos:
node.js.png  48 kb
Razón de la queja: