Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
EMA_BB_VA
//+------------------------------------------------------------------+
//| EMA_BB_VA.mq5 |
//| Integer |
//| https://login.mql5.com/en/users/Integer |
//+------------------------------------------------------------------+
#property copyright "Integer"
#property link "https://login.mql5.com/en/users/Integer"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 1
//--- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- input parameters
input int STDPeriod = 14; // StdDev period
input double EMAPeriods = 14; // EMA period
input double Sensitivity = 100; // Sensitivity (-100 to 100)
input ENUM_APPLIED_PRICE Price = PRICE_CLOSE; // Applied price
int STDHand;
int MAHand;
int MABBHand;
double sens;
//--- indicator buffers
double Label1Buffer[];
double STDBuf[];
double MABuf[];
double MABBBuf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
sens=Sensitivity/100.0;
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
SetIndexBuffer(1,STDBuf,INDICATOR_CALCULATIONS);
SetIndexBuffer(2,MABuf,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,MABBBuf,INDICATOR_CALCULATIONS);
STDHand=iStdDev(NULL,PERIOD_CURRENT,STDPeriod,0,0,Price);
MAHand=iMA(NULL,PERIOD_CURRENT,1,0,0,Price);
MABBHand=iMA(NULL,PERIOD_CURRENT,STDPeriod,0,0,Price);
if(STDHand==INVALID_HANDLE || MAHand==INVALID_HANDLE || MABBHand==INVALID_HANDLE)
{
Alert("Error in creation of indicator. Please try again");
return(-1);
}
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,STDPeriod*2);
PlotIndexSetString(0,PLOT_LABEL,MQL5InfoString(MQL5_PROGRAM_NAME));
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[])
{
static bool error=true;
int start;
if(prev_calculated==0)
{
error=true;
}
if(error)
{
start=STDPeriod*2;
Label1Buffer[start-1]=close[start-1];
error=false;
}
else
{
start=prev_calculated-1;
}
if(CopyBuffer(STDHand,0,0,rates_total-start,STDBuf)==-1 ||
CopyBuffer(MAHand,0,0,rates_total-start,MABuf)==-1 ||
CopyBuffer(MABBHand,0,0,rates_total-start,MABBBuf)==-1
)
{
error=true;
return(0);
}
for(int i=start;i<rates_total;i++)
{
STDBuf[i]=2.0*STDBuf[i]/MABBBuf[i];
double mxv=STDBuf[ArrayMaximum(STDBuf,i-STDPeriod+1,STDPeriod)];
double mnv=STDBuf[ArrayMinimum(STDBuf,i-STDPeriod+1,STDPeriod)];
double r=mxv-mnv;
if(r==0)
{
Label1Buffer[i]=Label1Buffer[i-1];
continue;
}
double ATRvlty=(STDBuf[i]-mnv)/r;
double multi;
if(ATRvlty<=0.5)
{
multi=10.0*MathPow(ATRvlty,3.4739)+0.1;
}
else
{
multi=10*MathPow(ATRvlty,3.32)+0.000001;
}
if(sens>0)
{
multi=1.0/multi;
}
if(multi<1.0)
{
multi=1.0-(1.0-multi)*MathAbs(sens);
}
else
{
multi=(multi-1.0)*MathAbs(sens)+1.0;
}
double pdsx=EMAPeriods*multi;
if(pdsx<1.0)
{
pdsx=1.0;
}
Label1Buffer[i]=MABuf[i]*2.0/(pdsx+1.0)+Label1Buffer[i-1]*(1.0-2.0/(pdsx+1.0));
}
return(rates_total);
}
//+------------------------------------------------------------------+
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
---