¡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
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 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.

- www.mql5.com
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.
Y una cosa más: este error aparece pase lo que pase:
'--' - l-value required 1234.mq5 31 57

- www.mql5.com
¡Buenas tardes!
- 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.
- 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.
¡Buenas tardes!
- 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.
- 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.

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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.
Autor: MetaQuotes Software Corp.