//+------------------------------------------------------------------+
//| 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...