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

 
Reshetov:

Hasta ahora, sólo hay una solución para resolver los inconvenientes 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 se realiza en modo de sólo lectura, la seguridad no se ve comprometida en modo alguno.

Para ello

  1. Asignar campos en las clases CExpertMoney y CExpertTrailing para almacenar una instancia de la clase CExpertSignal, es decir, el módulo principal de señales.
  2. Esta misma instancia de la clase CExpertSignal, es decir, el módulo de señales, debe pasarse a los módulos de gestión de posiciones y de gestión monetaria durante la inicialización de las instancias de estas clases de módulos y su guardado en los campos especificados en el paso 1. Obviamente, antes de hacer eso, debe comprobar (asegurarse) 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 doble getMainSignal(), que remitan a la instancia de la clase del módulo de señales, almacenada en los campos correspondientes de estas clases y que devuelvan como resultado, el resultado del método Direction() del módulo de señales.

Casi todo está claro. Lo único que quiero aclarar: "¿por qué este deseo tuyo de ver la señal en el nivel de MM y de arrastre debe implementarse en el nivel de la clase base?

No creo que eso sea algo bueno (es decir, malo). El algoritmo no es típico (desde mi punto de vista). Según tengo entendido, tienes tus propios módulos de MM y trailing (con sus propios algoritmos ligados a la señal).

Aquí y pon en ellos los correspondientes 1.,2.,3.

 
uncleVic:

Casi todo está claro. Lo único que me gustaría aclarar es "¿por qué este deseo suyo de ver la señal a nivel de MM y de arrastre debe implementarse a nivel de clase base?".

No creo que eso sea algo bueno (es decir, malo). El algoritmo no es típico (desde mi punto de vista). Según he entendido tienes tus propios módulos de MM y trailing (con tus propios algoritmos vinculados a la señal).

Así que, pon el 1, 2, 3 apropiado en ellos.

La cuestión es que el Maestro toma como base la clase SEhregt. Y en consecuencia, no puedo sobrescribir funciones necesarias en los módulos que creo, porque ya son incompatibles con esta clase CEhregt tan básica desde el principio porque no tienen acceso a una instancia de la clase de módulo de señales.

Debido a que la instancia de la clase de módulo de señal se almacena sólo en el campo de la clase SEhregt en el archivo Expert.mqh, línea 67

CExpertSignal    *m_signal;                   // trading signals object

y este campo no es compartido (inaccesible) con otras clases y módulos creados a partir de ellas.

Por esta misma razón, no hay forma de anular las clases CExpertMoney y CExpertTrailing para hacerlas compatibles con el asistente.

Al fin y al cabo, si se deniega el acceso en las clases padre, los descendientes no lo obtendrán de ninguna manera.


Llegar a la raíz (c) "Aforismos" de Kozma Prutkov

 

He descubierto cómo pasar las señales de trading desde el módulo de señales a los módulos de mantenimiento de posiciones y de gestión de dinero y riesgo sin pasar instancias de CExpertSignal.

Vamos a añadir dos líneas a las clases CExpertMoney y CExpertTrailing:

  double m_signaldirection; // Direction from signals module
 
  void              setSignalDirection(double value)  { m_signaldirection = value; }
  

Para el archivo ExpertMoney.mqh:

class CExpertMoney : public CExpertBase
  {
protected:
   //--- Direction from signals module  
   double m_signaldirection;
   //--- input parameters
   double            m_percent;

public:
                     CExpertMoney();
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   //--- methods of setting adjustable parameters
   void              Percent(double percent)    { m_percent=percent; }
   //--- method of verification of settings
   virtual bool      ValidationSettings();
   //---
   virtual double    CheckOpenLong(double price,double sl);
   virtual double    CheckOpenShort(double price,double sl);
   virtual double    CheckReverse(CPositionInfo* position,double sl);
   virtual double    CheckClose(CPositionInfo* position);
  };

Para el archivo ExpertTrailing.mqh:

class CExpertTrailing : public CExpertBase
  {
protected:
   
    //--- Direction from signals module
   double m_signaldirection;
public:
   //---
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double& sl,double& tp)  { return(false); }
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double& sl,double& tp) { return(false); }
  };


