Discusión sobre el artículo "MQL5 Wizard: Cómo crear un módulo de señales de trading"

 

Artículo publicado MQL5 Wizard: Cómo crear un módulo de señales de trading:

En este artículo se explica el modo de escribir su propia clase de señales de trading con la implementación de señales en el cruce del precio con el promedio móvil y la manera de incluirla en el generador de estrategias de trading de MQL5 Wizard, también se describe la estructura y el formato de la clase generada para MQL5 Wizard.

Figura 1. La estructura de la clase base CExpert

Autor: MetaQuotes Software Corp.

 
¡Caballeros camaradas! Leí el artículo. Hice todo como está escrito en él, bueno creo que ahora voy a llegar al cielo. Pero no - Master MKL 5 no vio mi archivo con señales. He comprobado todo de nuevo, lo hice todo de nuevo, comprobado de nuevo, pero la señal no es visible en el asistente de creación de Asesores Expertos. Adjunto mi archivo, que he creado de acuerdo con las recomendaciones del artículo. Ayudenme a entender que hice mal o por el contrario el autor del articulo no agrego algo importante, por lo cual no me cuadra de ninguna manera. En resumen, ayúdame en lo que puedas.
Archivos adjuntos:
 
Tincup:
¡Caballeros camaradas! Leí el artículo. Hice todo como está escrito en él, bueno creo que ahora voy a llegar al cielo. Pero no - Master MKL 5 no vio mi archivo con señales. He comprobado todo de nuevo, lo hice todo de nuevo, comprobado de nuevo, pero la señal no es visible en el asistente de creación de Asesores Expertos. Adjunto mi archivo, que he creado de acuerdo con las recomendaciones en el artículo. Ayudenme a entender que hice mal o por el contrario, el autor del articulo no agrego algo importante, por lo cual no cuadra de ninguna manera. En resumen, ayúdame en todo lo que puedas.


Eldescriptor de clase es una parte importante del texto fuente.

Hay dos errores evidentes en su descriptor. Uno de ellos impide detectar la señal porque se especifica un ENUM inexistente. El segundo causará problemas durante la compilación (nombre incorrecto del parámetro).

Una sutileza más. Sólo debe haber un espacio antes de la palabra clave, en cada línea del descriptor. (Creo que esta restricción se eliminará en el futuro, pero por ahora es así).

// wizard description start
//+---------------------------------------------------------------------------+
//| Description of the class                                                |
//| Title=Сигнал пересечению ценой скользящей средней                     |
//| Type=Signal                                                             |
//| Name=Sample                                                             |
//| Class=CSampleSignal                                                     |
//| Page=                                                                   |
//| Parameter=PeriodMA,int,12                                                |
//| Parameter=ShiftMA,int,0                                                  | было SniftMA
//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA                               |
//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE                      | было ENUM_MA_APLLIED_PRICE
//| Parameter=Limit,double,0.0                                               |
//| Parameter=StopLoss,double,50.0                                           |
//| Parameter=TakeProfit,double,50.0                                         |
//| Parameter=Expiration,int,10                                              |
//+---------------------------------------------------------------------------+
// wizard description end


Más sobre el texto.

No tener un constructor es malo. Deberías inicializar los datos-miembro con valores por defecto. Después de todo, en el caso general, el método de establecer un parámetro puede no ser llamado.

Y por último, los métodos se describen incorrectamente

   void     LimitMA (int value)                    {m_limit=value;}
   void     StopLoss (int value)                   {m_stop_loss=value;}
   void     TakeProfit (int value)                 {m_take_profit=value;}

debe

   void     LimitMA (double value)                    {m_limit=value;}
   void     StopLoss (double value)                   {m_stop_loss=value;}
   void     TakeProfit (double value)                 {m_take_profit=value;}

 

Muchas gracias por su respuesta, por supuesto. Arreglé todo y funcionó.

Pero al compilar el propio Asesor Experto, me dio un error, que no hubiera encontrado por mí mismo si lo hubiera encontrado el compilador. Por cierto, cuando me contestabas, debiste arreglarlo imperceptiblemente para ti, pero está ahí en el texto original del artículo.

En el artículo.

  void               Limit(double value)                 { m_limit=value;                  }

en respuesta a mi petición de ayuda

  void               LimitМА(double value)                 { m_limit=value;}

la ausencia de MA en el archivo de señal, al compilar el propio Asesor Experto después de su generación exitosa, genera el siguiente error

'Limit' - member function is not defined 123456.mq5 77 11
1 error(es), 0 warning(s) 2 1

Siguiendo en mi caso al menos en la línea 77 vemos

signal.Limit(Inp_Signal_Sample_Limit);

insertar MA después de la palabra Limit

El error en el texto del Asesor Experto desaparece.

Si estoy equivocado, pido disculpas. No soy un profesional.

 
Y, en consecuencia, la descripción no debe ser Límite, sino LímiteMA.
 

Y una cosa más: este error aparece pase lo que pase:

