Attivare un EA solo “a ‘na certa”: trading sessions!

Vogliamo far funzionare un EA solo in sessioni di trading specifiche come Londra, Niu Yorche, Sidnei, Tochio? Dopo che è saltato fuori questo tema nel nostro gruppetto privato (e gratuito) Telegram, ho deciso di pescare dalla grande sapienza racchiusa nella misteriosa Woollib.mqh, la mia libreria personale che utilizzo in produzione, per elargire a piene mani una funzione “scritta bene” che ti permetterà di prevenire il funzionamento di un EA al di fuori di una certa finestra oraria. Questo è molto utile se per esempio vuoi evitare che l’EA operi a mezzanotte (quando si svegliano gli spiriti del male e gli spread sono imbarazzanti), o all’apertura della borsa di Cinisello Balsamo (noto driver di volatilità sui mercati planetari).

Ah, la figata è che questa funzione sarà utilizzabile sia sulla Meta 4 che sulla 5.

Bene, ciancio alle bande, procediamo subito lo spiegone.

orari di trading

Dichiariamo la funzione

Cominciamo a dichiarare la funzione, che restituirà un valore booleano, e la spalmiamo di argomenti: simbolo e una serie di 4 int che rappresenteranno ora e minuto di inizio della sessione di trading e ora e minuto di fine della sessione di trading.

Per amore di completezza, facciamole ritornare subito false.

bool IsTradingWindow(string _s, int _start_h, int _start_m, int _end_h, int _end_m)
  {
   return false;
  }

Salviamoci il tempo in una struttura dedicata

sessioni di trading?
Struttura dati? WTF?

Ora che abbiamo imbastito il tutto, iniziamo con il dichiarare una variabile strutturata (o una struttura dati) di tipo MqlDateTime.
Questa “scorciatoia” ci permette di convertire qualsiasi variabile di tipo datetime in una struttura dati suddivisa in sotto-variabili, molto comode da utilizzare.

Per la documentazione ufficiale rimando al book. –> MqlDateTime

Poi ci salviamo in una variabile datetime il timestamp di apertura dell’ultima barra M1 attualmente in formazione, attraverso l’helper iTime().

Come puoi vedere, gli passiamo il simbolo (preso dagli argomenti), poi il periodo M1 e lo shift pari a zero, riferendoci così alla candela attuale.

bool IsTradingWindow(string _s, int _start_h, int _start_m, int _end_h, int _end_m)
  {
   MqlDateTime _clock; 
   datetime _now=iTime(_s,PERIOD_M1,0);
    


  
   return false;
  }

Ricostruiamo la datetime di inizio trading

Catfoot Attivare un EA solo "a 'na certa": trading sessions!
Per lei il tempo è irrilevante, per il nostro expert invece è importanci. Molto importanci.

Utilizzeremo un trick molto fico: praticamente dovremo, partendo da degli integer, costruire la stringa che Meta Trader possa convertire in un timestamp corrispondenti alle nostre sessioni di trading.

Sembra complicato ma non lo è:

Il formato delle stringhe di testo convertibili in datetime (quindi in un timestamp) è il seguente:

“ANNO.MESE.GIORNO ORA:MINUTO”
che si traduce in:
“2022.05.15 18:50”

Tutto bello, ma quindi?

Allora, il processo è semplice: dal nostro _clock recuperiamo gli interi del giorno, mese e anno.

Li trasformiamo poi da intero in stringa, e completiamo la composizione floreale con ora e minuti di inizio trading.

La stringa così combinata, sarà poi convertita in una variabile di tipo datetime attraverso la funzione integrata StringToTime().

NOTA BENE: questo è un modo semplice per ottenere il risultato, volendo si potrebbe rendere il tutto ancora più elegante utilizzando StringFormat ed evitare la sequela di IntegerToString, ma non me ne occupo in questa sede. Grazie per la comprensione.

Go!

bool IsTradingWindow(string _s, int _start_h, int _start_m, int _end_h, int _end_m)
  {
   MqlDateTime _clock;
   datetime _now=iTime(_s,PERIOD_M1,0);
   TimeToStruct(_now,_clock);
   datetime _start_T = StringToTime(IntegerToString(_clock.year)+"."+         // "yyyy.mm.dd hh:mi"
                                    IntegerToString(_clock.mon)+"."+
                                    IntegerToString(_clock.day) + " "+
                                    IntegerToString(_start_h)+":"+
                                    IntegerToString(_start_m));



   return false;
  }

