//+------------------------------------------------------------------+ //| AMA+BB.mq5 | //| Copyright 2010, ARIES Software Corp. | //| http://ariess.mp | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, ARIES Software Corp." #property link "http://ariess.mp" #property version "1.00" #property description "2009, MetaQuotes Software Corp." #property description "http://www.mql5.com" #property description "Adaptive Moving Average + Bollinger Bands" #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 3 //---- plot ExtAMABuffer #property indicator_label1 "AMA" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //---- plot ExtUpBuffer #property indicator_label2 "AMA upper" #property indicator_type2 DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //---- plot ExtDwBuffer #property indicator_label3 "AMA lower" #property indicator_type3 DRAW_LINE #property indicator_color3 Red #property indicator_style3 STYLE_SOLID #property indicator_width3 1 //--- default applied price #property indicator_applied_price PRICE_OPEN //--- input parameters input int InpPeriodAMA=10; // AMA period input int InpSlowPeriodEMA=30; // Slow EMA period input int InpFastPeriodEMA=2; // Fast EMA period input int InpShiftAMA=0; // AMA shift input int InpBandsPeriod=20; // Period input double InpBandsDeviations=2.0; // Deviation //--- indicator buffers double ExtAMABuffer[]; double ExtUpBuffer[]; double ExtDwBuffer[]; double ExtStdDevBuffer[]; //--- global variables double ExtFastSC; double ExtSlowSC; int ExtPeriodAMA; int ExtSlowPeriodEMA; int ExtFastPeriodEMA; int ExtBandsPeriod; double ExtBandsDeviations; //+------------------------------------------------------------------+ //| AMA initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- check for input values if(InpPeriodAMA<=0) { ExtPeriodAMA=10; printf("Input parameter InpPeriodAMA has incorrect value (%d). Indicator will use value %d for calculations.", InpPeriodAMA,ExtPeriodAMA); } else ExtPeriodAMA=InpPeriodAMA; if(InpSlowPeriodEMA<=0) { ExtSlowPeriodEMA=30; printf("Input parameter InpSlowPeriodEMA has incorrect value (%d). Indicator will use value %d for calculations.", InpSlowPeriodEMA,ExtSlowPeriodEMA); } else ExtSlowPeriodEMA=InpSlowPeriodEMA; if(InpFastPeriodEMA<=0) { ExtFastPeriodEMA=2; printf("Input parameter InpFastPeriodEMA has incorrect value (%d). Indicator will use value %d for calculations.", InpFastPeriodEMA,ExtFastPeriodEMA); } else ExtFastPeriodEMA=InpFastPeriodEMA; if(InpBandsPeriod<2) { ExtBandsPeriod=20; printf("Incorrect value for input variable InpBandsPeriod=%d. Indicator will use value=%d for calculations.",InpBandsPeriod,ExtBandsPeriod); } else ExtBandsPeriod=InpBandsPeriod; if(InpBandsDeviations==0.0) { ExtBandsDeviations=2.0; printf("Incorrect value for input variable InpBandsDeviations=%f. Indicator will use value=%f for calculations.",InpBandsDeviations,ExtBandsDeviations); } else ExtBandsDeviations=InpBandsDeviations; //--- indicator buffers mapping SetIndexBuffer(0,ExtAMABuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtUpBuffer,INDICATOR_DATA); SetIndexBuffer(2,ExtDwBuffer,INDICATOR_DATA); SetIndexBuffer(3,ExtStdDevBuffer,INDICATOR_CALCULATIONS); //--- set shortname and change label string short_name="AMA("+IntegerToString(ExtPeriodAMA)+","+ IntegerToString(ExtFastPeriodEMA)+","+ IntegerToString(ExtSlowPeriodEMA)+","+ IntegerToString(ExtBandsPeriod)+","+ (string)(ExtBandsDeviations)+")"; IndicatorSetString(INDICATOR_SHORTNAME,short_name); PlotIndexSetString(0,PLOT_LABEL,short_name); PlotIndexSetString(1,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Upper"); PlotIndexSetString(2,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Lower"); //--- set accuracy IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); //--- sets first bar from what index will be drawn PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodAMA); //--- set index shift PlotIndexSetInteger(0,PLOT_SHIFT,InpShiftAMA); //--- calculate ExtFastSC & ExtSlowSC ExtFastSC=2.0/(ExtFastPeriodEMA+1.0); ExtSlowSC=2.0/(ExtSlowPeriodEMA+1.0); //--- OnInit done return(0); } //+------------------------------------------------------------------+ //| AMA iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { int i; //--- check for rates count if(rates_total