Discussione sull’articolo "Il Wizard MQL5: Come creare un modulo di segnali di trading" - pagina 6
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Oppure un modulo di gestione del denaro. Quale scegliere, è necessario esaminarlo in modo più approfondito.
Il concetto non è molto chiaro. Esistono segnali per l'apertura di posizioni, ma anche per la loro chiusura. Sarebbe possibile utilizzare il voto e così via, e tutto questo in aggiunta al trailing.
E quanto spesso cambiano le classi base? Se ho scritto il mio modulo di segnali con la versione precedente della procedura guidata, dovrei riprogettarlo ora.
Mi chiedo solo se qualcuno utilizza seriamente questa procedura guidata e le classi base degli Expert Advisor o se è solo per i pigri che non vogliono fare nulla da soli.
Oppure un modulo di gestione del denaro. Cosa scegliere esattamente, è necessario esaminare la questione in modo più dettagliato.
Mi dispiace, non sono bravo in OOP, potete aiutarmi a capirlo?
Ho creato un modulo di segnali di trading chiamato СMySignal.mqh. Ora voglio implementare i miei segnali di chiusura. Per questo creo il mio modulo di gestione del capitale CMyMoney.mqh perché CExpert ha una chiamata di questo tipo:
protected:
CExpertMoney *m_money;
bool CExpert::CheckClose(void)
{double lot;
//--- position must be selected before call
if((lot=m_money.CheckClose(GetPointer(m_position)))!=0.0)
return(CloseAll(lot));
Ma voglio utilizzare i metodi della classe CMySignal nella logica di chiusura, non voglio rifare tutti i calcoli in CMyMoney. Quindi in CMyMoney scrivo qualcosa di simile:
class CMyMoney : public CExpertMoney
protected:
//--- input parametersvirtual bool CheckCloseLong(void);
virtual bool CheckCloseShort(void);
CMySignal *filter0;
...
double CMyMoney::CheckClose(CPositionInfo *position)
{
double lot;
lot=position.Volume();
if(position.PositionType()==POSITION_TYPE_BUY)
{
//--- check the possibility of closing the long position
if(filter0.CheckCloseLong(lot))
Print(__FUNCTION__+": close long position signal detected. Lot to be closed ",lot);
}
else
{
//--- check the possibility of closing the short position
if(filter0.CheckCloseShort(lot))
Print(__FUNCTION__+": close short position signal detected. Lot to be closed ",lot);
}
return(lot);
}
E sposto tutta la logica di chiusura nella classe CMySignal:
class CMySignal : public CExpertSignal
public:
virtual bool CheckCloseLong(double &lot);
virtual bool CheckCloseShort(double &lot);
bool CMySignal::CheckCloseLong(double &lot)
{
//логика закрытия Long
}
bool CMySignal::CheckCloseShort(double &lot)
{
//логика закрытия Short
}
Ma si scopre che ho già a che fare con un nuovo oggetto filter0 e non con uno già creato. Devo quindi reinizializzare i dati (indicatori e così via). Come posso accedere all'oggetto già esistente della classe CMySignal? Spero di essere stato chiaro =)
Tutto questo dovrebbe funzionare attraverso la procedura guidata in modo standard, quindi non devo cambiare nessuna classe base. Tutte le modifiche sono possibili solo nei miei segnali di trading e nei moduli di gestione del denaro.
Mi dispiace, non sono bravo in OOP, potete aiutarmi a capirlo?
Ho creato un modulo di segnali di trading chiamato СMySignal.mqh. Ora voglio implementare i miei segnali di chiusura. Per questo creo il mio modulo di gestione del capitale CMyMoney.mqh perché CExpert ha una chiamata di questo tipo:
protected:
CExpertMoney *m_money;
bool CExpert::CheckClose(void)
{double lot;
//--- position must be selected before call
if((lot=m_money.CheckClose(GetPointer(m_position)))!=0.0)
return(CloseAll(lot));
Ma voglio utilizzare i metodi della classe CMySignal nella logica di chiusura, non voglio rifare tutti i calcoli in CMyMoney. Quindi in CMyMoney scrivo qualcosa di simile:
class CMyMoney : public CExpertMoney
protected:
//--- input parametersvirtual bool CheckCloseLong(void);
virtual bool CheckCloseShort(void);
CMySignal *filter0;
...
double CMyMoney::CheckClose(CPositionInfo *position)
{
double lot;
lot=position.Volume();
if(position.PositionType()==POSITION_TYPE_BUY)
{
//--- check the possibility of closing the long position
if(filter0.CheckCloseLong(lot))
Print(__FUNCTION__+": close long position signal detected. Lot to be closed ",lot);
}
else
{
//--- check the possibility of closing the short position
if(filter0.CheckCloseShort(lot))
Print(__FUNCTION__+": close short position signal detected. Lot to be closed ",lot);
}
return(lot);
}
E sposto tutta la logica di chiusura nella classe CMySignal:
class CMySignal : public CExpertSignal
public:
virtual bool CheckCloseLong(double &lot);
virtual bool CheckCloseShort(double &lot);
bool CMySignal::CheckCloseLong(double &lot)
{
//логика закрытия Long
}
bool CMySignal::CheckCloseShort(double &lot)
{
//логика закрытия Short
}
Ma si scopre che ho già a che fare con un nuovo oggetto filter0 e non con uno già creato. Devo quindi reinizializzare i dati (indicatori e così via). Come posso accedere all'oggetto già esistente della classe CMySignal? Spero di essere stato chiaro =)
Tutto questo dovrebbe funzionare attraverso la procedura guidata in modo standard, quindi non devo cambiare nessuna classe base. Tutte le modifiche sono possibili solo nei miei segnali di trading e nei moduli di gestione del denaro.
Ho una domanda sul secondo "foglio": perché si inserisce"CMySignal *filter0;" nel modulo di gestione del denaro?
filter0 è un oggetto di classe del mio modulo di segnali di trading CMySignal. Viene creato nel file principale dell'Expert Advisor:
CMySignal *filter0=new CMySignal;
filter0 è una classe oggetto del mio modulo di segnali di trading CMySignal. Viene creato nel file principale dell'EA:
CMySignal *filter0=new CMySignal;
Guardate l'implementazione del trasferimento del puntatore al segnale principale al modulo segnali(MQL5 Wizard: Come insegnare a un Expert Advisor ad aprire ordini pendenti a qualsiasi prezzo):
Secondo il nostro schema di implementazione dell'idea, è necessario dichiarare una variabile interna in cui verrà memorizzato il puntatore al segnale principale.
Poiché questa variabile deve essere interna (con ambito solo all'interno della classe del generatore di segnali di trading), la aggiungeremo al prossimo blocco di codice:
Notate anche che ho rimosso le variabili che non verranno utilizzate nel codice.
Dichiareremo il metodo che verrà utilizzato per memorizzare il puntatore al segnale principale in un altro blocco di codice - "metodo di impostazione del puntatore al segnale principale". Sono stati rimossi anche alcuni metodi non necessari.
Forse questo è ciò di cui avete bisogno. Solo il puntatore al segnale principale verrà passato al modulo di gestione del capitale.
Guardate l'implementazione del passaggio del puntatore al segnale principale al modulo del segnale(MQL5 Wizard: Come insegnare all'Expert Advisor ad aprire ordini pendenti a qualsiasi prezzo):
Forse questo è ciò di cui avete bisogno. Solo il puntatore al segnale principale verrà passato al modulo di gestione del denaro.
Perché ho bisogno di un puntatore al segnale head se voglio un puntatore al mio segnale, un discendente della classe CExpertSignal? Lo voglio nel mio modulo di gestione del denaro, che è un erede di CExpertMoney.
Ok. Passiamo all'altro lato. Nel vostro modulo di gestione del denaro, dovete dichiarare una variabile come questa:
CMySignal *m_signal; // memorizzare un riferimento al segnalee un metodo come questo:
e la sua implementazione
Ora si può provare ad accedere al proprio segnale dal modulo di gestione del denaro tramite
Va bene. Passiamo all'altro lato. Nel modulo di gestione del denaro, è necessario dichiarare una variabile come questa:
e questo metodo:
e la sua implementazione
Ora posso provare ad accedere al mio segnale dal modulo di gestione del denaro via
InitSignal deve essere chiamato da qualche parte prima?
Accesso non valido al puntatore quando si chiama un metodo del mio modulo segnali
InitSignal deve essere chiamato da qualche parte prima?
Ovviamente dobbiamo chiamare "InitSignal" prima: da OnInit() dell'EA, alla fine del blocco di inizializzazione del modulo di gestione del denaro.