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

 
Yuriy Asaulenko:


Me puse a releer el tema e Igor ya había escrito sobre él.

Пишите dll (в которой Вы должны выделить память и зарегистрировать новый поток! - затем при выходе все аккуратно уничтожить!) и вызывайте ее из MQL

Esto es lo que intentaba decir, Yuri, que hay que asignar memoria y registrar el flujo.
Igor dice que hay que asignar y registrar, mientras que tú dices que no necesitas hacer nada.
Por eso estoy mareado. El resultado es un punto muerto.

Igor estudió en la universidad como especialista, y debería entender más que nosotros, los autodidactas.
Inicialmente me inclinaba por la misma idea: asignar memoria e inicializar.
La inicialización y laasignación de memoria es la clave para una codificación correcta, porque no debe fluir y no debe ser una basura.

Así que mi pregunta a Igor, es que me explique cómo hacerlo en C++.
No con palabras, con un ejemplo, no entiendo nada ))

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}
 
Roman:

Me puse a releer el tema e Igor ya escribió al respecto.

Eso es lo que intentaba decir, Yuri, que deberíamos asignar memoria y registrar el flujo.

Sí, claro que sí. Pero DllMain no tiene nada que ver). - Es para otra cosa. Y no para ti. Olvídalo, mejor para siempre). No existe para ti.
Escribe una función de exportación. El resto es exactamente igual que en los programas normales. Tú también tienes que hacer lo mismo.
El resto después, ya estoy dormido)).
 
Toma C# porque C/C++ es demasiado complicado para ti.
 
Roman:

Me puse a releer el hilo e Igor ya había escrito al respecto.

Inicialmente me inclinaba por la misma idea: asignar memoria e inicializar.
La inicialización y la asignación de memoria es la clave para una codificación correcta, porque no debe gotear y no debe tener basura.

Así que mi pregunta a Igor, es que me explique cómo hacerlo en C++.

Estás empujando magistralmente este hilo a la cima de la discusión, tratando de atraer más y más participantes a tu problema ))))

No saques la correspondencia de contexto:

- Lo escribí en el contexto de que si quieres entender cómo funciona WinAPI, puedes usar ejemplos ya hechos sobre la escritura de dlls = más de 20 artículos en este recurso

- Lo escribí en un contexto en el que se puede llegar a las llamadas WinAPI puras, sustituyendo los plugins que los programadores de su sistema ya han escrito para usted

....

el objetivo de la correspondencia: empezar a leer y hacer algo, no escribir y escribir.... Usted entenderá mucho, usted entenderá qué y cómo funciona en Windows, pero este conocimiento no será en la demanda, deusted como del programador de la aplicación sólo el trabajo mecánico - eligió el tipo de proyecto, agregó su código, compilado = obtuvo el resultado - todo el trabajo para usted han hecho cientos o miles de programadores del sistema. Cualquier modificación de las plantillas y los archivos de inclusión debe tener sentido - si no lo sabes, bajo el pretexto de "¡para qué tanto código, ya funciona!" - Obtendrá un error no reproducible y/o falta de compatibilidad con el sistema operativo y el ordenador

 
Vladimir Simakov:
El puesto es para los creadores. Trolls fuera. En el caso de las interfaces gráficas de usuario, es conveniente poner el OnChartEvent en un hilo separado.

¿Por qué romper el modelo que hicieron los desarrolladores? - El modelo del programa MQL es simple y claro, hay eventos - hay puntos de entrada que procesan estos eventos (OnTick(),OnInit()....OnChartEvent() )

existe la posibilidad de obtener el estado del entorno comercial de cualquier programa MQL (incluso los indicadores pueden ver el beneficio de una orden abierta, etc.) y es posible combinar Asesor Experto+script, Asesor Experto+indicador de usuario en el mismo gráfico - se obtiene la ejecución asíncrona de los programas MQL, el EA comercia, el indicador muestra la visualización gráfica - si el rendimiento del flujo de losindicadores de usuario no es suficiente (trabajan en un hilo), entonces, por supuesto, es un problema - es necesario utilizar 2 EAs en 2 gráficos y organizar la interacción de ellos

de nuevo - hay una tarea específica, hay una implementación, he preguntado muchas veces por qué se necesita esta característica, pero hasta ahora no hay respuesta - sólo el razonamiento espacial sobre la visualización 3D.... y no se discute donde conseguir algo de DirectX para trabajar con 3D ;)

imho, ¡funciona! )))

 
Igor Makanu:

¿Por qué romper el modelo que hicieron los desarrolladores? - El modelo del programa MQL es simple y claro, hay eventos - hay puntos de entrada que procesan estos eventos (OnTick(),OnInit()....OnChartEvent() )

existe la posibilidad de obtener el estado del entorno comercial de cualquier programa MQL (incluso los indicadores pueden ver el beneficio de una orden abierta, etc.) y es posible combinar Asesor Experto+script, Asesor Experto+indicador de usuario en el mismo gráfico - se obtiene la ejecución asíncrona de los programas MQL, el EA comercia, el indicador muestra la visualización gráfica - si el rendimiento del flujo de losindicadores de usuario no es suficiente (trabajan en un hilo), entonces, por supuesto, es un problema - es necesario utilizar 2 EAs en 2 gráficos y organizar la interacción de ellos

de nuevo - hay una tarea específica, hay una implementación, he preguntado muchas veces por qué se necesita esta característica, pero hasta ahora no hay respuesta - sólo el razonamiento espacial sobre la visualización 3D.... y no se discute donde conseguir algo de DirectX para trabajar con 3D ;)

