sabato 6 novembre 2010

Confrontare le ore in MQL: funzione isTradingTime()

Quando si sviluppa un expert advisor per il forex trading può capitare di avere l'esigenza di aprire ordini solo in determinati momenti della giornata, o nel mio caso, in un intervallo di tempo compreso tra due orari definiti dall'esterno.

Questa richiesta non è complessa da gestire ma se pensate di cavarvela con un semplice confronto tra date in mql probabilmente andrete incontro a qualche grattacapo, nel metaeditor troviamo infatti il seguente esempio:

D'12:30:27' //equal to D'[compilation date] 12:30:27'

A questo punto provo quindi ad inizializzare due variabili esterne di tipo datetime in modo da impostare l'intervallo di orari in cui aprire le mie posizioni:

extern datetime  start_time   =D'09:30';
extern datetime  end_time     =D'11:00';

Applicando questo expert advisor al grafico ci accorgiamo subito del problema anticipato dall'help del metaeditor, nelle due variabili viene memorizzato esplicitamente anche il giorno di compilazione del nostro sorgente:

mql: variabili datetime


Non possiamo quindi effettuare un confronto tra date per verificare se l'orario si trova nell'intervallo di tempo che abbiamo stabilito, in questo caso verrebbe infatti confrontato anche il giorno e non solo l'orario.

Mi vengono in mente 2 possibilità (entrambe poco eleganti):

  1. Modificare le variabili esterne a runtime in modo da forzare sempre il giorno corrente.
  2. Utilizzare 2 numeri interi per salvare ore e minuti ed effettuare i controlli nel codice sfruttando le funzioni Hour()  e Minute() di metatrader.
Alla fine ho deciso di implementare la seconda opzione e l'ho realizzata creando la funzione isTradingTime():

extern int e_start_hour = 9;
extern int e_start_minute = 30;
extern int e_end_hour = 11;
extern int e_end_minute = 0;
...
...
...
bool isTradingTime(){
//TRUE trading consentito
//FALSE trading non consentito

bool v_tradingTime = false;

//Controllo validità dati in ingresso
if (e_start_hour < 0 || e_start_hour > 23){
Print("e_start_hour deve essere compreso tra 0 e 23");
return(false);
}
if (e_end_hour < 0 || e_end_hour > 23){
Print("e_end_hour deve essere compreso tra 0 e 23");
return(false);
}
if (e_start_minute < 0 || e_start_minute > 59){
Print("e_start_minute deve essere compreso tra 0 e 59");
return(false);
}
if (e_end_minute < 0 || e_end_minute > 59){
Print("e_end_minute deve essere compreso tra 0 e 59");
return(false);
}

//verifica se l'orario attuale è compresto nella finestra
if (Hour() >= e_start_hour && Hour() <= e_end_hour)
 v_tradingTime = true;
  else return(false);

 if (Hour() == e_start_hour)
 if (Minute() >= e_start_minute)
v_tradingTime = true;
else return(false);

if (Hour() == e_end_hour)
if (Minute() <= e_end_minute)
 v_tradingTime = true;
 else return(false);

 return (v_tradingTime);
}



Voi come avete risolto questo problema? Avete trovato delle valide alternative?
 

0 commenti:

Posta un commento