Discussione sull’articolo "Il Wizard MQL5: Come creare un modulo di segnali di trading"

 

Il nuovo articolo Il Wizard MQL5: Come creare un modulo di segnali di trading è stato pubblicato:

L'articolo parla di come scrivere la propria classe di segnali di trading con l'implementazione dei segnali sull'incrocio del prezzo e della media mobile e come includerla nel generatore di strategie di trading del Wizard MQL5, oltre a descriverne la struttura e il formato della descrizione della classe generata per la procedura guidata MQL5.

L'Expert Advisor creato con il Wizard MQL5 si basa su quattro pilastri, ovvero quattro classi base:

Figura 1. La struttura della classe base CExpert

Autore: MetaQuotes

MetaQuotes
  • 2021.12.10
  • www.mql5.com
Profilo del trader
 
Signori compagni! Ho letto l'articolo! Ho fatto tutto quello che c'è scritto, e credo che ora arriverò in paradiso. Ma no - Master MKL 5 non ha visto il mio file con i segnali. Ho ricontrollato tutto, ho rifatto tutto, ho ricontrollato, ma il segnale non è visibile nella procedura guidata di creazione degli Expert Advisor. Allego il mio file, che ho creato seguendo le raccomandazioni dell'articolo. Aiutatemi a capire cosa ho sbagliato o, al contrario, l'autore dell'articolo non ha aggiunto qualcosa di importante, a causa del quale il tutto non si integra in alcun modo. In breve, aiutatemi in qualsiasi modo.
File:
 
Tincup:
Signori compagni! Ho letto l'articolo! Ho fatto tutto quello che c'è scritto, e credo che ora arriverò in paradiso. Ma no - Master MKL 5 non ha visto il mio file con i segnali. Ho ricontrollato tutto, ho rifatto tutto, ho ricontrollato, ma il segnale non è visibile nella procedura guidata di creazione degli Expert Advisor. Allego il mio file, che ho creato seguendo le raccomandazioni dell'articolo. Aiutatemi a capire cosa ho sbagliato o, al contrario, l'autore dell'articolo non ha aggiunto qualcosa di importante, a causa del quale il tutto non si integra in alcun modo. In breve, aiutatemi in tutti i modi possibili.


Ildescrittore della classe è una parte importante del testo di partenza.

Ci sono due errori evidenti nel descrittore. Uno di questi impedisce di rilevare il segnale perché viene specificato un ENUM inesistente. Il secondo causerà problemi in fase di compilazione (nome del parametro errato).

Un'altra sottigliezza. Ci dovrebbe essere solo uno spazio prima della parola chiave, in ogni riga del descrittore. (Penso che questa restrizione sarà rimossa in futuro, ma per ora è così).

// 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


Più avanti nel testo.

Non avere un costruttore è un male. Si dovrebbero inizializzare i dati dei membri con valori predefiniti. Dopo tutto, nel caso generale, il metodo di impostazione di un parametro potrebbe non essere chiamato.

Infine, i metodi sono descritti in modo errato

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

deve

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

 

Grazie mille per la risposta, naturalmente. Ho sistemato tutto e ha funzionato.

Ma durante la compilazione dell'Expert Advisor stesso, mi ha dato un errore, che non avrei trovato da solo se il compilatore l'avesse trovato. Tra l'altro, mentre mi rispondevi, devi averlo corretto senza accorgertene, ma è presente nel testo originale dell'articolo.

Nell'articolo.

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

in risposta alla mia richiesta di aiuto

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

in assenza di MA nel file del segnale, quando si compila l'Expert Advisor stesso dopo la sua generazione con successo, genera il seguente errore

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

Nel mio caso, almeno alla riga 77 si vede

signal.Limit(Inp_Signal_Sample_Limit);

inserire la MA dopo la parola Limite

L'errore nel testo dell'Expert Advisor scompare.

Se mi sbaglio, mi scuso. Non sono un professionista.

 
Di conseguenza, la descrizione non deve essere Limit, ma LimitMA.
 

E un'altra cosa: questo errore si presenta in qualsiasi modo:

'--' - l-valore richiesto 1234.mq5 31 57

