Creiamo un semplice Expert Advisor che mi fa comprare quando c'è un incrocio tra due medie mobili, precisamente nel caso che la media veloce tagli verso l'alto quella lenta compro, se invece ho comprato e la media mobile veloce taglia dal basso verso l'alto quella lenta chiudo.
Prima di iniziare a scrivere il codice ci sono delle decisioni da prendere, tipo su che time frame operare o su che grafico cioè su che strumento.
Deciso questo possiamo iniziare a scrivere il codice.
//+------------------------------------------------------------------+
//| Moving Average Cross.mq4 |
//| Francesco Sgarbossa |
//| http://appuntidimql.blogspot.it/ |
//+------------------------------------------------------------------+
#property copyright "Francesco Sgarbossa"
#property link "http://appuntidimql.blogspot.it/"
//
definisco delle costanti per la posizione
#define LONG 1
#define FLAT 2
//
definisco delle costanti per il segnale delle medie mobili
#define neutro 1
#define acquistato 2
#define vendi 3
//
definisco modificabili lotti e timeframe
extern double lotti =1;
extern int timeframe = PERIOD_H1;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
if(checkSignal()== neutro) return(0); //
se le medie mobili non si incrociano
//
non fare nulla
if(checkSignal()== acquistato) //
media mobile velocie incrocia dal basso verso l'alto
//
quella lenta, segnale di acquiso
{
if(checkPosition()== FLAT) //
se sono FLAT compro
{
compra();
return(0);
}
//---
return(0);
}
if(checkSignal()==vendi) //
media mobile veloce incrocia dall'alto verso il basso
//
quella lenta
{
if(checkPosition()== FLAT) return(0); //
se sono FLAT non faccio nulla
if(checkPosition()== LONG) //
se ho una posizione aperta la chiudo
{
chiudi();
return(0);
}
}
//----
return(0);
}
//+
int checkSignal()
{
double MM7_old =iMA(0, timeframe,7,0,MODE_SMA,PRICE_CLOSE,1);
double MM28_old =iMA(0, timeframe, 28,0, MODE_SMA, PRICE_CLOSE,1);
double MM7_new =iMA(0, timeframe,7,0,MODE_SMA,PRICE_CLOSE,0);
double MM28_new =iMA(0, timeframe, 28,0, MODE_SMA, PRICE_CLOSE,0);
if (MM7_old < MM28_old)
{
if (MM7_new > MM28_new)
{
return (acquistato);
}
}
if (MM28_old < MM7_old)
{
if ( MM28_new > MM7_new)
{
return(vendi);
}
}
return(neutro);
}
int checkPosition()
{
if (OrdersTotal()>0) return(LONG);
else return(FLAT);
}
int compra()
{
int ticket= OrderSend(Symbol(),OP_BUY,lotti,Ask,0,0,0,"",101,0,Red);
}
void chiudi()
{
int total = OrdersTotal();
for(int pos=0; pos<total;pos++)
{
OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
OrderClose(OrderTicket(),OrderLots(),Bid,0,Blue);
}
}
//--------------------