Preguntas sobre el MQL5 Wizard y la biblioteca estándar de clases comerciales - página 11

 
Reshetov:

Tres preguntas:

  1. ¿Cómo hacer que el módulo de señales funcione sólo en los precios de apertura y no en cada tick?
  2. ¿Cómo obtengo los valores de votación del módulo de señal en el módulo de seguimiento de posición? Hay que arrastrar sobre una señal ya calculada y no inventarse otro módulo de señal para seguir.
  3. ¿Cómo obtener los valores de votación del módulo de alarma en el módulo de gestión de dinero y riesgo? Es necesario abrir los volúmenes de acuerdo con las señales de comercio ya calculadas, no componer otro módulo de señales para el cálculo del volumen.

Teóricamente, por supuesto, podemos montar el EA utilizando el asistente y luego romper en el código y añadir todas estas características manualmente. Pero es deseable que todo esto se haya implementado en forma de métodos estándar, es decir, para los tontos que quieran utilizar el asistente, para que no tengan que entrar en el código y editar, por ejemplo, en caso de que quieran sustituir un módulo de señal por otro.

Respondes a todas tus propias preguntas: "... construir el EA con la ayuda de un asistente, y luego ... manualmente...". Todavía no hay otras opciones. Lo más probable es que el mago no se desarrolle en un futuro próximo. Las clases de la Biblioteca Estándar no son un dogma, sino un intento de proporcionar un conjunto de soluciones típicas (en mi opinión). Heredar (para usar en el Asistente), sobrecargar métodos, añadir los propios. Y serás "feliz"...
 
uncleVic:
Usted mismo ha respondido a todas sus preguntas: "... construir un EA con la ayuda de un asistente, y luego ... manualmente...". Todavía no hay otras opciones. Lo más probable es que el mago no se desarrolle en un futuro próximo.

Es una pena que una empresa tan buena esté abandonada en un rincón lejano.

Si se hubiera puesto al día, se podrían haber hecho muchas cosas, es decir, podríamos haber creado módulos listos a partir de los cuales los dummies y otros usuarios podrían montar varios EAs ya hechos sin tener que pasar por los códigos. Pero en este caso tenemos el mismo lío que con el mql4 algorítmico, es decir, coges un algoritmo, te metes en el código y lo usas manualmente. Una vez más, se viola el principio OOP. Por ejemplo, si quieres sustituir un módulo por otro, tendrás que volver a entrar en el código y cambiar todo manualmente de nuevo. Se obtienen muchas tonterías, porque sólo "rastrear" los códigos, para al menos entender dónde y qué modificar, mataría mucho tiempo.

Fue un buen comienzo. Lástima. Acabo de crear un módulo de señal ayer, pero todavía estoy desconcertado de cómo hacer que todo el EA funcione sin ir al código fuente cada vez. Acabo de insertar y añadir la gestión de posiciones, la gestión del dinero y la gestión del riesgo, y todo funciona. Pero no, no funcionará. Si un usuario construye un EA utilizando el asistente, no funcionará. Tendrá que escribir toda una serie de instrucciones sobre dónde buscar en el código y qué cambiar. Por no hablar de que todavía tengo que ocuparme de todo esto antes de escribir una instrucción.

Así que ahora no les queda a los usuarios más que aprender mql5, OpenCL, etc. para lidiar con el autotrading. De lo contrario, no tendrán suerte.

Bueno, ya que este proyecto ha sido abandonado, ahora voy a pensar en otra dirección.

 
Reshetov:

Es una pena que un esfuerzo tan bueno se abandone a un rincón lejano.

Esperemos que no esté abandonado, sino archivado. Yo mismo tengo muchos pensamientos interesantes sobre el desarrollo del Maestro. Pero...
 
uncleVic:
Esperemos que no se abandone sino que se posponga. Yo mismo tengo muchas ideas interesantes sobre el desarrollo del Mago. Pero...

La esperanza muere al último (c) proverbio popular

A la primera pregunta, es decir, cómo probar el módulo de señales abriendo precios y operando por ticks, encontré una solución para no tener que escarbar en los códigos, e incluso mejor que la generalmente aceptada.

Todavía no he averiguado cómo leer las indicaciones del módulo de señales en los módulos de gestión de posiciones y de renta variable y riesgo. Busqué en el código fuente y busqué por ahí. El módulo de señales obtiene sus resultados a través del método direction(), es decir, sólo tengo que dirigirme a una instancia de esta misma clase de módulo en los módulos de gestión de posiciones y de gestión de acciones y riesgos y llamar a este mismo método para leer sus valores. Todavía no está claro cómo se puede hacer esto sin cambiar el código.

 
Reshetov:

La esperanza es eterna (c) proverbio popular

A la primera pregunta, es decir, cómo probar el módulo de señales abriendo precios y operando por ticks, he encontrado una solución para no tener que entrar en los códigos, e incluso mejor que la generalmente aceptada.

