129 lines
4.9 KiB
MQL5
129 lines
4.9 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| StdDev.mq5 |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#property copyright "Copyright 2000-2025, MetaQuotes Ltd."
| |||
#property link "https://www.mql5.com"
| |||
#property description "Standard Deviation"
| |||
#include <MovingAverages.mqh>
| |||
| |||
#property indicator_separate_window
| |||
#property indicator_buffers 2
| |||
#property indicator_plots 1
| |||
#property indicator_type1 DRAW_LINE
| |||
#property indicator_color1 clrMediumSeaGreen
| |||
#property indicator_style1 STYLE_SOLID
| |||
//--- input parametrs
| |||
input int InpStdDevPeriod=20; // Period
| |||
input int InpStdDevShift=0; // Shift
| |||
input ENUM_MA_METHOD InpMAMethod=MODE_SMA; // Method
| |||
//--- indicator buffers
| |||
double ExtStdDevBuffer[];
| |||
double ExtMABuffer[];
| |||
| |||
int ExtStdDevPeriod,ExtStdDevShift;
| |||
//+------------------------------------------------------------------+
| |||
//| Custom indicator initialization function |
| |||
//+------------------------------------------------------------------+
| |||
void OnInit()
| |||
{
| |||
//--- check for input values
| |||
if(InpStdDevPeriod<=1)
| |||
{
| |||
ExtStdDevPeriod=20;
| |||
PrintFormat("Incorrect value for input variable InpStdDevPeriod=%d. Indicator will use value %d for calculations.",
| |||
InpStdDevPeriod,ExtStdDevPeriod);
| |||
}
| |||
else
| |||
ExtStdDevPeriod=InpStdDevPeriod;
| |||
if(InpStdDevShift<0)
| |||
{
| |||
ExtStdDevShift=0;
| |||
PrintFormat("Incorrect value for input variable InpStdDevShift=%d. Indicator will use value %d for calculations.",
| |||
InpStdDevShift,ExtStdDevShift);
| |||
}
| |||
else
| |||
ExtStdDevShift=InpStdDevShift;
| |||
//--- define indicator buffers as indexes
| |||
SetIndexBuffer(0,ExtStdDevBuffer);
| |||
SetIndexBuffer(1,ExtMABuffer,INDICATOR_CALCULATIONS);
| |||
//--- set indicator short name
| |||
string short_name=StringFormat("StdDev(%d)",ExtStdDevPeriod);
| |||
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
| |||
PlotIndexSetString(0,PLOT_LABEL,short_name);
| |||
//--- set index shift
| |||
PlotIndexSetInteger(0,PLOT_SHIFT,ExtStdDevShift);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Custom indicator iteration function |
| |||
//+------------------------------------------------------------------+
| |||
int OnCalculate(const int rates_total,const int prev_calculated,const int begin,const double &price[])
| |||
{
| |||
if(rates_total<ExtStdDevPeriod)
| |||
return(0);
| |||
//--- starting work
| |||
int start=prev_calculated-1;
| |||
//--- correct position for first iteration
| |||
if(start<ExtStdDevPeriod)
| |||
{
| |||
start=ExtStdDevPeriod-1;
| |||
ArrayInitialize(ExtStdDevBuffer,0.0);
| |||
ArrayInitialize(ExtMABuffer,0.0);
| |||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtStdDevPeriod-1+begin);
| |||
}
| |||
//--- main cycle
| |||
switch(InpMAMethod)
| |||
{
| |||
case MODE_EMA :
| |||
for(int i=start; i<rates_total && !IsStopped(); i++)
| |||
{
| |||
if(i==InpStdDevPeriod-1)
| |||
ExtMABuffer[i]=SimpleMA(i,InpStdDevPeriod,price);
| |||
else
| |||
ExtMABuffer[i]=ExponentialMA(i,InpStdDevPeriod,ExtMABuffer[i-1],price);
| |||
//--- Calculate StdDev
| |||
ExtStdDevBuffer[i]=StdDevFunc(price,ExtMABuffer,i);
| |||
}
| |||
break;
| |||
case MODE_SMMA :
| |||
for(int i=start; i<rates_total && !IsStopped(); i++)
| |||
{
| |||
if(i==InpStdDevPeriod-1)
| |||
ExtMABuffer[i]=SimpleMA(i,InpStdDevPeriod,price);
| |||
else
| |||
ExtMABuffer[i]=SmoothedMA(i,InpStdDevPeriod,ExtMABuffer[i-1],price);
| |||
//--- Calculate StdDev
| |||
ExtStdDevBuffer[i]=StdDevFunc(price,ExtMABuffer,i);
| |||
}
| |||
break;
| |||
case MODE_LWMA :
| |||
for(int i=start; i<rates_total && !IsStopped(); i++)
| |||
{
| |||
ExtMABuffer[i]=LinearWeightedMA(i,InpStdDevPeriod,price);
| |||
ExtStdDevBuffer[i]=StdDevFunc(price,ExtMABuffer,i);
| |||
}
| |||
break;
| |||
default :
| |||
for(int i=start; i<rates_total && !IsStopped(); i++)
| |||
{
| |||
ExtMABuffer[i]=SimpleMA(i,InpStdDevPeriod,price);
| |||
//--- Calculate StdDev
| |||
ExtStdDevBuffer[i]=StdDevFunc(price,ExtMABuffer,i);
| |||
}
| |||
}
| |||
//--- OnCalculate done. Return new prev_calculated.
| |||
return(rates_total);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Calculate Standard Deviation |
| |||
//+------------------------------------------------------------------+
| |||
double StdDevFunc(const double &price[],const double &ma_price[],const int position)
| |||
{
| |||
double dev=0.0;
| |||
for(int i=0; i<ExtStdDevPeriod; i++)
| |||
dev+=MathPow(price[position-i]-ma_price[position],2.0);
| |||
dev=MathSqrt(dev/ExtStdDevPeriod);
| |||
return(dev);
| |||
}
| |||
//+------------------------------------------------------------------+
|