Come vedi la StringToTime() prende come argomento una lunga sequenza di dati, che vanno a comporre la data sotto forma di stringa e la converte in un valore confrontabile. con il nostro _now.

Troviamo la datetime di fine trading

Dovresti riuscire a farla ad occhi chiusi.

Ti metto una gif animata che rappresenta la tua self-confidence su questa nuova variabile e il codice da completare. Non è difficile. Vai:

Catfoot Attivare un EA solo "a 'na certa": trading sessions!
La datetime non ha scampo. Colpisci.
bool IsTradingWindow(string _s, int _start_h, int _start_m, int _end_h, int _end_m)
  {
   MqlDateTime _clock;
   datetime _now=iTime(_s,PERIOD_M1,0);
   TimeToStruct(_now,_clock);
   datetime _start_T = StringToTime(IntegerToString(_clock.year)+"."+         // "yyyy.mm.dd hh:mi"
                                    IntegerToString(_clock.mon)+"."+
                                    IntegerToString(_clock.day) + " "+
                                    IntegerToString(_start_h)+":"+
                                    IntegerToString(_start_m));
   datetime _end_T=StringToTime(IntegerToString(...) + (...) );

   return false;
  }

Confrontiamo le date e ritorniamo true o false

Siamo nella bellissima situazione in cui abbiamo tre date in formato datetime.

Il formato datetime è un tipo di unsigned integer, e corrisponde al numero di secondi passati dal primo gennaio 1970. Un po’ tipo avanti Cristo e Dopo Cristo, per i programmatori.

Essendo un intero, altro non faremo se non un banale, banalissimo, anzi:

BANANISSIMO

confronto maggioreminoreugualo.

Catfoot Attivare un EA solo "a 'na certa": trading sessions!
bool IsTradingWindow(string _s, int _start_h, int _start_m, int _end_h, int _end_m)
  {
   MqlDateTime _clock;
   datetime _now=iTime(_s,PERIOD_M1,0);
   TimeToStruct(_now,_clock);
///---

///--- CODICE PRECEDENTE 

///---
   if(_now >= _start_T && _now<= _end_T)
      return true;
   return false;
  }

Quindi se il timestamp di _now è maggiore o uguale del timestamp di _start_T e contemporaneamente minore o uguale del timestamp di _end_T, ALLORA ritorniamo VEROH!

Altrimenti ritorniamo il nostro FALZO di default.

Come si usa la funzione “sessioni di trading”forgiata?

Orbene, nella OnTick o nella IsNewBar del caso, dovrai inserire un semplicissimo if che, se falZo, ti farà uscire dalla OnTick stessa con un simpatico return.

void Ontick(){

  if(!IsTradingWindow(_Symbol,START_H,START_M,END_H,END_M))
      {
           // altre logiche, per cui volendo chiusura dei trade, spostamento a BE dei trade in profit, 
           // Invio di messaggi mail con recap giornata, ecc ecc ecc. 
            return;
       } 

   // Altro codice, segnali, ingressi, position management. Tutto andrebbe DOPO aver controllato se siamo in sessione di traiding.
}

Naturalmente qui vedi la funzione richiamata con le variabili START_H, START_M, END_H ed END_M, che corrispondono a ora e minuti di inizio, ora e minuti di fine, non serviva Shroedinger per capirlo ma ho preferito precisarlo.

Amo mettere queste variabili come variabili di INPUT, quindi possibile lanciare ottimizzazioni sulle ore di attività dell’expert.

Ma lascio alla tua fantasia le considerazioni del caso e la possibilità di espandere la funzione per gli usi che tu riterrai più utili al tuo successo.

Conclusioni

Prova ad implementare un filtro orario come quello che hai appena imparato per limitare gli ingressi solo tra le 8:30 e le 15:00, per esempio. Prova ad utilizzare un EA semplice come uno ispirato alle freccette: https://www.automazionetrading.com/strategie-forex-intraday-e-freccette-3/

As usual, non ti chiedo soldi ma opere di bene per far conoscere questo magnifico spazio in cui impari un botto di roba AGGRATIS, se ti va (e vedi di fartelo andare), puoi sganciare un like alla pagina Facebook Automazione Trading, seguire il canale YouTube e raggiungere il gruppo gratuito Telegram.

Alla prossima prog!
C YA!

Leave a Reply