Miscellaneous
0
Views
0
Downloads
0
Favorites
AMA_Bands_v1
//+------------------------------------------------------------------+
//| 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 Silver // '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);
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---