'--' - l-value required 1234.mq5 31 59
'--' - l-value required 1234.mq5 31 61
'--' - l-valore richiesto 1234.mq5 31 63
'--' - l-valore richiesto 1234.mq5 31 65
'--' - l-valore richiesto 1234.mq5 31 67
'--' - l-valore richiesto 1234.mq5 31 69
'--' - l-valore richiesto 1234.mq5 31 71
'--' - l-valore richiesto 1234.mq5 31 73
'--' - l-valore richiesto 1234.mq5 31 75
'--' - l-valore richiesto 1234.mq5 31 77
'--' - l-valore richiesto 1234.mq5 31 79
'--' - l-valore richiesto 1234.mq5 31 81
'--' - l-valore richiesto 1234.mq5 31 83
'--' - l-valore richiesto 1234.mq5 31 85
'--' - l-valore richiesto 1234.mq5 31 87
'--' - l-valore richiesto 1234.mq5 31 89
'--' - l-valore richiesto 1234.mq5 31 91
'--' - l-valore richiesto 1234.mq5 31 93
'--' - l-valore richiesto 1234.mq5 31 95
'--' - l-valore richiesto 1234.mq5 31 97
'--' - l-valore richiesto 1234.mq5 31 99
'--' - l-valore richiesto 1234.mq5 31 101
'--' - l-valore richiesto 1234.mq5 31 103
'--' - l-valore richiesto 1234.mq5 31 105
'--' - l-valore richiesto 1234.mq5 31 107
'--' - l-valore richiesto 1234.mq5 31 109
'--' - l-valore richiesto 1234.mq5 31 111
'--' - l-valore richiesto 1234.mq5 31 113
'--' - l-valore richiesto 1234.mq5 31 115
'-' - operando atteso 1234.mq5 31 117
'Inp_Signal_Sample_Expiration' - identificatore non dichiarato 1234.mq5 77 22
32 errori, 0 avvisi 33 1

Andate alla riga 31 dell'EA per vedere quanto segue

input double Inp_Signal_Sample_StopLoss =50.0;
input double Inp_Signal_Sample_TakeProfit=50.0;
input int Inp_Signal_Sample_Expiration=10-------------------------------------------------------------;
//--- input per il denaro
input double Inp_Money_FixLot_Percent =10.0;

input double Inp_Money_FixLot_Lots =0.1;

Rimuovendo la coda sotto forma di linea tratteggiata che parte da 10, tutti gli errori scompaiono.

L'Expert Advisor è pronto per lavorare e ottimizzare.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 
Tincup:
Sì, e di conseguenza la descrizione non dovrebbe essere Limit, ma anche LimitMA.

Sì, LimitMA, l'ho cercato.

In generale, per il futuro... Quando si crea un descrittore di classe, utilizzare più attivamente il copia-incolla, perché il compilatore non controlla i commenti (che costituiscono il descrittore) e la coincidenza dei nomi dei metodi e dei parametri del descrittore è importante. Questo "viene fuori" solo durante la compilazione dell'Expert Advisor e provoca emozioni negative. Anche se, come si può vedere, non si tratta di nulla di fatale.

 
Tincup:

E un'altra cosa: questo errore si presenta in qualsiasi modo:

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

Questo errore si verifica a causa della lunghezza della stringa del descrittore di classe. Dopo le vacanze, lo risolveremo.
Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Ottimo materiale... ben scritto e sicuramente un'apertura degli occhi.
 

Buon pomeriggio!

  1. C'è un refuso nel file allegato, se non mi sono confuso! Nella descrizione della funzione CheckOpenLong, nelle righe per il calcolo delle variabili sl e tp, i segni dovrebbero essere invertiti.
  2. Ho modificato la funzione CheckOpenLong come segue:
    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);
       
      }
    cioè dovrebbe semplicemente produrre i valori di Close, Open e MA per l'ultima barra e per quella precedente. Quindi, se il valore di EveryTick è falso, tutto funziona come dovrebbe, ma se è vero, invece dei valori, vengono visualizzati degli zeri! Potete dirmi cosa c'è di sbagliato? Cosa sto facendo di sbagliato?

Grazie!

 
lVlaxim:

Buon pomeriggio!

  1. C'è un refuso nel file allegato, se non mi sono confuso! Nella descrizione della funzione CheckOpenLong, nelle righe per il calcolo delle variabili sl e tp, i segni dovrebbero essere invertiti.
  2. Ho modificato la funzione CheckOpenLong nel modo seguente: dovrebbe cioè produrre solo i valori di Close, Open e MA per l'ultima barra e per quella precedente. Quindi, se il valore di EveryTick è falso, tutto funziona come dovrebbe, ma se è vero, al posto dei valori vengono visualizzati degli zeri! Potete dirmi cosa c'è di sbagliato? Cosa sto facendo di sbagliato?

Grazie!

Per quanto riguarda il punto 1, grazie per aver trovato l'errore. Sarà corretto.

Sul punto 2, c'era una piccola incongruenza con MQL5, risolta. Dovrebbe comparire nella prossima build.