Come creare un expert advisor basato sulle medie mobili

Marco FoxTrade

02/07/2011

Come creare un expert advisor basato sulle medie mobili

Le medie mobili sono uno strumento che si presta ad essere utilizzato in molte strategie di trading.
In questo articolo vedrai un esempio come creare un semplicissimo expert advisor basato proprio su questo semplice indicatore.

Strategia:
Impostiamo una simple moving average a N periodi. Entreremo in Long quando i prezzi sfondano la media dal basso verso l’ alto
ed entreremo invece in Short quando i prezzi sfondano la media dall’ alto verso il basso.
Per evitare troppi falsi segnali ci baseremo sulla chiusura delle candele: la posizione verrà effettivamente aperta solo
quando la chiusura dell’ ultima candela sarà posta dall’ altra sponda della media.

Apriamo il nostro Editor Mql dal menu Strumenti/Scrittore Linguaggio Metaquotes.
La prima cosa da fare è rendere impostabile dall’ esterno il periodo della media mobile, in modo da dare al nostro
Expert Advisor un minimo di flessibilità. A questo scopo ci posizioniamo sotto queste due righe

#property copyright "Marco FoxTrade"
#property link ""

e dichiariamo la variabile periodo, che sarà editabile direttamente al lancio dell’ EA.

extern int periodo_media=100;
extern double lotto=0.1;

La variabile lotto ci dar‡ la possibilit‡ di scegliere il lotto dei trade che verranno aperti.
Un consiglio che mi sento di darti Ë di lasciare uno spazio «a capo» dopo i due #property e le due righe di codice appena scritte.
Questo piccolo accorgimento ti permette di separare due porzioni di codice che non hanno nulla a che fare tra di loro,
migliorando cosÏ la leggibilit‡ del codice stesso.

Il passo successivo Ë rendere l’ EA capace di capire dove si trova il prezzo rispetto
alla media mobile, in modo che possa aprire le posizioni in modo corretto. A questo scopo andiamo due volte a capo e
dichiariamo una variabile globale che terr‡ in memoria lo «stato» del prezzo

int posizione_prezzo;
int barre_totali;

la variabile barre_totali verr‡ spiegata in seguito.
Successivamente ci posizioniamo all’ interno della funzione init() e scriviamo il seguente codice all’ interno
delle parentesi graffe come indicato qui sotto

init()
{
  barre_totali=Bars;
  if(Close[1]>iMA(Symbol(),Period(),periodo_media,0,0,0,1))
  {
    posizione_prezzo=1;
  }
  else
  {
    posizione_prezzo=-1;
  }
}

In queste poche righe abbiamo detto al nostro EA che se la chiusura della precedente candela, indicata da Close[1],
Ë Maggiore della media calcolata sulla barra precedente, posizione_prezzo=1, altrimenti posizione_prezzo=-1.
In questo modo il nostro programma sapr‡ se la chiusura precedente si trova sopra o sotto la media mobile.
La moving average ( in questo caso abbiamo usato la media semplice ) viene calcolata attraverso la funzione iMA().

Fatto questo dobbiamo dire ora al nostro EA di controllare, alla chiusura di ogni barra, se la candela precedente
ha chiuso dal lato opposto della media. Scriviamo quindi un’ altra porzione di codice in start(), come segue

start()
{
  double media_mobile;
  if(barre_totali<Bars)
  {
    barre_totali=Bars;
	media_mobile=iMA(Symbol(),Period(),periodo_media,0,0,0,1);
	if(posizione_prezzo==1 && Close[1]<media_mobile)
	{
	  OrderSend(Symbol(),1,lotto,Bid,30,Bid+500*MarketInfo(Symbol(),MODE_POINT),Bid-500*MarketInfo(Symbol(),MODE_SPREAD));
	  posizione_prezzo=-1;
	}
	else if(posizione_prezzo==-1 && Close[1]>media_mobile)
	{
	  OrderSend(Symbol(),0,lotto,Ask,30,Bid-500*MarketInfo(Symbol(),MODE_POINT),Bid+500*MarketInfo(Symbol(),MODE_SPREAD));
	  posizione_prezzo=1;
	}
  }
}

Quest’ ultima porzione di codice si può riassumere così:

1) controllo nuova barra: essendo che la funzione start() viene chiamata all’ arrivo di ogni singolo tick Ë
necessario fare in modo di eseguire il nostro codice solo all’ arrivo di una nuova candela.
Nell’ init() abbiamo posto che barre_totali=Bars, ossia barre_totali viene posto uguale al numero di barre ( Bars )
presenti attualmente sul grafico. Ogni volta che viene aggiunta una nuova barra si avr‡ che Bars viene automaticamente
incrementato
di uno dal Metatrader: con questo if controlliamo quindi se il numero di barre precedentemente registrato Ë minore delle barre
attualmente presenti nel grafico. In caso affermativo viene eseguito il codice successivo, tra cui l’ aggiornamento
del valore barre_totali per fare in modo che sino alla prossima nuova barra l’ EA con compia altre azioni.
2) A questo punto calcoliamo la media_mobile con la funzione iMA(), compiamo due controlli ed eventualmente inviamo un ordine.

if (posizione_prezzo==1 && Close[1]<media_mobile)

Questa riga controlla che ci siano i requisiti per aprire una posizione short: se posizione_prezzo==1
( quindi il prezzo era sopra alla media ) e se Close[1]<media_mobile (la chiusura della barra precedente
Ë inferiore alla media mobile ) Ë soddisfatta la nostra condizione di apertura, per cui segue un ordine short
con la funzione OrderSend().
L’ else if successivo fa un controllo specularmente opposto: se il prezzo era prima sotto la media e la barra
precedente ha chiuso sopra la media, si entra in long.
Per semplificare questo programma d’ esempio vengono inviati ordini a 50 pips di stop loss e 50 pips di take profit.

3)Infine è necessario aggiornare la variabile posizione_prezzo ponendola a -1 o a 1. Se l’ entrata Ë stata in
short significa che attualmente il prezzo Ë sotto la media e quindi poniamo posizione_prezzo=-1: questo far‡ in modo
che la prossima operazione sar‡ aperta in long. Se l’ entrata invece Ë stata in long vale l’ esatto contrario: la
prossima operazione potr‡ essere aperta soltanto in short. Ad ogni apertura si avr‡ quindi un aggiornamento di
posizione_prezzo che ci permetter‡ di aprire il trade nel senso corretto.

Per una trattazione pi˘ completa sulle funzioni di media mobile e di invio degli ordini puoi consultare i relativi
articoli sulla funzione Ordersend e sulla funzione iMA.

Iscriviti a Money.it

Trading online
in
Demo

Fai Trading Online senza rischi con un conto demo gratuito: puoi operare su Forex, Borsa, Indici, Materie prime e Criptovalute.

Correlato