Y no consigo averiguar cómo leer las indicaciones del módulo de señales en los módulos de gestión de posiciones y de renta variable y de riesgo, sin escarbar en los códigos. Busqué en el código fuente y miré por ahí. El módulo de señales obtiene sus resultados a través del método direction(), es decir, sólo tengo que dirigirme a una instancia de esta misma clase de módulo en los módulos de gestión de posiciones y de gestión de acciones y riesgos y llamar a este mismo método para leer sus valores. Todavía no está claro cómo se puede hacer esto sin cambiar el código.

Sin cambiar los códigos probablemente no funcione.

 
uncleVic:

No cambiar los códigos probablemente no funcionará.

Todavía no está todo perdido. Puedes crear clases heredadas de CExpert, CExpertMoneu y CExpertTrailing y añadirles los métodos necesarios para acceder a una instancia de la clase del módulo de señales. Pero aquí también hay un problema, ya que el asistente escribe en el EA creado #include <Experto.mqh> y no su descendiente.

Todavía tenemos que pensar en ello.

Si los desarrolladores hubieran adivinado desde el principio que un módulo de señales se puede utilizar para todos los demás módulos como el principal y que se pueden añadir señales adicionales (como en esta versión del asistente) a los módulos de apoyo a la posición y de gestión de la renta variable y del riesgo, los códigos habrían sido más fáciles. Pero en nuestro caso, cada módulo requiere especificar condiciones adicionales para las señales y, por lo tanto, necesitan ajustes externos adicionales, lo que resulta en un monstruo con una gran cantidad de parámetros a optimizar. Por no mencionar que las señales de un módulo pueden entrar en conflicto, es decir, un módulo de señales puede abrir una posición y un módulo auxiliar - cerrarla en el siguiente tick, si las condiciones de entrada y salida del mercado son contradictorias.

 
Reshetov:

Todavía no está todo perdido. Después de todo, puedes crear clases heredadas de CExpert, CExpertMoneu y CExpertTrailing y añadirles los métodos necesarios de acceso a una instancia de la clase del módulo de señales. Pero aquí también hay un problema, ya que el asistente escribe en el EA creado #include <ExpertoExperto.mqh> y no su descendiente.

Todavía tenemos que pensar en ello.

Si los desarrolladores hubieran adivinado desde el principio que un módulo de señales se puede utilizar para todos los demás módulos como el principal y que se pueden añadir señales adicionales (como en esta versión del asistente) a los módulos de apoyo a la posición y de gestión de la renta variable y del riesgo, los códigos habrían sido más fáciles. Pero en nuestro caso, cada módulo requiere especificar condiciones adicionales para las señales y, por lo tanto, necesitan ajustes externos adicionales, lo que da lugar a un monstruo de este tipo con una gran cantidad de parámetros a optimizar. Sin mencionar el hecho de que las señales de un módulo pueden entrar en conflicto, es decir, un módulo de señales puede abrir una posición y un módulo auxiliar - cerrarla en el siguiente tick, si las condiciones de entrada y salida del mercado son contradictorias.



Así es como está diseñado. El asistente crea el "pez" del EA. Además:

  • La sustitución de la inclusión no es un problema;
  • la señal principal se crea intencionadamente en el exterior (para facilitar la sustitución);
  • ¿añadir algunas llamadas a métodos ints y setting?
 
uncleVic:

Así es como se pretendía. El maestro crea el "pez" del asesor. Siguiente:

  • reemplazar la línea no es un problema;
  • la señal principal se crea intencionadamente fuera (para facilitar la sustitución);
  • ¿añadir algunas llamadas a métodos de intuts y setting?


Eso es lo feo del asunto, cosas como:

  1. El acceso a los métodos de las clases de los módulos incluidos en el sistema de comercio está denegado incluso para la lectura, lo que descarta por completo la posibilidad de coordinar su trabajo.
  2. Los módulos de señales pueden entrar fácilmente en conflicto con los módulos de seguimiento de la posición, ya que tienen señales diferentes, por lo que no se puede excluir la incompatibilidad.
  3. Diferentes señales en los módulos, y por lo tanto todos tienen ajustes separados, lo que resulta en no pocos, sino muchos ajustes de entrada para un EA. Cuantas más configuraciones diferentes, mayor será la probabilidad de ajustarse al historial.
  4. Después de la operación del asistente, a veces es necesario revisar las fuentes para solucionar los problemas. Para el usuario final que no está familiarizado con la programación no es nada adecuado, porque necesita "plug-and-play". Estas confusiones también crean problemas para un programador, porque es mucho más fácil trabajar con el código propio que con el código apilado con un asistente. Una dificultad adicional es que las clases se heredan, es decir, la causa del malentendido rara vez se encuentra en el nivel de los descendientes, sino que hay que buscar en las clases padre.

Queríamos lo mejor. Resulta ser el mismo de siempre (c) Chernomyrdin

