Come costruire un Expert Advisor basato sulla chiusura delle candele

Quando vuoi creare un Expert Advisor, una delle scelte che devi fare riguarda il momento preciso in cui il software si “attiva” e va a monitorare se sul mercato si verificano le condizioni che fanno funzionare la tua strategia.

Tipicamente hai 2 opzioni tra cui scegliere:

  • Monitoraggio “tick by tick” 
    oppure
  • Monitoraggio a “Chiusura Candela”

Grazie al linguaggio MQL possiamo programmare entrambe queste tipologie di monitoraggio, ma in questo post voglio dirti quello che ritengo essere in assoluto il tipo di monitoraggio migliore, più affidabile e come io personalmente lo uso.

La piattaforma Metatrader permette di costruire, con estrema facilità sistemi di Trading Automatico in grado di analizzare ogni singola quotazione ricevuta dal broker.

In gergo questa modalità viene chiamata “Tick by Tick” perchè viene eseguita una determinata azione ogni qualvolta la nostra piattaforma di Trading acquisisce una nuova quotazione (tick).

Con il termine “azione” voglio comprendere tutto quello che riguarda l’operatività inerente al Trading quindi, per citarne alcune: apertura ordini, chiusura ordini, acquisizione di dati dagli indicatori, acquisizione di dati da timeframe diversi da quello attuale, modifiche ai livelli di Stop Loss o Take Profit, gestione del Trailing Stop, ecc …

Possiamo tuttavia progettare il nostro sistema in modo tale che non venga necessariamente eseguita un’azione ad ogni nuovo tick.

Ad esempio possiamo impostarlo in modo tale che venga eseguita un’azione solo in presenza di determinate condizioni, trascurando quindi tutte le quotazioni in cui non si verificano condizioni prestabilite.

Riprendendo il tema di questo post, qual è il momento migliore per effettuare il monitoraggio ed eseguire le azioni suggerite dalla strategia di Trading?

Uno dei momenti migliori per identificare dei segnali è, a mio avviso, la chiusura delle candele.

Ecco alcuni dei motivi per cui è preferibile adottare questo modello operativo :

  • semplificazione della strategia
  • minore rischio di errori di esecuzione
  • maggiore velocità di elaborazione
  • riduzione dei tempi di backtest e ottimizzazione
  • maggiore probabilità di segnali più affidabili

Allora come faccio ad identificare il preciso istante in cui una candela si chiude?

Grazie al linguaggio MQL posso codificare una funzione che gestisca tale evento.

Esistono vari modi per raggiungere l’obiettivo.

Alcuni si basano sul conteggio delle candele sul grafico oppure sul numero di Volumi di trading, ma ritengo questi metodi inaffidabili perchè in alcune situazioni potrebbero causare errori.

Ora ti spiegherò il metodo che utilizzo di solito.

Il linguaggio MQL ci da la possibilità di “fare qualcosa” quando Metatrader riceve ciascuna nuova quotazione (tick) dal broker.

Quando arriva una qualsiasi quotazione, potrei quindi verificare se questa corrisponde al tick di apertura di una nuova candela.

Infatti se individuo in qualche modo il primissimo tick di una nuova candela avrò la certezza matematica che la candela precedente è chiusa.

Individuare questo evento è molto semplice.

Io utilizzo un’istruzione condizionale che funziona in questo modo:

se il tick appena ricevuto corrisponde al primo tick di una nuova candela, dammi come risultato true, altrimenti dammi come risultato false.

MQL dispone dell’istruzione Time[ ] che sarà utilissima per identificare il primo tick di una candela.

L’istruzione Time[ ] permette infatti di leggere l’orario esatto dell’istante di apertura di ogni candela.

Attraverso l’indice SHIFT è possibile stabilire con precisione di quale candela voglio conoscere l’istante di apertura.

Se non sai cos’è lo SHIFT, ti invito a leggere questo post pubblicato qualche giorno fa.

Così se, ad esempio, volessi leggere l’orario di apertura della candela che precede quella attuale, dovrei scrivere datetime OraAperturaCandelaPrecedente = Time[1].

Oltre al fatto che l’istante in cui viene ricevuto il primo tick di una nuova candela sancisce in modo inequivocabile la chiusura della candela precedente, la furbata di tutto questo sta nel fatto che l’istante di apertura di ogni candela letto con l’istruzione Time[ ] non è un dato che successivamente potrà variare.

