AMA_Bands





//+------------------------------------------------------------------+
//|                                                    AMA_Bands.mq4 |
//|                                      Copyright © 2006, Alexandre |
//|                                       mailto: a_g_j_@hotmail.com |
//+------------------------------------------------------------------+
//---- general properties
#property copyright "Copyright © 2006, Alexandre"
#property link      "mailto: a_g_j_@hotmail.com"
//---- indicator properties
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 DarkViolet  // 'line'  (main)
#property indicator_color2 DodgerBlue  // 'arrow' (up)
#property indicator_color3 OrangeRed   // 'arrow' (down)
#property indicator_color4 Sienna      // 'arrow' (stop-symbol)
#property indicator_color5 Aqua        // 'line'  (inner BB upper band)
#property indicator_color6 Aqua        // 'line'  (inner BB lower band)
#property indicator_color7 Magenta     // 'line'  (outer BB upper band)
#property indicator_color8 Magenta     // 'line'  (outer BB lower band)
//---- defines
//---- input parameters
extern int    Range       = 9;
extern int SlowAMA        = 30;
extern int FastAMA        = 2;
extern double P_G         = 2.0;
extern double K_F         = 2.0;
extern bool InnerBandsOn  = true;
extern double BandsDevInn = 1.0;
extern bool OuterBandsOn  = true;
extern double BandsDevOut = 2.0;
extern bool LastBarOnly   = false;
//---- common buffers
//---- indicator buffers
double AMA_Buffer[];
double AMA_UpSig[];
double AMA_DwSig[];
double AMA_NlSig[];
double AMA_UppBufferL[];
double AMA_LowBufferL[];
double AMA_UppBufferH[];
double AMA_LowBufferH[];
//---- variables
double A = 0.45; // quotation coefficient - value close to optimal 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
 {
 //---- indicators
  SetIndexStyle(0, DRAW_LINE);
  SetIndexLabel(0, "Main Line");
  SetIndexBuffer(0, AMA_Buffer); // main line
  SetIndexDrawBegin(0, Range);
  //
  SetIndexStyle(1, DRAW_ARROW);
  SetIndexLabel(1, "Signal Up");
  SetIndexArrow(1, 225);       // small arrow up
  SetIndexBuffer(1, AMA_UpSig);
  SetIndexDrawBegin(1, Range);
  //
  SetIndexStyle(2, DRAW_ARROW);
  SetIndexLabel(2, "Signal Down");
  SetIndexArrow(2, 226);       // small arrow down
  SetIndexBuffer(2, AMA_DwSig);
  SetIndexDrawBegin(2, Range);
  //
  SetIndexStyle(3, DRAW_ARROW);
  SetIndexLabel(3, "Signal Stop");
  SetIndexArrow(3, 251);       // small stop-symbol
  SetIndexBuffer(3, AMA_NlSig);
  SetIndexDrawBegin(3, Range);
  //
  if (InnerBandsOn == true)
   {
    SetIndexStyle(4, DRAW_LINE);
    SetIndexLabel(4, "Inner BB Upper Line");
    SetIndexBuffer(4, AMA_UppBufferL); // inner BB upper line
    SetIndexDrawBegin(4, Range);
    //
    SetIndexStyle(5, DRAW_LINE);
    SetIndexLabel(5, "Inner BB Lower Line");
    SetIndexBuffer(5, AMA_LowBufferL); // inner BB lower line
    SetIndexDrawBegin(5, Range);
   }
  //
  if (OuterBandsOn == true)
   {
    SetIndexStyle(6, DRAW_LINE);
    SetIndexLabel(6, "Outer BB Upper Line");
    SetIndexBuffer(6, AMA_UppBufferH); // outer BB upper line
    SetIndexDrawBegin(6, Range);
    //
    SetIndexStyle(7, DRAW_LINE);
    SetIndexLabel(7, "Outer BB Lower Line");
    SetIndexBuffer(7, AMA_LowBufferH); // outer BB lower line
    SetIndexDrawBegin(7, Range);
   }
 //----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
 {
 //----
 //
 //----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
 {
  int counted_bars = IndicatorCounted();
  int Limit;
  int i, j, k;
  double d_f, old_val, new_val, sum, std_dev;
  static double v_prev, v_curr, ER_Low, ER_Upp;
 //----
  if (counted_bars < 0) { return(-1); }
  Limit = Bars - counted_bars;
  //
  if (Limit > Range) // run once when getting started
   { 
    k = Limit - Range; 
    v_prev = Close[Limit-Range]; 
    ER_Low = 2.0 / (SlowAMA + 1); // lower Efficiency Ratio threshold
    ER_Upp = 2.0 / (FastAMA + 1); // upper Efficiency Ratio threshold
   }
  else // run elsewhere
   {
    if (LastBarOnly == false) 
     { k = Limit; v_prev = AMA_Buffer[Limit+1]; }
    else
     { k = 0; v_prev = AMA_Buffer[1]; }
   }
  //
  for (i=k; i>=0; i--)
   { 
    v_curr = GetAMAOneStep(v_prev, i, Range, ER_Low, ER_Upp, P_G, A);
    d_f = v_curr - v_prev;
    v_prev = v_curr;
    AMA_Buffer[i] = v_curr; // line
    // signals - 1st derivative
    if ((MathAbs(d_f) > (K_F * Point)) && (d_f > 0.0)) // signal up
     { 
      AMA_UpSig[i] = AMA_Buffer[i]; 
      AMA_DwSig[i] = EMPTY_VALUE;
      AMA_NlSig[i] = EMPTY_VALUE;
     }
    else if ((MathAbs(d_f) > (K_F * Point)) && (d_f < 0.0)) // signal down
     {
      AMA_UpSig[i] = EMPTY_VALUE; 
      AMA_DwSig[i] = AMA_Buffer[i]; 
      AMA_NlSig[i] = EMPTY_VALUE;
     }
    else // signal stop
     {
      AMA_UpSig[i] = EMPTY_VALUE;
      AMA_DwSig[i] = EMPTY_VALUE;
      AMA_NlSig[i] = AMA_Buffer[i]; 
     }
   }
   if ((InnerBandsOn == true) || (OuterBandsOn == true))
    {
     // calculate standard deviation
     i = Bars - Range;
     if (counted_bars > (Range - 1)) { i = Bars - counted_bars - 1; }
     while (i >= 0)
      {
       sum = 0.0;
       k = i + Range - 1;
       old_val = AMA_Buffer[i];
       while (k >= i)
        {
         new_val = Close[k] - old_val;
         sum += new_val * new_val;
         k--;
        }
       std_dev = MathSqrt(sum / Range);
       // complete BB's buffers
       if (InnerBandsOn == true)
        {
         AMA_UppBufferL[i] = old_val + BandsDevInn * std_dev;
         AMA_LowBufferL[i] = old_val - BandsDevInn * std_dev;
        }
       if (OuterBandsOn ==  true)
        {
         AMA_UppBufferH[i] = old_val + BandsDevOut * std_dev;
         AMA_LowBufferH[i] = old_val - BandsDevOut * std_dev;
        }
       i--;
      }
    }
 //----
  return(0);
 }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Close Prices Adaptive Smoothing - AMA One Step                   |
//+------------------------------------------------------------------+
double GetAMAOneStep(double v_prev, int n_bar, int range, double er_low, 
                                    double er_upp, double pow, double a)
 {
  double v_curr, noise, er, ssc; 
 //----
 // calculate efficiency ratio & ssc
  noise = 0.000000001;
  for (int i=n_bar+range-1; i>=n_bar; i--)
   { noise += MathAbs(Close[i] - Close[i+1]); }
  er   = MathAbs(Close[n_bar] - Close[n_bar+range]) / noise;
  ssc  = er * er_upp + er_low;
  ssc  = MathPow(ssc, pow);
  // calculate AMA one step, using explicit/implicit Euler Schema
  v_curr = (v_prev + ssc * (a * (Close[n_bar+1] - v_prev) + 
           (1.0 - a) * Close[n_bar])) / (1.0 + (1.0 - a) * ssc);
 //----
  return(v_curr);
 }





Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE

Implements a curve of type DRAW_ARROW

Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: