venerdì 12 novembre 2010

Individuare una nuova candela in metatrader: funzione isNewCandle()

Chi programma in mql conosce sicuramente la convenzione per cui la candela attualmente in costruzione è la candela numero 0, la penultima è la candela numero 1, la terzultima la numero 2 e così via.

Se da un lato questo riferimento ci semplifica la vita, dall'altro ci complica un pò le cose. Come possiamo capire quando una nuova barra si è formata? Con il codice ci riferiamo alla candela numero 0 e siamo quindi sempre posizionati sulla barra attualmente in formazione che cambia ogni tot tempo a seconda del timeframe selezionato.

Può sorgere quindi la necessità di individuare una candela non tramite id, ma tramite l'orario di apertura. A questo proposito possiamo sfruttare la funzione built-in di metatrader iBarShift() che ci restituisce l'id della candela in base all'orario passato come parametro.

La funzione isNewCandle(), che riporto in seguito, ha lo scopo di informarci se la candela attualmente in formazione è sempre la stessa rispetto alla quotazione precedente oppure se si è formata una nuova candela nel grafico:

//variabile globale
static datetime g_lastCandleOpenTime;
...
...
int init(){
   g_lastCandleOpenTime = Time[0];
   ...
}
...
...
int start(){
   if (isNewCandle())
   ...
}
...
...
bool isNewCandle(){
//TRUE nuova candela
//FALSE vecchia candela

   bool v_isNewCandle = false;
   //se la candela restituita è la 0 è quella già memorizzata
   int v_shift = iBarShift(NULL, 0, g_lastCandleOpenTime, true);
 
   if (v_shift == 0)
      v_isNewCandle = false;
   else{
      v_isNewCandle = true;
      //memorizzo l'orario della nuova candela
      g_lastCandleOpenTime = Time[0];
   }
 
   return (v_isNewCandle);
}

La funzione è molto semplice, in base al valore restituito da iBarShift capisce se si è formata o meno una nuova candela. In caso positivo, v_shift assume il valore 1, a questo punto è necessario memorizzare nella variabile globale v_isNewCandle il nuovo orario di apertura per i controlli successivi.
 

6 commenti:

Ale L ha detto...

Ciao Carlo! Eccomi di nuovo qui :-)

Sto cercando il modo di individuare il numero di candele a partire dalla candela di apertura di un ordine. La logica dovrebbe essere questa:

Se il num di candele dall'apertura dell'ordine è maggiore di x chiudi la posizione (x esempio).

Non ho proprio idea di come partire, magari esiste già un "contatore" come funzione presente in metatrader?

carlo10 ha detto...

Avevo sviluppato una logica simile in questo ea anche se in realtà mi serviva per vedere se si era formata una nuova candela:

http://forex.altervista.org/metatrader/expert-advisor/Alternate_Buy_and_Sell_EA/Alternate_Buy_and_Sell_EA.mq4

In soldoni quello che ti serve è:
1) recuperare dall'ordine che hai aperto l'OrderOpenTime()
2) recuperare quante candele fa è stato aperto l'ordine

Per il primo punto devi quindi ciclare gli ordini aperti (immagino tu ne abbia uno vista la logica) e una volta selezionato salvarti l'OrderOpenTime().

Il secondo punto è più facile del previsto perchè puoi utilizzare la funzione iBarShift(...). In base al momento in cui hai aperto l'ordine ti restituirà il numero di candela in cui è stato aperto:

iBarShift(NULL, 0, OrderOpenTime(), true);

Ovviamente la convenzione è sempre la stessa, la candela attualmente in formazione è la numero zero, la penultima è la 1 e così via.

Approfitto di questo messaggio per avvisarti che sarò in ferie per un paio di settimane e ricomincerò a rispondere nel blog solo al mio rientro.

Ciao!

Ale L ha detto...

Ok Carlo allora ti augiro buone ferie!!! Intanto io cerco di mettere giù la logica così al tuo rientro ne discutiamo!

Ancora mille grazie

Antonello ha detto...
Questo commento è stato eliminato dall'autore.
Antonello ha detto...

buongiorno e se vorrei solo chiudere una posizione alla fine della candela?

cristian mzzi ha detto...

buonasera come posso fare ha NON fare chiudere la posizione aperta anche se ci sono tutte le condizioni per la chiusura se bla candela di apertura di posizione corrisponde alla candela 0??? grazie

Posta un commento