Se ci pensi, è un dato univoco per ciascuna candela ed appartiene alla serie storica, infatti sarebbe assurdo se una candela avesse più di un’istante di aperura, non credi?

Riassumendo, per intercettare l’evento di apertura di una nuova candela, dovrò combinare in modo intelligente l’istruzione Time[ ] con un’istruzione condizionale.

Qui di seguito ho schematizzato la logica della funzione che voglio creare.

Expert Advisor schema chiusura candela

Definisco, quindi, uno spazio di memoria dove memorizzare il tempo o orario dell’apertura dell’ultima candela (TempoUltimaCandela).

Definisco anche uno spazio di memoria dove memorizzare il tempo o orario dell’apertura della candela attualmente in formazione (TempoCandelaAttuale).

Alla ricezione di ogni nuova quotazione del broker l’Expert Advisor (EA) controlla i suddetti tempi.

  • Se sono uguali significa che la candela in formazione è anche l’ultima candela di cui si conosce il tempo di apertura.
  • Viceversa se sono diversi significa che è stata appena aperta una nuova candela.

A quel punto l’EA intercetta l’evento e memorizza nello spazio di memoria TempoUltimaCandela il valore di TempoCandelaAttuale allo scopo di essere in grado di individuare l’istante in cui sarà aperta la candela successiva.

Traduciamo quindi la logica appena descritta in una funzione utilizzando MQL.

Esempio di programma MQL4

bool NuovaCandela(){

static datetime TempoUltimaCandela;

datetime TempoCandelaAttuale = Time[0];

if (TempoCandelaAttuale != TempoUltimaCandela){

TempoUltimaCandela = TempoCandelaAttuale;

return (true);

}else{

return (false);

}

}

Puoi notare la dichiarazione iniziale bool .

E’ tale perchè la funzione restituisce un dato di tipo booleano quindi vero oppure falso.

Otterrò vero (true) nell’istante in cui la Metatrader riceve il primo tick di ogni candela, otterrò falso (false) alla ricezione di qualsiasi altro tick.

Puoi notare anche che la variabile TempoUltimaCandela è dichiarata come static.

Significa che la variabile è di tipo retintivo ovvero mantiene in memoria il suo valore precedente, fino a quando non subentra un nuovo valore.

Questa funzione potrà esserti utile nei tuoi EA quando avrai bisogno di identificare dei segnali o leggere dei dati solamente alla ricezione del tick di apertura di ogni nuova candela, evitando che l’EA compia elaborazioni inutili ad ogni altro tick ricevuto.

L’evento legato al tick di apertura di una candela può, ad esempio, essere utile per andare a leggere i valori caratteristici della candela appena chiusa, e questa cosa è particolarmente utile quando la strategia del EA si basa sui prezzi di chiusura delle candele o su valori di indicatori.

Se l’EA fosse programmato per leggere ad ogni tick il valore di una media mobile relativo alla candela precedente, potrebbe reiterare l’acquisizione di segnali di trading o eseguire calcoli inutilmente, rallentando l’esecuzione dell’EA e nel peggiore dei casi generando errori di Trading.

Ti invito quindi a guardare questo breve video.

Ti dimostrerò come anche tu puoi creare un semplice EA per eseguire un test della funzione appena codificata.

[iframe]<center><iframe width=”560″ height=”315″ src=”https://www.youtube-nocookie.com/embed/s5bEppIB3N0?rel=0&amp;showinfo=0″ frameborder=”0″ allowfullscreen></iframe></center>[/iframe]

Potrai poi scaricare direttamente da questo link il file sorgente relativo all’esempio del video.

Prova a creare questo semplice EA sulla tua piattaforma!

Se vuoi chiederci aiuto o qualsiasi informazione, scrivici nei commenti!

Grazie per l’attenzione, al prossimo articolo!

Riccardo Fornasiero
Responsabile Trading Automatico per Sapienza Finanziaria

Riccardo Fornasiero

ITForum Online Week 2020

Impara le basi del Trading Professionale con il videocorso gratuito Trader Week

Trading Automatico? Imparalo con il videocorso gratuito AutoTrading Challenge

Menu