//+------------------------------------------------------------------+ //| SuperTrend.mq5 | //| Author: Santiago Cruz | //| https://www.mql5.com/en/users/algo-trader/ | //+------------------------------------------------------------------+ #property copyright "Santiago Cruz" #property link "https://www.mql5.com/en/users/algo-trader/" #property version "1.00" #property indicator_chart_window #property indicator_buffers 7 #property indicator_plots 1 #property indicator_label1 "SuperTrend" #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrGreen, clrRed input int Periods=10; input double Multiplier=3; double SuperTrend[]; double ColorBuffer[]; double Atr[]; double Up[]; double Down[]; double Middle[]; double trend[]; int atrHandle; int changeOfTrend; int flag; int flagh; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,SuperTrend,INDICATOR_DATA); SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,Atr,INDICATOR_CALCULATIONS); SetIndexBuffer(3,Up,INDICATOR_CALCULATIONS); SetIndexBuffer(4,Down,INDICATOR_CALCULATIONS); SetIndexBuffer(5,Middle,INDICATOR_CALCULATIONS); SetIndexBuffer(6,trend,INDICATOR_CALCULATIONS); atrHandle=iATR(_Symbol,_Period,Periods); //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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 to_copy; if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total; else { to_copy=rates_total-prev_calculated; if(prev_calculated>0) to_copy++; } if(IsStopped()) return(0); //Checking for stop flag if(CopyBuffer(atrHandle,0,0,to_copy,Atr)<=0) { return(0); } int first; if(prev_calculated>rates_total || prev_calculated<=0) // checking for the first start of calculation of an indicator { first=Periods; // starting index for calculation of all bars } else { first=prev_calculated-1; // starting number for calculation of new bars } for(int i=first; iUp[i-1]) { trend[i]=1; if(trend[i-1]==-1) changeOfTrend=1; } else if(close[i]0) { flag=1; } else { flag=0; } if(trend[i]>0 && trend[i-1]<0) { flagh=1; } else { flagh=0; } if(trend[i]>0 && Down[i]Up[i-1]) Up[i]=Up[i-1]; if(flag==1) Up[i]=Middle[i]+(Multiplier*Atr[i]); if(flagh==1) Down[i]=Middle[i]-(Multiplier*Atr[i]); //-- Draw the indicator if(trend[i]==1) { SuperTrend[i]=Down[i]; if(changeOfTrend==1) { SuperTrend[i-1]=SuperTrend[i-2]; changeOfTrend=0; } ColorBuffer[i]=0.0; } else if(trend[i]==-1) { SuperTrend[i]=Up[i]; if(changeOfTrend==1) { SuperTrend[i-1]= SuperTrend[i-2]; changeOfTrend = 0; } ColorBuffer[i]=1.0; } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+