Archivio blog

sabato 9 aprile 2016

Simple Moving Average #learning MQL5_code base

//+------------------------------------------------------------------+
//|                                                          SMA.mq5 |
//|                              Copyright 2009, Riccardo Placitelli |
//|                            http://forexsmartsharing.blogspot.it/ |
//+------------------------------------------------------------------+

//---l'indicatore sarà mostrato nella finestra principale 
#property indicator_chart_window

//---un buffer sarà utilizzato per il calcolo dati e traciate l'indice
#property indicator_buffers 1

//---sarà utilizzato solo un tracciato
#property indicator_plots 1

//---l'indicatore sarà rappresentato da una linea
#property indicator_type1 DRAW_LINE

//---la linea dell'indicatore sarà di colore rosso
#property indicator_color1 clrRed

//---parametri di input dell'indicatore 
input int MAPeriod=13; //periodo della media 
input int MAShift=0; //scostamento orizzontale della media

//---dichiarazione dell'array dinamico utilizzato dall'indicatore
double ExtLineBuffer[];

//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzato      |
//+------------------------------------------------------------------+

void OnInit()
   {
      //---+
      
      //---associare l'array dinamico con il buffer zero-esimo
      SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
      
      //---settare lo spostamento orizzontale della media
      PlotIndexSetInteger(0,PLOT_SHIFT,MAShift);
      
      //---settare l'inizio del tracciato partendo dal numero di barre considerate per la media
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MAPeriod);
      
      //---+
   }

//+------------------------------------------------------------------+
//| Funzione iterativa dell'indicatore personalizzato                |
//+------------------------------------------------------------------+

int OnCalculate(
        const int rates_total, //numero di barre totali al tick corrente
        const int prev_calculated, //numero di barre calcolate al tick precedente
        const int begin, //indice della prima barra
        const double &price[] //array relativo ai dati dei prezzi di quotazione
                )
            
            //---
            
            {
               //---+
               
               //---check per la presenza di barre sufficienti al calcolo della media
               if(rates_total < MAPeriod - 1)
               return(0);
               
               //---dichiarazione delle variabili locali
               int first, bar, i;
               double Sum, SMA;
               
               //---inizializzazione dell'indice prima del ciclo principale
               if(prev_calculated==0) /*check relativo all'inizializzazione di                                           calcolo per l'indice*/

               first=MAPeriod-1+begin; /*inizializzazione dell'indice per tutte                                            le barre*/
               else first=prev_calculated-1;
               
               //---ciclo principale di calcolo
               for(bar=first; bar<rates_total; bar++)
                  {
                     Sum=0.0;
                     //---ciclo di somma per la media delle barre correnti
                     for(i=0; i<MAPeriod; i++)
                     Sum+=price[bar-i]; //al pari di Sum=Sum+price[bar-i]
                     
                     //---calcolo del valore della media
                     SMA=Sum/MAPeriod;
                     
                     /*---associare il valore calcolato per la media al buffer                          dell'indicatore*/
                     ExtLineBuffer[bar]=SMA;
                  }  
                  
               //---+
               
               return(rates_total);
             }
//------------------------------------------------------+

Nessun commento:

Posta un commento

condividi la tua opinione...