El problema de la transferencia de MT4 a MT5. O, más precisamente, la incapacidad de ejecutar algunos algoritmos en MT5 sin'err. - página 4

 
Eugeni Neumoin:

No hay ningún problema con OnCalculate(). Todo el GUI funciona a través de OnChartEvent() . Hay más de 400 botones en la interfaz gráfica de usuario. Algunos de los botones no interactúan con las series de tiempo de ninguna manera. Las funciones OnCalculate() y OnTrade() pueden esperar hasta el siguiente tick. Esto no se nota psicológicamente. Y es más complicado con OnChartEvent(). Aquí entra en juego la psicología humana. El usuario del programa pulsa el botón GUI. Y no obtiene la respuesta que desea. ¿Cuál es su reacción? Una de las reacciones es que pulse el mismo botón por segunda vez. He hecho que una segunda pulsación en muchos de los botones desactive la funcionalidad conectada por ese botón. Me anticipo a tu sugerencia de hacer que la acción del botón se desactive de alguna otra manera. Pero existe el mismo programa para MT4. Allí funciona normalmente. Resultará que MT4 tiene un algoritmo de interacción con la interfaz gráfica, mientras que MT5 tiene otro diferente. Este comportamiento del mismo programa sólo provocará el rechazo.

Hice algo similar al traducir a MT5 - habilité la salida desde OnChartEvent(). No quiero mentir, por eso la GUI se estaba muriendo.

Y en mi caso la referencia a las series de tiempo en OnTimer() ocurre después de 5 minutos. Lo haré después de 2 minutos. Comprobaré lo que ocurrirá.

Artem, tus sugerencias ya han sido útiles.

No, ciertamente no habrá sugerencias para cambiar la lógica de trabajo con los gráficos - el código multiplataforma debería funcionar de la misma manera.

  1. La aplicación a las series de tiempo debe hacerse al menos una vez cada dos minutos - sólo en este caso se garantizará que esté siempre actualizada. Es decir, en multi... indicadores, esta parte del código debe ser por defecto.
  2. En MQL5, a diferencia de MQL4, el gráfico debe ser actualizado usando CartRedraw() para mostrar los cambios del gráfico después de todas las manipulaciones necesarias con todos los objetos gráficos que pueden ser actualizados a la vez - no es necesario actualizar el gráfico después de cada cambio de un elemento. No sé si me he explicado bien. Por ejemplo, si un usuario hace clic en un botón y se debe dibujar algo adicional, por ejemplo, un objeto de tabla compuesto por varios elementos, entonces se deben dibujar todos los elementos y sólo entonces se debe actualizar el gráfico una vez. No actualizar después de cada elemento dibujado de un solo objeto.
    Es muy posible que cuando el usuario haya pulsado el botón pero no vea nada, entonces en realidad todo está ahí, sólo que el gráfico no está actualizado todavía (se actualizará sólo con la llegada del tick)
 
Artyom Trishkin:

No, ciertamente no se propondrá cambiar la lógica de los gráficos: el código multiplataforma debería funcionar de la misma manera.

Lo único que puedo sugerir para mejorar los botones es que, en cualquier caso, cuando la serie temporal requerida no está disponible todavía, no es posible construir un gráfico sobre sus datos. En este caso tenemos que esperar al momento en que los datos estén disponibles y hacer que los botones estén inactivos mientras esperan - por ejemplo, hacerlos similares a las interfaces de Windows: si no hay ninguna acción disponible en el botón, entonces el botón está en gris. Esta lógica puede estar presente para ambas plataformas, de manera que no haya diferencias en el código.

 

Tengo ChartRedraw() que se dispara al salir de bloques grandes, por ejemplo, OnChartEvent() y otros. Así que no hay nada malo en esta función.

Acerca de la información sobre herramientas. Son como indicadores de que al hacer clic en un número o símbolo todo funcionará.

Si se hace clic en el número y en el símbolo, debe activarse uno de los elementos OnChartEvent() - CHARTEVENT_OBJECT_CLICK . No se activa si no aparece el tooltip. Me gustaría saber por qué ocurre.CHARTEVENT_OBJECT_CLICK no funciona .

Y seguiré de cerca el acceso a las series de tiempo.

 
Eugeni Neumoin:

Tengo ChartRedraw() que se dispara al salir de bloques grandes, como OnChartEvent() y otros. Así que no hay nada malo en esta función.

Acerca de la información sobre herramientas. Son como indicadores de que al hacer clic en un número o símbolo todo funcionará.

Si se hace clic en el número y en el símbolo, debe activarse uno de los elementos OnChartEvent() - CHARTEVENT_OBJECT_CLICK . No se activa si no aparece el tooltip. Me gustaría saber por qué ocurre.CHARTEVENT_OBJECT_CLICK no funciona .

Y seguiré de cerca el acceso a las series de tiempo.

Al principio del manejador de eventos del gráfico, registre el parámetro sparam - entonces cualquier acción será registrada. Entonces empieza a limitar la salida - si hay un evento de clic de objeto (id==CHARTEVENT_OBJECT_CLICK), entonces la salida sparam al registro. Y así llegarás poco a poco a la causa.

 
Artyom Trishkin:

