mercoledì 22 ottobre 2014

Trading con medie mobili

Uno degli strumenti più utilizzati dai trader è l'indicatore Media Mobile.

La media Media Mobile è un indicatore costruito prendendo i prezzi più recenti di un periodo di riferimento prestabilito e calcolandone la media. Per esempio la Media Mobile a 20gg e la media degli ultimi 20 giorni; con il passare dei giorni, il prezzo più vecchio viene tolto dal calcolo e viene aggiunta l'ultima giornata finita.
L'indicatore graficamente compare come dalla figura di sotto, ovvero segue l'andamento dei prezzi smussando evetuali picchi e movimenti violenti dei prezzi




La Media Mobile può fornire segnali per comprare e vendere uno strumento finanziario.
Per esempio se il prezzo supera il valore della media mobile si compra, viceversa se scende, sta sotto, si vende.
Svantaggio nell''utilizzare le Media Mobile è che se questa è breve ( cioè si usa una serie storica breve) dà troppi segnali e molti sono falsi.

Per ovviare a questo inconveniente si preferisce utilizzare non l'incrocio della media mobile con i prezzi ma bensi l'incrocio tra due Media Mobili come evidenziato nella figura di sotto.



Come si vede in questo caso i segnali sono solo due.





giovedì 9 ottobre 2014

Incrocio Medie Mobili

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);
   
    }
 
 }

//--------------------