De este modo, hemos definido los campos y métodos necesarios para pasar las señales de negociación. Ahora tenemos que pasar estas señales de comercio a las clases del módulo. Lo haremos en Expert.mqh, es decir, para la clase CExpert

Escribiremos una línea para pasar nuestras señales de trading a la clase de soporte de posiciones

m_trailing.setSignalDirection(m_signal.Direction());

e insertarlo al principio del método que se llama antes de cada trailing stop, es decir, CheckTrailingStop():

bool CExpert::CheckTrailingStop()
  {
//--- Set signal direction to trailing stops module
   m_trailing.setSignalDirection(m_signal.Direction()); 
//--- position must be selected before call
   if(m_position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- check the possibility of modifying the long position
      if(CheckTrailingStopLong()) return(true);
     }
   else
     {
      //--- check the possibility of modifying the short position
      if(CheckTrailingStopShort()) return(true);
     }
//--- return without operations
   return(false);
  }

Escribiremos una línea para pasar las señales de trading a la clase de gestión de dinero y riesgo:

m_money.setSignalDirection(m_signal.Direction());

e insertarlo al principio del método que se llama antes de la apertura de cada posición, es decir, CheckOpen():

bool CExpert::CheckOpen()
  {
//--- set signal direction to money management module
   m_money.setSignalDirection(m_signal.Direction());
   if(CheckOpenLong())  return(true);
   if(CheckOpenShort()) return(true);
//--- return without operations
   return(false);
  }

Y ya está, el problema está resuelto.

Ahora, podemos obtener el valor actual de las señales de negociación en los módulos de gestión de posiciones y de renta variable y gestión de riesgos accediendo al valor del campo m_signaldirection. Ahora sólo tenemos que registrar los nuevos campos y métodos en las clases CExpertMoney y CExpertTrailing en la documentación y añadir los archivos modificados a las actualizaciones.

 

Aquí están los archivos. En el Experto, las líneas 100 y 123 están escritas a mano.

Si tiene alguna otra pregunta, no dude en consultarla.

 
uncleVic:

Aquí están los archivos. En el Experto, las líneas 100 y 123 están escritas a mano.

Si tiene más preguntas, no dude en ponerse en contacto conmigo.

¿Qué clase de personas son estos desarrolladores? ¿Cuándo van a empezar a escuchar lo que necesitan los operadores, que ya tienen experiencia en la creación de sistemas de negociación, en lugar de proponer su propia visión de diseñar sistemas de negociación que son prácticamente inutilizables para los usuarios finales porque tienen que ajustar manualmente el código fuente? Cuántas veces tengo que explicar que puedo entrar manualmente y arreglar el código fuente, e incluso así me llevará mucho tiempo entender qué es qué, aunque esté familiarizado con la programación. Y es poco probable que el usuario final se meta en el código, porque no entiende de programación. Usted mismo declaró, y cito:

"El conocimiento de los lenguajes de programación ya no es un requisito previo para crear robots de trading."Ver https://www.mql5.com/ru/articles/240.

"La primera versión del Asistente MQL5 ya tenía la posibilidad de crear rápidamente un Asesor Experto listo para usar como un conjunto de módulos simples en forma de código fuente en MQL5. Incluso no es necesario que conozca MQL5- sólo tiene que leer"Construya su propio Asesor Experto en MQL5 Wizard" (ver https://www.mql5.com/ru/articles/275).

Ahora resulta que se requieren conocimientos de lenguajes de programación, ya que el usuario tiene que introducir el código después del Asistente y editar algo allí. Es decir, todas las declaraciones anteriores son invenciones y engaños de los desarrolladores.

Por ejemplo, si escribo mi propio módulo de gestión del dinero y del riesgo que debe abrir una posición según el nivel de la señal comercial emitida por un módulo escrito por otro desarrollador de módulos. Como resultado, mi módulo será incompatible con el asistente. ¿Cómo explicar a los usuarios que tienen que ir a alguna parte del código e insertar algunas cadenas para que el módulo funcione? Al fin y al cabo, los desarrolladores de módulos deberían crearlos y el maestro debería combinarlos automáticamente en un sistema coherente, de modo que los módulos, como mínimo, no entren en conflicto y sean totalmente compatibles entre sí. Pero en tu caso, el asistente no lo hace, porque después del asistente tienes que ir al código y rehacer todo manualmente.

