//+------------------------------------------------------------------+ //| SuperTrend.mq5 | //| Copyright 2011, FxGeek | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, FxGeek" #property link " http://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 11 #property indicator_plots 3 //--- #property indicator_label1 "Buy_Arrow" #property indicator_type1 DRAW_ARROW #property indicator_color1 clrGreen #property indicator_width1 2 //--- #property indicator_label2 "Sell_Arrow" #property indicator_type2 DRAW_ARROW #property indicator_color2 clrRed #property indicator_width2 2 //--- #property indicator_label3 "SuperTrend" #property indicator_type3 DRAW_COLOR_LINE #property indicator_color3 clrGreen, clrRed #property indicator_width3 2 //--- input int Periode=10; input double Multiplier=3; input bool Show_Filling=false; // Show as DRAW_FILLING //--- double buyPB[]; double sellPB[]; //--- double SuperTrend[]; double ColorBuffer[]; //--- double Atr[]; double Up[]; double Down[]; double Middle[]; double trend[]; //--- int atrHandle; int changeOfTrend; int flag; int flagh; //--- ushort codeUp=233; ushort codeDown=234; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,buyPB,INDICATOR_DATA); SetIndexBuffer(1,sellPB,INDICATOR_DATA); SetIndexBuffer(2,SuperTrend,INDICATOR_DATA); SetIndexBuffer(3,ColorBuffer,INDICATOR_COLOR_INDEX); //--- PlotIndexSetInteger(0,PLOT_ARROW,codeUp); PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,20); PlotIndexSetInteger(1,PLOT_ARROW,codeDown); PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-20); //--- SetIndexBuffer(4,Atr,INDICATOR_CALCULATIONS); SetIndexBuffer(5,Up,INDICATOR_CALCULATIONS); SetIndexBuffer(6,Down,INDICATOR_CALCULATIONS); SetIndexBuffer(7,Middle,INDICATOR_CALCULATIONS); SetIndexBuffer(8,trend,INDICATOR_CALCULATIONS); //--- atrHandle=iATR(_Symbol,_Period,Periode); //--- 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) { Print("Getting Atr is failed! Error",GetLastError()); return(0); } //--- int first; if(prev_calculated>rates_total || prev_calculated<=0) // checking for the first start of calculation of an indicator { first=Periode; // 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; } //--- double Support1= 0; double Resist1 = 0; //--- Support1 = SuperTrend[i]; Resist1 = SuperTrend[i]; //--- bool UpTrend=Support1Support1) { buyPB[i]=low[i]; } } else { if(high[i]>Resist1 && close[i]