Al principio del manejador de eventos del gráfico, registre el parámetro sparam - luego se registrará cualquier acción. Entonces empieza a limitar la salida - si hay un evento de clic de objeto (id== CHARTEVENT_OBJECT_CLICK), entonces la salida sparam al registro. Y así llegarás poco a poco a la causa.

Así es exactamente como he depurado todo. Y en el código los bits para la depuración en OnChartEvent() están siempre presentes en la forma comentada. Pero, gracias. Lo haré así. Buscaré la causa.
 

Para evitar problemas con la vinculación de números y símbolos, es necesario aumentar la prioridad de los números y símbolos con OBJPROP_ZORDER.

Funciona en MT4 sin ella. Sin embargo, he aumentado la prioridad en MT4 por si acaso. Además, la prioridad de los símbolos de las ondas era mayor que la de los números.

Lo he solucionado.

Estoy tratando de cambiar todas las series de tiempo después de 2 minutos - Estoy seleccionando diferentes variantes para el desempeño más suave de esta tarea.

El proceso ha comenzado...

 
Eugeni Neumoin:

Para evitar problemas con la vinculación de números y símbolos, es necesario aumentar la prioridad de los números y símbolos con OBJPROP_ZORDER.

Funciona en MT4 sin ella. Sin embargo, he aumentado la prioridad en MT4 por si acaso. Además, la prioridad de los símbolos de las ondas era mayor que la de los números.

Lo he solucionado.

Estoy tratando de cambiar todas las series de tiempo después de 2 minutos - Estoy seleccionando diferentes variantes para el desempeño más suave de esta tarea.

El proceso ha comenzado...

La suavidad no tiene nada que ver con esto :)
Sólo hay que acceder a todos los tf que funcionan al menos una vez cada dos minutos. Suelo acceder cada 90 segundos. Puedes distribuir el tiempo de acceso para los diferentes comerciantes, para no tirar todos a la vez. Pero se debe acceder a cada uno de ellos al menos una vez cada dos minutos.
 
Artyom Trishkin:
La suavidad no es una opción aquí :)
Sólo tienes que acceder a todos los cf's en funcionamiento al menos una vez cada dos minutos. Suelo llamar cada 90 segundos. Puedes repartir los tiempos de acceso de los diferentes tráficos para no tener que tirar de todos a la vez. Pero se debe acceder a cada uno de ellos al menos una vez cada dos minutos.

Hay frenos.

Pero tenemos que aguantar lo que tenemos.

Es imposible abarcar la inmensidad).

 
Artyom Trishkin:
La suavidad no es una opción aquí :)
Sólo tienes que acceder a todos los cf's en funcionamiento al menos una vez cada dos minutos. Suelo llamar cada 90 segundos. Puedes repartir los tiempos de acceso de los diferentes tráficos para no tener que tirar de todos a la vez. Pero se debe acceder a cada uno de ellos al menos una vez cada dos minutos.

Es imposible separarse. Si al menos una operación no se actualiza, el indicador puede hacer algunas construcciones gráficas incorrectas.

Por otro lado, he comprobado la disponibilidad de las series de tiempo antes de OnCalculate y OnChartEvent. Como se sugiere.

La actualización de las series de tiempo y la comprobación de la disponibilidad de las series de tiempo provocan graves ralentizaciones.

Sigue habiendo interrupciones en el acceso a la serie temporal. Como dije al crear la rama en uno de los primeros posts. Esto confirma que tenemos que actualizar las series de tiempo de forma programada.

Este es el primero.

Segundo. ¿Por qué todos los desarrolladores tienen que molestarse en organizar el acceso a las series temporales?

¿Por qué no hay algún "mecanismo" adicional que elimine esta molestia?

Si alguien necesita esta molestia, nadie le prohíbe el uso de lo que ahora está disponible. Y para los que piensan que el acceso alternativo universal a las series de tiempo está bien, es mejor que ese acceso lo hagan los desarrolladores.

Varias personas me han pedido que traduzca un programa de MT4 a MT5. Lo he hecho. No estoy satisfecho con la traducción. Pero mientras haya descargado el programa, no tengo ninguna queja. Puede que estén satisfechos con ello. Aunque lo dudo.

Me gustaría añadir algo por mi parte. He dejado de experimentar con la optimización del acceso a las series temporales. Esto es un uso improductivo del tiempo. Hay cosas más interesantes que hacer. Que los interesados trabajen con MT5. Lo único que se puede masticar de MT5 es el historial de cotizaciones. Para su uso en la enseñanza de NS.

 
Eugeni Neumoin:

Por otro lado, se han realizado comprobaciones de disponibilidad de series temporales antes de las funciones OnCalculate y OnChartEvent. Como se sugiere.

La actualización de las series de tiempo y la comprobación de la disponibilidad de las series de tiempo provocan graves ralentizaciones.

Se sugirió hacer esto con un temporizador cada minuto y medio. No antes de cada tic, y desde luego no en un evento del gráfico.

El acceso a las series de tiempo en MT5 realmente no es ideal. Pero si necesita resolver un problema en lugar de encontrar una excusa, es posible.