¿Realmente es tan difícil poner sólo seis líneas en los archivos de clase de los padres, lo que señalé en mi post anterior? Y el problema se resolverá por sí mismo y nadie tendrá que entrar en las fuentes y cambiar algo allí. ¿Qué se le caerán las manos? ¿Por qué perder el tiempo en un galimatías con la demostración de cómo hay que corregir manualmente algo después del asistente? ¿No se puede dedicar ese mismo tiempo a algo más útil, para que nadie tenga que meterse después en el código para resolver problemas similares?

¿Cuál es la ideología de su empresa: por un lado declara la automatización completa, pero cuando se trata de la práctica sugieren entrar en el código y rehacer todo a mano después de la llamada "automatización"?

En general, a mi entender, es inútil explicar todo esto. No debería sorprenderle que los operadores no quieran cambiar a MT5 porque la plataforma es tosca y está desarrollada no para la comodidad del autotrading, sino para la comodidad de los desarrolladores de esa misma plataforma. Y a menos que el usuario aprenda a fondo la programación, es mejor que se mantenga alejado del comercio automatizado.

Si no quieres, no tienes que hacerlo. Si no tiene nada más que hacer, siéntese aquí y explique a cada usuario dónde y cómo tiene que entrar en el código fuente con sus manos y qué es exactamente lo que tiene que arreglar.

Собери свой торговый советник в Мастере MQL5
Собери свой торговый советник в Мастере MQL5
  • 2011.01.14
  • MetaQuotes Software Corp.
  • www.mql5.com
Знание языков программирования теперь не является обязательным условием для создания торговых роботов. Если раньше это действительно служило непроходимым препятствием для реализации своих торговых стратегий, то появление Мастера MQL5 в корне изменило ситуацию. Начинающие трейдеры могут перестать тревожиться из-за отсутствия опыта программирования - с новым визардом, позволяющим быстро генерировать код советника, он не понадобится.
 
Me temo que, o bien estás en las garras del maximalismo, o simplemente no entiendes los límites de la aplicabilidad de las herramientas.

En cualquier caso, con este nivel de argumentación y llevando casi todos los temas más allá de los límites de la exageración, no se puede trabajar contigo. El trabajo real implica una toma de decisiones consciente, no una demagogia verbal.
 
Renat:
Me temo que, o bien estás en las garras del maximalismo, o simplemente no entiendes los límites de aplicabilidad de las herramientas.

En cualquier caso, con este nivel de argumentación y llevando casi todas las cuestiones más allá de los límites de la exageración, no se puede trabajar contigo. El trabajo real implica una toma de decisiones consciente, no una demagogia verbal.

En general, no pedía trabajo, es decir, ganar dinero, y estaba bastante contento de cooperar de forma voluntaria. Cómo y dónde me gano la vida lo decido yo.

Pues no lo hará y no tiene por qué hacerlo. Nuestro negocio es ofrecer, usted tiene el derecho de rechazar. Como se dice: el maestro es el jefe.

Si su empresa ya lo ha entendido todo e incluso ha enseñado a los dummies a crear los llamados Asesores Expertos "ya hechos". Además, la cuestión es que sólo sirven para la demostración del Asistente, pero no son muy buenos para el comercio automatizado, porque incluso en los datos históricos la curva de la equidad parece inconveniente ya que la modularidad está implementada, pero falta la consistencia de los módulos para un sistema de comercio completo.

Buena suerte.

 
Reshetov:
...

Por ejemplo, si escribo mi propio módulo de gestión de dinero y riesgo, que debería abrir una posición según el nivel de la señal de negociación emitida por el módulo escrito por otro desarrollador de módulos. El resultado será que mi módulo ya es incompatible con el asistente. ¿Cómo explicar a los usuarios que tienen que ir a alguna parte del código e insertar algunas cadenas para que el módulo funcione? Al fin y al cabo, los desarrolladores de módulos deberían crearlos y el asistente debería combinarlos automáticamente en un sistema coherente, de modo que los módulos, como mínimo, no entren en conflicto y sean totalmente compatibles entre sí. Y tienes un asistente que no lo hace, porque después tienes que ir al código y rehacer todo manualmente.