--' - l-value required 1234.mq5 31 57

--' - l-value required 1234.mq5 31 59
'--' - l-value required 1234.mq5 31 61
'--' - l-value required 1234.mq5 31 63
'--' - l-value required 1234.mq5 31 65
'--' - l-value required 1234.mq5 31 67
'--' - l-value required 1234.mq5 31 69
'--' - l-value required 1234.mq5 31 71
'--' - l-value required 1234.mq5 31 73
'--' - l-value required 1234.mq5 31 75
'--' - l-value required 1234.mq5 31 77
'--' - l-value required 1234.mq5 31 79
'--' - l-value required 1234.mq5 31 81
'--' - l-value required 1234.mq5 31 83
'--' - l-value required 1234.mq5 31 85
'--' - l-value required 1234.mq5 31 87
'--' - l-value required 1234.mq5 31 89
'--' - l-value required 1234.mq5 31 91
'--' - l-value required 1234.mq5 31 93
'--' - l-value required 1234.mq5 31 95
'--' - l-value required 1234.mq5 31 97
'--' - l-value required 1234.mq5 31 99
'--' - l-value required 1234.mq5 31 101
'--' - l-value required 1234.mq5 31 103
'--' - l-value required 1234.mq5 31 105
'--' - l-value required 1234.mq5 31 107
'--' - l-value required 1234.mq5 31 109
'--' - l-value required 1234.mq5 31 111
'--' - l-value required 1234.mq5 31 113
'--' - l-value required 1234.mq5 31 115
'-' - operando esperado 1234.mq5 31 117
'Inp_Signal_Sample_Expiration' - identificador no declarado 1234.mq5 77 22
32 error(es), 0 warning(s) 33 1

Ve a la línea 31 del EA para ver lo siguiente

input double Inp_Signal_Sample_StopLoss =50.0;
input double Inp_Signal_Sample_TakeProfit=50.0;
input int Inp_Signal_Sample_Expiration=10-------------------------------------------------------------;
//--- inputs for money
input double Inp_Money_FixLot_Percent =10.0;

input double Inp_Money_FixLot_Lots =0.1;

Quite la cola en forma de línea de puntos que viene de 10 y todos los errores desaparecen.

El Asesor Experto está listo para trabajar y optimizar.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 
Tincup:
Sí, y en consecuencia, la descripción no debería ser Limit, sino también LimitMA

Sí, LimitMA, lo he buscado.

En general, para el futuro... Al crear un descriptor de clase, utilice copypaste más activamente, porque el compilador no comprueba los comentarios (que componen el descriptor), y la coincidencia de nombres de métodos y nombres de parámetros del descriptor es importante. Esto "sale" sólo al compilar el Asesor Experto y causa emociones negativas. Aunque, como se puede ver, no es nada fatal.

 
Tincup:

Y una cosa más: este error aparece pase lo que pase:

'--' - l-value required 1234.mq5 31 57

Este error se produce debido a la longitud de la cadena del descriptor de clase. Después de las vacaciones, lo solucionaremos.
Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Buen material... bien escrito y, sin duda, una revelación.
 

¡Buenas tardes!

  1. Hay una errata en el archivo adjunto, ¡si no me confundo! En la descripción de la función CheckOpenLong en las líneas para calcular las variables sl y tp, los signos deberían estar invertidos.
  2. He cambiado la función CheckOpenLong de la siguiente manera:
    bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
      {
    
       Print("Close(0)=",DoubleToString(Close(0),5)," Close(1)=",DoubleToString(Close(1),5));
       Print("Open(0)=",DoubleToString(Open(0),5)," Open(1)=",DoubleToString(Open(1),5));
       Print("MA(0)=",DoubleToString(MA(0),5)," MA(1)=",DoubleToString(MA(1),5));
    
       return(false);
       
      }
    Es decir, simplemente debería mostrar los valores de Close, Open y MA para la última y anterior barra. Así que si el valor de EveryTick es falso, entonces todo funciona como debería, pero si es verdadero - en lugar de valores, ¡emite ceros! ¿Puede decirme qué está mal? ¿Qué estoy haciendo mal?

Gracias.

 
lVlaxim:

¡Buenas tardes!

  1. Hay una errata en el archivo adjunto, ¡si no me confundo! En la descripción de la función CheckOpenLong en las líneas para calcular las variables sl y tp, los signos deberían estar invertidos.
  2. He cambiado la función CheckOpenLong de la siguiente manera: es decir, sólo debería mostrar los valores de Close, Open y MA para la última y la anterior barra. Así que si el valor de EveryTick es falso, entonces todo funciona como debería, pero si es verdadero - ¡en lugar de los valores se muestran ceros! ¿Puede decirme qué está mal? ¿Qué estoy haciendo mal?

Gracias.

Sobre el punto 1, gracias por encontrar el error. Será arreglado.

Sobre el punto 2, había una pequeña inconsistencia con MQL5, arreglado. Debería aparecer en la próxima compilación.