Tuesday, May 17, 2011

Aprire un solo ordine per candela: funzione isLastOrderCandle

type="html">


A seconda del trading system che si intende sviluppare il metodo di gestione delle uscite da un trade può essere differente:

  • chiusura dell'ordine per raggiungimento di take profit o stop loss; 
  • chiusura dell'ordine in seguito a determinati eventi, ad esempio l'incorcio di due medie mobili o altre condizioni.

Nel secondo caso in particolare si possono verificare dei casi per cui il segnale di ingresso è ancora valido e l'ordine viene quindi chiuso ripetutamente ogni volta che se ne apre uno nuovo.

A seconda della strategia adottata una possibile soluzione può essere quella di non aprire nuovi ordini su di una candela se esiste già un ordine chiuso nella stessa barra.

A questo fine si rivelano molto utili due funzioni di metatrader:

  • OrdersHistoryTotal: restituisce il numero di ordini già chiusi presenti all'interno del tab History di metatrader;
  • iBarShift: restituisce il numero della candela più vicina all'orario che viene passato come parametro (nel nostro caso utilizzeremo la funzione OrderOpenTime dopo aver selezionato l'ordine che ci interessa).

bool isLastOrderCandle(){
//TRUE  è già stato aperto un ordine su questa candela
//FALSE non sono stati aperti ordini su questa candela

   int v_LastOrderHistory = OrdersHistoryTotal() - 1;

   if (OrderSelect(v_LastOrderHistory, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == e_MagicID))
      if (iBarShift(NULL, 0, OrderOpenTime(), true) == 0)
         return(True);
 
   return(False);
}

Come potete osservare il controllo si basa esclusivamente sul fatto che la candela restituita da iBarShift sia la numero 0. Lo zero, in questo caso, significa che sulla barra attualmente in formazione è già stato effettuato un trade.

E' possibile integrare questa funzione all'interno dello start  dell'expert advisor nell'area dedicata ai controlli per l'apertura di un nuovo ordine oppure subito prima di questa in modo da terminare l'esecuzione dello start, di seguito un possibile esempio:

start(){
   ....
   //gestione ordini aperti
   ...
   if (isLastOrderCandle)
      return(0);
   ...
   //apertura nuovi ordini
   ...
}

Ovviamente esistono modi differenti per fare la stessa cosa, voi quale preferite?

No comments:

Post a Comment