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:
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):
- Modificare le variabili esterne a runtime in modo da forzare sempre il giorno corrente.
- 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);
}
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