//+------------------------------------------------------------------+ //| WATR.mq5 | //| Written WizardSerg under article konkop in | //| "Modern trading" #4/2001 | //| http://www.wizardserg.inweb.ru | //| wizardserg@mail.ru | //+------------------------------------------------------------------+ //--- author of the indicator #property copyright "Written WizardSerg under article konkop in #4/2001" //--- link to the website of the author #property link "http://www.wizardserg.inweb.ru" //--- indicator version #property version "1.00" //--- drawing the indicator in the main window #property indicator_chart_window //--- four buffers are used for calculation and drawing the indicator #property indicator_buffers 4 //--- four plots are used #property indicator_plots 4 //+----------------------------------------------+ //| Parameters of drawing the bullish indicator | //+----------------------------------------------+ //--- drawing indicator 1 as a line #property indicator_type1 DRAW_LINE //--- dodger blue color is used as the color of a bullish candlestick #property indicator_color1 DodgerBlue //--- the indicator 1 line is a continuous curve #property indicator_style1 STYLE_SOLID //--- thickness of the indicator 1 line is equal to 2 #property indicator_width1 2 //--- bullish indicator label display #property indicator_label1 "Upper WATR" //+----------------------------------------------+ //| Parameters of drawing the bearish indicator | //+----------------------------------------------+ //--- drawing the indicator 2 as a line #property indicator_type2 DRAW_LINE //--- coral color is used as the color of the bearish indicator line #property indicator_color2 Coral //--- the indicator 2 line is a continuous curve #property indicator_style2 STYLE_SOLID //--- thickness of line of the indicator 2 is equal to 2 #property indicator_width2 2 //--- bearish indicator label display #property indicator_label2 "Lower WATR" //+----------------------------------------------+ //| Parameters of drawing the bullish indicator | //+----------------------------------------------+ //--- drawing the indicator 3 as a label #property indicator_type3 DRAW_ARROW //--- aqua blue color is used as the color of a bullish candlestick #property indicator_color3 Aqua //--- the indicator 3 line is a continuous curve #property indicator_style3 STYLE_SOLID //--- thickness of the indicator 3 line is equal to 4 #property indicator_width3 4 //--- bullish indicator label display #property indicator_label3 "Upper WATR" //+----------------------------------------------+ //| Parameters of drawing the bearish indicator | //+----------------------------------------------+ //--- drawing the indicator 4 as a label #property indicator_type4 DRAW_ARROW //--- Magenta color is used as the color of the bearish indicator line #property indicator_color4 Magenta //--- the indicator 2 line is a continuous curve #property indicator_style4 STYLE_SOLID //--- thickness of the indicator 4 line is equal to 4 #property indicator_width4 4 //--- bearish indicator label display #property indicator_label4 "Lower WATR" //+----------------------------------------------+ //| Indicator input parameters | //+----------------------------------------------+ input int WATR_K = 10; input double WATR_M = 4.0; input int ATR=21; input int Shift=0; // Horizontal shift of the indicator in bars //+----------------------------------------------+ //--- declaration of dynamic arrays that further will be used as indicator buffers double ExtMapBufferUp[]; double ExtMapBufferDown[]; double ExtMapBufferUp1[]; double ExtMapBufferDown1[]; //--- declaration of variables for the indicators handles int ATR_Handle; //--- declaration of the integer variables for the start of data calculation int StartBars; //+------------------------------------------------------------------+ //| Custom indicator function | //+------------------------------------------------------------------+ bool AntiTrendBar(const double &Open[],const double &Close[],int bar) { //--- bool res=(TrendUp(Close,bar) && (Close[bar]Open[bar])); //--- return(res); } //+------------------------------------------------------------------+ //| Custom indicator function | //+------------------------------------------------------------------+ double CalcIndicValue(double &ATRArray[],const double &Close[],int bar,bool trend) { //--- double res=Close[bar]; if(trend)res -= (WATR_K*_Point + WATR_M*ATRArray[bar]); else res += (WATR_K*_Point + WATR_M*ATRArray[bar]); //--- return(res); } //+------------------------------------------------------------------+ //| Custom indicator function | //+------------------------------------------------------------------+ bool TrendUp(const double &Close[],int bar) { //--- return((Close[bar+1]>ExtMapBufferUp[bar+1]) && (ExtMapBufferUp[bar+1]!=EMPTY_VALUE)); //--- } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- getting the handle of the ATR indicator ATR_Handle=iATR(NULL,0,ATR); if(ATR_Handle==INVALID_HANDLE)Print(" Failed to get handle of the ATR indicator"); //--- initialization of variables of the start of data calculation StartBars=ATR; //--- set ExtMapBufferUp dynamic array as an indicator buffer SetIndexBuffer(0,ExtMapBufferUp,INDICATOR_DATA); //--- shifting the indicator 1 horizontally by Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //--- shifting the start of drawing of the indicator 1 PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBars); //--- create a label to display in DataWindow PlotIndexSetString(0,PLOT_LABEL,"Upper WATR"); //--- indexing the elements in buffers as timeseries ArraySetAsSeries(ExtMapBufferUp,true); //--- setting values of the indicator that won't be visible on a chart PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- set ExtMapBufferDown dynamic array as an indicator buffer SetIndexBuffer(1,ExtMapBufferDown,INDICATOR_DATA); //--- shifting the indicator 2 horizontally by Shift PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //--- shifting the start of drawing the indicator 2 PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBars); //--- create a label to display in DataWindow PlotIndexSetString(1,PLOT_LABEL,"Lower WATR"); //--- indexing the elements in buffers as timeseries ArraySetAsSeries(ExtMapBufferDown,true); //--- setting values of the indicator that won't be visible on a chart PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- set ExtMapBufferUp1 dynamic array as an indicator buffer SetIndexBuffer(2,ExtMapBufferUp1,INDICATOR_DATA); //--- shifting the indicator 1 horizontally by Shift PlotIndexSetInteger(2,PLOT_SHIFT,Shift); //--- shifting the start of drawing of the indicator 1 PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBars); //--- create a label to display in DataWindow PlotIndexSetString(2,PLOT_LABEL,"Upper WATR"); //--- indexing the elements in buffers as timeseries ArraySetAsSeries(ExtMapBufferUp1,true); //--- setting values of the indicator that won't be visible on a chart PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- the indicator symbol PlotIndexSetInteger(2,PLOT_ARROW,108); //--- set ExtMapBufferDown1 dynamic array as an indicator buffer SetIndexBuffer(3,ExtMapBufferDown1,INDICATOR_DATA); //--- shifting the indicator 2 horizontally by Shift PlotIndexSetInteger(3,PLOT_SHIFT,Shift); //--- shifting the start of drawing the indicator 2 PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,StartBars); //--- create a label to display in DataWindow PlotIndexSetString(3,PLOT_LABEL,"Lower WATR"); //--- indexing the elements in buffers as timeseries ArraySetAsSeries(ExtMapBufferDown1,true); //--- setting values of the indicator that won't be visible on a chart PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- the indicator symbol PlotIndexSetInteger(3,PLOT_ARROW,108); //--- initializations of a variable for the indicator short name string shortname; StringConcatenate(shortname,"WATR(",WATR_K,", ",WATR_M,", ",ATR,")"); //--- creating a name for displaying in a separate sub-window and in a tooltip IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- determination of accuracy of displaying the indicator values IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //--- } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // number of bars in history at the current tick const int prev_calculated,// number of bars calculated at previous call const datetime &time[], const double &open[], const double& high[], // price array of maximums of price for the indicator calculation const double& low[], // price array of minimums of price for the indicator calculation const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- checking the number of bars to be enough for the calculation if(BarsCalculated(ATR_Handle)rates_total || prev_calculated<=0) // checking for the first start of the indicator calculation { limit=rates_total-StartBars; // starting index for calculation of all bars to_copy=rates_total; ExtMapBufferUp[limit+1]=close[limit+1]-WATR_K*_Point; } else { limit=rates_total-prev_calculated; // starting index for calculation of new bars to_copy=limit+1; } //--- copy newly appeared data in the iATR_[] array if(CopyBuffer(ATR_Handle,0,0,to_copy,iATR_)<=0) return(0); //--- main indicator calculation loop for(bar=limit; bar>=0; bar--) { if(AntiTrendBar(open,close,bar)) { ExtMapBufferUp[bar]=ExtMapBufferUp[bar+1]; ExtMapBufferDown[bar]=ExtMapBufferDown[bar+1]; } else { if(TrendUp(close,bar)) { ExtMapBufferUp[bar]=CalcIndicValue(iATR_,close,bar,true); if(ExtMapBufferUp[bar]ExtMapBufferDown[bar+1]) { ExtMapBufferDown[bar]=ExtMapBufferDown[bar+1]; } ExtMapBufferUp[bar]=EMPTY_VALUE; } } // crossings with a price if(TrendUp(close,bar) && (close[bar]ExtMapBufferDown[bar])) { ExtMapBufferUp[bar]=CalcIndicValue(iATR_,close,bar,true); ExtMapBufferDown[bar]=EMPTY_VALUE; } ExtMapBufferUp1[bar]=0.0; ExtMapBufferDown1[bar]=0.0; if(ExtMapBufferUp[bar+1]==EMPTY_VALUE && ExtMapBufferUp[bar]!=EMPTY_VALUE) ExtMapBufferUp1[bar]=ExtMapBufferUp[bar]; if(ExtMapBufferDown[bar+1]==EMPTY_VALUE && ExtMapBufferDown[bar]!=EMPTY_VALUE) ExtMapBufferDown1[bar]=ExtMapBufferDown[bar]; } //--- return(rates_total); } //+------------------------------------------------------------------+