¿Realmente es tan difícil escribir sólo seis líneas en los archivos de clase de los padres, lo que señalé en mi post anterior? Y el problema se resolverá por sí mismo y nadie tendrá que ir a las fuentes y cambiar algo allí. ¿Qué se le caerán las manos? ¿Por qué perder el tiempo en un galimatías, demostrando cómo arreglar manualmente algo después del asistente? ¿No se puede dedicar ese mismo tiempo a algo más útil, para que nadie tenga que meterse en el código después para resolver problemas similares?

...

Su enfoque viola la encapsulación de clases y, como resultado, trae confusión jerárquica.

Lea tranquilamente el libro de Steve McConell "El código perfecto".

Imagínese que en una fábrica para la producción de guantes, hay un sello de cinco dedos para la mano derecha y la izquierda, pero luego llega un pequeño pedido de guantes de seis dedos. Hay gente así, después de todo. Pero en lugar de hacer un sello para ellos (que hará un lote y se quedará allí por un tiempo), sugieres modificar el sello de cinco dedos haciendo un dedo deslizante. Parece que es universal y todo es estupendo, pero la fuerza del sello de cinco dedos se debilitará en aras de la universalidad (en aras de una pequeña necesidad de producir ocasionalmente guantes de seis dedos). Y entonces se pedirá un lote de 300 dedos de cuatro patas, y de nuevo se desmenuzará la bien probada y fiable plantilla.

Ya te lo han dicho arriba:

"¿por qué su deseo de ver la señal en el nivel de MM y de arrastre tiene que ser implementado en el nivel de la clase base?".

No creo que sea bueno (es decir, malo). El algoritmo no es típico (desde mi punto de vista). Según tengo entendido, tiene sus propios módulos de MM y de arrastre (con sus propios algoritmos ligados a la señal).

En lugar de realizar cambios en la biblia estándar, sería mejor hacer desarrollos para ampliarla (a través de la herencia). Entonces sería realmente interesante.

HZZ Además, para que la gente no tenga que lidiar con los entresijos del código (como has escrito más arriba), puedes envolver los módulos listos en biblio y sharovariar en el mercado, luego sólo tienes que enchufar el módulo de Reshetov y pulsar el botón [descargar masa].

 
Urain:

Su enfoque viola la encapsulación de las clases, y como resultado introduce una confusión jerárquica.

Lea tranquilamente el libro de Steve McConell "Código perfecto".

En pocas palabras, piense en el Maestro como una fábrica de guantes, hay un sello de cinco dedos para la mano derecha y la izquierda, pero luego llega un pequeño pedido de guantes de seis dedos. Después de todo, hay gente así. Pero en lugar de hacer un sello para ellos (que hará un lote y se quedará allí por un tiempo), sugieres modificar el sello de cinco dedos haciendo un dedo deslizante. Parece que es universal y todo es estupendo, pero la fuerza del sello de cinco dedos se debilitará en aras de la universalidad (en aras de una pequeña necesidad de producir ocasionalmente guantes de seis dedos). Y entonces se pedirá un lote de 300 dedos de cuatro patas, y de nuevo se desmenuzará la bien probada y fiable plantilla.

Ya te lo han dicho arriba:

En lugar de hacer cambios en la biblia estándar, sería mejor hacer desarrollos para ampliarla (a través de la herencia). Entonces será realmente interesante.
¿Cuántas veces podemos decir que no podemos heredar lo que no está disponible en las clases padre? ¿Cuándo conocerá por fin el libro "Code Complete", escrito por el propio Steve McConell?
  1. Mi enfoque no viola los principios de encapsulación, porque en la versión que propuse, todo lo superfluo está oculto, y los módulos sólo reciben una señal de comercio como un valor de tipo double y sólo en modo de lectura. A diferencia de algunas personas, no sólo he leído los libros sobre POO, sino que los he estudiado detenidamente.
  2. No he sugerido crear guantes de seis dedos a los de la plantilla, es decir, adjuntar los sextos dedos como módulos adicionales, sino que simplemente he sugerido hacer coincidir todos los módulos existentes con las señales del módulo de señales, que en realidad es el principal para los sistemas de comercio porque todo el sistema debe funcionar por su mando. Fuiste tú quien sugirió la modularidad, es decir, guantes con dedos intercambiables. Pero como has hecho que la mano derecha no sepa lo que hace la izquierda, es decir, que otros módulos no puedan obtener información del módulo de señales y sincronizar sus acciones con él, los guantes tendrán dedos (módulos) de diferentes tamaños, cuando el usuario se ponga el guante en la mano y vea que uno de sus dedos es pequeño y no cabe en él, mientras que el otro es grande y excesivo.

Por ejemplo, un trailing stop se ejecuta de acuerdo con un sistema de señales separado desarrollado por un desarrollador de terceros del módulo, como una onda móvil o parabólica, cuyas señales en algunos puntos contradicen las señales del módulo y el sistema de negociación comienza a funcionar de manera inconsistente. El módulo de gestión del dinero y del riesgo tampoco puede adivinar telepáticamente que la señal de negociación es débil y que ha llegado el momento de reducir el volumen de las posiciones abiertas y actuar de acuerdo con unas reglas independientes del módulo de señales, es decir, uno de ellos pide que se reduzca la velocidad en las curvas y el otro que se acelere. Y todo el sistema de comercio, creado con la ayuda de su supuesto maestro, resulta como en la fábula de Krylov llamada "El cangrejo y el lucio". Ni más ni menos. Y esta misma ideología de fábula de montar asesores temerarios, su empresa intenta imponernos para el autotrading. ¿Lo necesitamos?

El resultado son sistemas de negociación con tales gráficos de equidad y equilibrio que sólo pueden asustar a los operadores e inversores por igual, véase https://www.mql5.com/ru/code/833.




Esto no se debe a que el creador del módulo, en este caso concreto Nikolay Kositsin, haya hecho algo mal, sino a que el resto de módulos del sistema de comercio no pueden coordinarse entre sí y funcionan de forma incoherente.

Pero es inútil explicarlo. Los desarrolladores de la plataforma, en lugar de escribir unas míseras seis líneas para arreglar los problemas, escribirán kilómetros de notas a pie de página en los foros, acusando a los desarrolladores de sistemas de comercio de difundir la demagogia, las violaciones de encapsulación y otros pecados mortales, pero no moverán un dedo para corregir sus propias deficiencias y malentendidos.

Así que no tiene sentido seguir discutiendo. Quédate con tu opinión y haz lo que quieras. Estoy harto y no sirve para nada, porque a los desarrolladores de la plataforma les importa un bledo, porque no hacen sus propias cosas y si estas mismas herramientas pueden ser utilizadas por los usuarios de la plataforma para el autotrading, a los desarrolladores les da igual. El que está lleno de gente con hambre no sabe de qué tiene hambre.

Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
  • votos: 7
  • 2012.02.23
  • Nikolay Kositsin
  • www.mql5.com
Модуль торговых сигналов для Мастера MQL5. Сигналом для открытия позиций служит изменение цвета свечи, формируемой индикатором Heiken_Ashi_Smoothed.
 
Reshetov:
...

Reshetov, ni siquiera puedo leer tus garabatos emocionales. Si quieres discutir, argumenta tu caso.

El objetivo de un asistente es crear una plantilla que satisfaga las necesidades de la mayoría de los operadores. Tengo una plantilla de EA en cherver (la escribí yo mismo), establece la funcionalidad básica. Y en la práctica siempre hay que corregirlo. Pero las ediciones son mínimas. Si hubiera creado una plantilla para no editarla en absoluto, habría sido un código enorme para todas las ocasiones, en el que uno podría perderse.

El asistente crea una plantilla que ya funciona, y una persona que no sepa programar puede utilizarla tal cual. Si entiendes de codificación, es fácil cambiarlo a lo que quieres. Basta con entender una vez cómo se crean las cosas y dónde se separan en la biblioteca estándar. Además, también puedes utilizar la biblioteca estándar como plantilla y simplemente copiar las secciones que te gusten en tu propio código.