imho, ¡funciona! )))

Mira. Hay un botón. Haz clic en él. OnChartEvent se pone en la cola. Pero en esta cola ya está OnTick, y a continuación está OnTime, y en ellos está CopyRate para todas las herramientas, que por un segundo se bloquea y hace un bucle para un montón de iteraciones. Como resultado, si el botón, por ejemplo, debe abrir una ventana de diálogo, obtenemos una interfaz lenta. No es una crítica, por supuesto, pero no es agradable.
 
Vladimir Simakov:
Mira. Hay un botón. Haz clic en él. El OnChartEvent se pone en cola. Pero en esta cola ya está OnTick, y tras él está OnTime, y en ellos está CopyRate para todas las herramientas, que, durante un segundo, se bloquea y hace un bucle durante un montón de putas iteraciones. Como resultado, si el botón, por ejemplo, debe abrir una ventana de diálogo, obtenemos una interfaz lenta. No es una crítica, por supuesto, pero no es agradable.

La GUI debe girar en el EA principal y todo lo demás en un EA separado. Este EA esclavo separado se coloca en elOBJ_CHART invisible e interactúa con la ruta principal EventSendCustom().

Consigue algo así como un multihilo. Yo lo he implementado así.

 
Vladimir Simakov:
Mira. Hay un botón. Haz clic en él. OnChartEvent se pone en la cola. Pero en esta cola ya está OnTick, y a continuación está OnTime, y en ellos está CopyRate para todas las herramientas, que por un segundo es el bloqueo y el bucle para una mierda de iteraciones. Como resultado, si el botón, por ejemplo, debe abrir una ventana de diálogo, obtenemos una interfaz lenta. No es una crítica, por supuesto, pero no es agradable.

No conozco OnChartEvent OnTick y OnTime, pero los desarrolladores escribieron que si EA estaba ocupado y no ha procesado el evento, este evento no crea una cola, es decir, será sólo un tic o salto de temporizador ( OnChartEvent - no lo sé, no lo comprobé)


La lógica de los desarrolladores es simple aquí, cada evento es una acción específica del Asesor Experto, pero es este evento el que conozco con seguridad y he comprobado más de una vez (trabajo más en teoría en MT5, no sé cómo funciona físicamente ONTick):

sobre MT4 diré sin ambigüedad: todas las operaciones de comercio deben hacerse sólo a través de la garrapata de entrada, de lo contrario en 9 de cada 10 casos usted recibirá la negativa del servidor para procesar la operación de comercio,

Es decir, he creado una interfaz con el botón BUY - según mi idea, se pulsa BUY e inmediatamente se envía una orden, pero no funcionará directamente, es necesario memorizar el comando del usuario (idealmente, bloquear el botón para que no yak)) y a la llegada de un tick en OnTick () - enviar una orden al servidor - esto funcionará en el 99% de los casos, es decir, ha llegado un tick - se puede realizar una solicitud de comercio (no desde cualquier lugar en MQL)



¿Y si introducimos OnChartEvent en un flujo asíncrono, obtendremos bloqueos mutuos del código ejecutado? - Por ejemplo, las estadísticas de las operaciones se obtienen pulsando el botón en OnChartEvent , y la misma función (última operación perdedora) se utiliza en OnTick - ¡será algo grave! - imho, ¡no se puede arreglar todo!

 
Andrey Barinov:

La GUI debe girar en el EA principal y todo lo demás en un EA separado. Este EA esclavo separado se coloca en elOBJ_CHART invisible e interactúa con la ruta principal EventSendCustom().

Consigue algo así como un multihilo. Yo lo he implementado así.

Exactamente. A falta de una criada... Se llama muleta.
 
Igor Makanu:

No conozco OnChartEvent OnTick y OnTime, pero los desarrolladores escribieron que si EA estaba ocupado y no ha procesado el evento, este evento no crea una cola, es decir, será sólo un salto de tic o de temporizador ( OnChartEvent - no lo sé, no lo comprobé)


La lógica de los desarrolladores es simple aquí, cada evento es una acción específica del Asesor Experto, pero es este evento el que conozco con seguridad y he comprobado más de una vez (trabajo más en teoría en MT5, no sé cómo funciona físicamente ONTick):

sobre MT4 diré sin ambigüedad: todas las operaciones de comercio deben hacerse sólo a través de la garrapata de entrada, de lo contrario en 9 de cada 10 casos usted recibirá la negativa del servidor para procesar la operación de comercio,

es decir, se ha implementado una interfaz con el botón BUY - según nuestra idea, se pulsa BUY e inmediatamente se envía una orden, pero no funcionará directamente, es necesario recordar el comando del usuario (idealmente, bloquear el botón para que no yak)) y a la llegada del tick, en OnTick() - enviar una orden al servidor - esto funcionará en el 99% de los casos, es decir, ha llegado un tick - se puede realizar una solicitud de comercio (no desde cualquier parte de MQL)



¿Y si introducimos OnChartEvent en un flujo asíncrono, obtendremos bloqueos mutuos del código ejecutado? - Por ejemplo, las estadísticas de las operaciones se obtienen pulsando el botón en OnChartEvent , y la misma función (última operación perdedora) se utiliza en OnTick - ¡será algo grave! - imho, ¡no se puede arreglar todo!

La sincronización es una tarea del programador, si no se sabe cómo, no se usa el multithreading. La tarea de los creadores es dar una herramienta, y entonces todo el mundo es un malvado zapatero. El mismo a la mutex no es un problema en absoluto.
Razón de la queja: