132 lines
11 KiB
Plaintext
132 lines
11 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| Volatility.mq5 |
|
|
//| Copyright © 2009, Trofimov Evgeniy Vitalyevich |
|
|
//| http://TrofimovVBA.narod.ru/ |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright © 2009, Trofimov Evgeniy Vitalyevich"
|
|
#property link "http://TrofimovVBA.narod.ru/"
|
|
//---- indicator version number
|
|
#property version "1.00"
|
|
//---- drawing indicator in a separate window
|
|
#property indicator_separate_window
|
|
//---- number of indicator buffers
|
|
#property indicator_buffers 1
|
|
//---- only one plot is used
|
|
#property indicator_plots 1
|
|
//+-----------------------------------+
|
|
//| Indicator drawing parameters |
|
|
//+-----------------------------------+
|
|
//---- drawing the indicator as a line
|
|
#property indicator_type1 DRAW_LINE
|
|
//---- red color is used as the color of the bullish line of the indicator
|
|
#property indicator_color1 clrRed
|
|
//---- the indicator line is a continuous curve
|
|
#property indicator_style1 STYLE_SOLID
|
|
//---- indicator line width is equal to 1
|
|
#property indicator_width1 1
|
|
//---- displaying the indicator label
|
|
#property indicator_label1 "Volatility"
|
|
//+-----------------------------------+
|
|
//| INDICATOR INPUT PARAMETERS |
|
|
//+-----------------------------------+
|
|
input uint N=12; // channel period
|
|
input int Shift=0; // horizontal shift of the indicator in bars
|
|
//+-----------------------------------+
|
|
//---- indicator buffer
|
|
double IndBuffer[];
|
|
//---- Declaration of integer variables of data starting point
|
|
int min_rates_total;
|
|
|
|
//
|
|
|
|
#include <AZ-INVEST/CustomBarConfig.mqh>
|
|
|
|
//
|
|
//+------------------------------------------------------------------+
|
|
//| Volatility indicator initialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnInit()
|
|
{
|
|
//---- Initialization of variables of the start of data calculation
|
|
min_rates_total=int(N);
|
|
|
|
//---- set dynamic array as an indicator buffer
|
|
SetIndexBuffer(0,IndBuffer,INDICATOR_DATA);
|
|
//---- shifting the indicator horizontally by Shift
|
|
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
|
|
//---- performing the shift of beginning of indicator drawing
|
|
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- setting the indicator values that won't be visible on a chart
|
|
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
|
//---- indexing elements in the buffer as time series
|
|
ArraySetAsSeries(IndBuffer,true);
|
|
|
|
//---- initializations of variable for indicator short name
|
|
string shortname="Volatility("+string(N)+")";
|
|
//--- creation of the name to be displayed in a separate sub-window and in a pop up help
|
|
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
|
|
//--- determining the accuracy of displaying the indicator values
|
|
IndicatorSetInteger(INDICATOR_DIGITS,0);
|
|
//---- end of initialization
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Volatility iteration function |
|
|
//+------------------------------------------------------------------+
|
|
int OnCalculate(
|
|
const int rates_total, // amount of history in bars at the current tick
|
|
const int prev_calculated,// amount of history in bars at the previous tick
|
|
const datetime &time[],
|
|
const double &open[],
|
|
const double& high[], // price array of maximums of price for the calculation of indicator
|
|
const double& low[], // price array of price lows for the indicator calculation
|
|
const double &close[],
|
|
const long &tick_volume[],
|
|
const long &volume[],
|
|
const int &spread[]
|
|
)
|
|
{
|
|
//---- checking the number of bars to be enough for calculation
|
|
if(rates_total<min_rates_total) return(0);
|
|
|
|
//---- declaration of variables with a floating point
|
|
double HH,LL;
|
|
//---- Declaration of integer variables
|
|
int limit;
|
|
|
|
//
|
|
// Process data through MedianRenko indicator
|
|
//
|
|
|
|
if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close))
|
|
return(0);
|
|
|
|
if(!customChartIndicator.BufferSynchronizationCheck(close))
|
|
return(0);
|
|
|
|
int _prev_calculated = customChartIndicator.GetPrevCalculated();
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
//---- calculation of the starting number limit for the bar recalculation loop
|
|
if(_prev_calculated>rates_total || _prev_calculated<=0)// checking for the first start of the indicator calculation
|
|
limit=rates_total-min_rates_total-1; // starting index for the calculation of all bars
|
|
else limit=rates_total-_prev_calculated; // starting index for calculation of new bars only
|
|
|
|
//---- indexing elements in arrays as timeseries
|
|
ArraySetAsSeries(customChartIndicator.High,true);
|
|
ArraySetAsSeries(customChartIndicator.Low,true);
|
|
|
|
//---- main indicator calculation loop
|
|
for(int bar=limit; bar>=0 && !IsStopped(); bar--)
|
|
{
|
|
HH=customChartIndicator.High[ArrayMaximum(customChartIndicator.High,bar,N)];
|
|
LL=customChartIndicator.Low [ArrayMinimum(customChartIndicator.Low, bar,N)];
|
|
IndBuffer[bar]=(HH-LL)/(_Point*N);
|
|
}
|
|
//----
|
|
return(rates_total);
|
|
}
|
|
//+------------------------------------------------------------------+
|