//===================================================================================================================================================// #property copyright "Copyright 2014-2017, Nikolaos Pantzos" #property link "https://www.mql5.com/en/users/pannik" #property version "1.0" #property description "iCompass" #property strict //===================================================================================================================================================// #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 clrMidnightBlue #property indicator_color2 clrDarkViolet #property indicator_width1 2 #property indicator_width2 2 //===================================================================================================================================================// extern int BarsCount = 10000; extern int MAperiods = 30; //===================================================================================================================================================// double ExtBuffer0[]; double ExtBuffer1[]; double ExtBuffer2[]; double ExtBuffer3[]; double ExtBufferh1[]; double ExtBufferh2[]; double MovingAverage[]; //===================================================================================================================================================// int OnInit(void) { IndicatorShortName(WindowExpertName()); IndicatorDigits(Digits); IndicatorBuffers(7); //--- SetIndexBuffer(0,ExtBufferh1); SetIndexStyle(0,DRAW_LINE); SetIndexLabel(0,"UpTrend"); //--- SetIndexBuffer(1,ExtBufferh2); SetIndexStyle(1,DRAW_LINE); SetIndexLabel(1,"DownTrend"); //--- SetIndexBuffer(2,ExtBuffer3); SetIndexBuffer(3,ExtBuffer0); SetIndexBuffer(4,ExtBuffer1); SetIndexBuffer(5,ExtBuffer2); SetIndexBuffer(6,MovingAverage); return(INIT_SUCCEEDED); } //===================================================================================================================================================// int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //----------------------------------------------------------------------------------- int i; int k; int Limit=0; double Value=0; double LastValue=0; double GetBuffer=0; double MedianPrice; double MinLow=0; double MaxHigh=0; double sum=0; double sumw=0; double weight; double SmoothBars=NormalizeDouble(MAperiods/3,0); int CountedBars=BarsCount;//IndicatorCounted(); if(CountedBars>Bars-1-SmoothBars) CountedBars=Bars-1-(MAperiods/3); if(CountedBars<0) return(-1); if(CountedBars>0) CountedBars--; Limit=CountedBars; //----------------------------------------------------------------------------------- for(i=0; i0) ExtBuffer1[i]=10; else ExtBuffer1[i]=-10; } //----------------------------------------------------------------------------------- for(i=Limit; i>=0; i--) { sum=0; sumw=0; for(k=0; k=0; k++) { weight=SmoothBars-k; sumw+=weight; sum+=weight*ExtBuffer2[i-k]; } if(sumw!=0) ExtBuffer3[i]=sum/sumw; else ExtBuffer3[i]=0; } //----------------------------------------------------------------------------------- for(i=Limit-1; i>=0; i--) { ExtBufferh1[i]=EMPTY_VALUE; ExtBufferh2[i]=EMPTY_VALUE; //--- if(ExtBuffer3[i]>0) { ExtBufferh1[i]=MovingAverage[i]; if(ExtBuffer3[i+1]<0) ExtBufferh1[i+1]=MovingAverage[i+1]; } //--- if(ExtBuffer3[i]<0) { ExtBufferh2[i]=MovingAverage[i]; if(ExtBuffer3[i+1]>0) ExtBufferh2[i+1]=MovingAverage[i+1]; } //--- } //----------------------------------------------------------------------------------- return(rates_total); } //===================================================================================================================================================//