En general, la mayoría de los malentendidos pueden arreglarse, pero esto debe hacerse en el nivel de la clase madre raíz y luego las clases arregladas pueden distribuirse mediante actualizaciones de la plataforma. Es decir, es necesario abrir el acceso al método Direction() del módulo de señales desde los módulos de apoyo a la posición y de gestión de la equidad y del riesgo. Porque si los desarrolladores de módulos individuales editan el código fuente de las clases padre, la incompatibilidad resultante del código fuente será incompatible y los módulos creados no funcionarán en otros equipos. Si los desarrolladores de módulos crean clases padre con métodos anulados, la incompatibilidad seguirá siendo a nivel de maestro, porque éste escribe sus propios inludes, y, en consecuencia, los usuarios finales tienen que volver a escribir las instrucciones, y difícilmente querrán entrar en los fuentes, y si lo hacen, entonces error en un solo símbolo o en otro lugar, etc.

 
Reshetov:

Ese es el problema, porque desde el principio hay cosas que no se tuvieron en cuenta:

  1. El acceso a los métodos de las clases de los módulos incluidos en el sistema de comercio está denegado incluso para la lectura, lo que descarta por completo la posibilidad de coordinar su trabajo.
  2. Los módulos de señales pueden entrar fácilmente en conflicto con los módulos de seguimiento de la posición, ya que tienen señales diferentes y, por lo tanto, no se puede excluir la incompatibilidad.
  3. Diferentes señales en los módulos, y por lo tanto todos tienen ajustes separados, lo que resulta en no pocos, sino muchos ajustes de entrada para el EA. Cuantas más configuraciones diferentes, mayor será la probabilidad de ajustarse al historial.
  4. Después de la operación del asistente, a veces es necesario revisar las fuentes para solucionar los problemas. Para el usuario final que no está familiarizado con la programación no es nada adecuado, porque necesita "plug-and-play". Estas confusiones también crean problemas para un programador, porque es mucho más fácil trabajar con el código propio que con el código apilado con un asistente. Una dificultad adicional es que las clases se heredan, es decir, la causa del malentendido rara vez se encuentra en el nivel de los descendientes, sino que hay que buscar en las clases padre.

Queríamos lo mejor. Resulta ser el mismo de siempre (c) Chernomyrdin

En general, la mayoría de los malentendidos se pueden arreglar, pero es deseable hacerlo en el nivel de la clase madre raíz y luego distribuir las clases arregladas mediante actualizaciones. Porque si el código fuente de las clases padre es corregido por los desarrolladores de módulos, la incompatibilidad resultante del código fuente será incompatible y los módulos creados no funcionarán en otros equipos. Si el desarrollador crea clases padre con métodos anulados, entonces la incompatibilidad ya está en el nivel maestro, porque escribe sus propias inclusiones, y por lo tanto de nuevo necesita escribir instrucciones a los usuarios finales, y es poco probable que quieran entrar en el código fuente, y si entran, entonces el error en un solo carácter o en otro lugar, y así sucesivamente.

Hagamos sugerencias concretas. Los tendremos en cuenta.
 
uncleVic:
Permítanos ofrecerle algunas sugerencias. Los revisaremos.

Hasta ahora, sólo hay una cosa que soluciona las desventajas anteriores:

Acceso abierto a la lectura de los valores devueltos por el método Direction() del módulo de señales desde los módulos de gestión de posiciones y de gestión de capitales y riesgos.

Añade un método más, por ejemplo, con identificador doble getMainSingnal(), que hace referencia a una instancia de la clase del módulo de señales y devuelve el resultado del método Direction() del módulo de señales. Dado que este intercambio de información tiene lugar en modo de sólo lectura, la seguridad no se romperá de ninguna manera.

Para ello

  1. Asignar algunos campos en las clases CExpertMoney y CExpertTrailing para almacenar una instancia de CExpertSignal, es decir, el módulo principal de señales.
  2. Una instancia de CExpertSignal, es decir, el módulo de señales, debe pasarse a los módulos de gestión de posiciones y de gestión de capital y riesgo durante la inicialización de las instancias de estos módulos y almacenarse en los campos especificados en el paso 1. Obviamente, antes de hacer esto, también debemos comprobar (asegurarnos) que ya existe una instancia de la clase del módulo de señales, es decir, que fue creada.
  3. Crear en las clases CExpertMoney y CExpertTrailing métodos adicionales, con identificador double getMainSingnal(), que se dirijan a una instancia de la clase del módulo de señales, almacenada en los campos correspondientes de estas clases y que devuelvan el resultado del método Direction() del módulo de señales.

P.D. La clase CExpert tiene una referencia a una instancia de la clase del módulo de señales.

CExpertSignal    *m_signal;                   // trading signals object
Tienes que crear campos análogos para las clases CExpertMoney y CExpertTrailing y pasarles el mismo valor del campo mencionado a la clase CExpert durante la inicialización
Razón de la queja: