//+------------------------------------------------------------------+
//| IndVol.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
input bool AllHistory=false;
input datetime StartPeriod = D'2016.01.01 00:00';
input datetime EndPeriod = D'2016.06.01 00:00';
input int showText = 1000;
input int fontSize = 7;
input color colText = clrRed;
input int shift = 10;
double hilo[];
double hiop[];
double oplo[];
double sumHiLo, sumHiOp, sumOpLo;
int st, en;
bool firsthist = true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
if(StartPeriod>EndPeriod) {
Alert("StartPeriod äîëæåí áûòü ìåíüøå EndPeriod");
return(INIT_PARAMETERS_INCORRECT);
}
ArrayInitialize(hilo,0.0);
ArrayInitialize(hiop,0.0);
ArrayInitialize(oplo,0.0);
sumHiLo = 0.0; sumHiOp = 0.0; sumOpLo = 0.0;
//---
return(INIT_SUCCEEDED);
}
//####################################################################
void OnDeinit(const int reason)
{
//---
ObjectsDeleteAll(0);
Comment("");
}
//+------------------------------------------------------------------+
//| 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[])
{
bool nbar = false;
if(rates_total>prev_calculated) nbar=true;
int limit = rates_total-prev_calculated;
if(limit==0) limit=1;
if(AllHistory) {
if(nbar) { // new bar
st = rates_total-1;
en = 0;
ArrayResize(hilo, rates_total);
ArrayResize(hiop, rates_total);
ArrayResize(oplo, rates_total);
}
for(int i=limit-1; i>=0; i--) {
hilo[i] = (High[i]-Low[i])/_Point;
hiop[i] = (High[i]-Open[i])/_Point;
oplo[i] = (Open[i]-Low[i])/_Point;
if(nbar && i!=0) {
sumHiLo += hilo[i];
sumHiOp += hiop[i];
sumOpLo += oplo[i];
}
if(i-en<=showText) {
createText("IndVol_hilo_"+TimeToString(Time[i]),DoubleToString(hilo[i],0),Time[i],High[i]+(shift*2.0*_Point),colText);
createText("IndVol_hiop_"+TimeToString(Time[i]),DoubleToString(hiop[i],0),Time[i],High[i]+(shift*_Point),colText);
createText("IndVol_oplo_"+TimeToString(Time[i]),DoubleToString(oplo[i],0),Time[i],Low[i]-(shift*_Point),colText);
}
}
Comment("StartPeriod: "+TimeToString(Time[st])+" EndPeriod: "+TimeToString(Time[en])+"\n"+
"Êîëè÷åñòâî áàðîâ: "+IntegerToString(st-en)+"\n"+
"Ñðåäíåå Àðèôìåòè÷åñêîå Hi-Lo: "+avgHiLo(st-en)+"\n"+
"Ñðåäíåå Àðèôìåòè÷åñêîå Hi-Op: "+avgHiOp(st-en)+"\n"+
"Ñðåäíåå Àðèôìåòè÷åñêîå Op-Lo: "+avgOpLo(st-en)
);
}
else if(firsthist) {
st = iBarShift(_Symbol,_Period,StartPeriod);
en = iBarShift(_Symbol,_Period,EndPeriod);
ArrayResize(hilo, rates_total);
ArrayResize(hiop, rates_total);
ArrayResize(oplo, rates_total);
for(int i=st; i>=en; i--) {
hilo[i] = (High[i]-Low[i])/_Point;
hiop[i] = (High[i]-Open[i])/_Point;
oplo[i] = (Open[i]-Low[i])/_Point;
sumHiLo += hilo[i];
sumHiOp += hiop[i];
sumOpLo += oplo[i];
if(i-en<=showText) {
createText("IndVol_hilo_"+TimeToString(Time[i]),DoubleToString(hilo[i],0),Time[i],High[i]+(shift*2.0*_Point),colText);
createText("IndVol_hiop_"+TimeToString(Time[i]),DoubleToString(hiop[i],0),Time[i],High[i]+(shift*_Point),colText);
createText("IndVol_oplo_"+TimeToString(Time[i]),DoubleToString(oplo[i],0),Time[i],Low[i]-(shift*_Point),colText);
}
}
Comment("StartPeriod: "+TimeToString(Time[st])+" EndPeriod: "+TimeToString(Time[en])+"\n"+
"Êîëè÷åñòâî áàðîâ: "+IntegerToString(st-en)+"\n"+
"Ñðåäíåå Àðèôìåòè÷åñêîå Hi-Lo: "+avHiLo(st-en)+"\n"+
"Ñðåäíåå Àðèôìåòè÷åñêîå Hi-Op: "+avHiOp(st-en)+"\n"+
"Ñðåäíåå Àðèôìåòè÷åñêîå Op-Lo: "+avOpLo(st-en)
);
firsthist = false;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
void createText(string name, string text, datetime time1, double price1, color col) {
ObjectCreate(0,name,OBJ_TEXT,0,0,0);
ObjectSetInteger(0,name,OBJPROP_TIME1,time1);
ObjectSetDouble(0,name,OBJPROP_PRICE1,price1);
ObjectSetInteger(0,name,OBJPROP_COLOR,col);
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontSize);
ObjectSetString(0,name,OBJPROP_TEXT,text);
ObjectSetString(0,name,OBJPROP_FONT,"Arial");
}
//####################################################################
string avgHiLo(int range) {
double sum = sumHiLo + hilo[0];
double avg = 0.0;
if(range>0) avg = sum/(range);
return DoubleToString(avg,2);
}
string avgHiOp(int range) {
double sum = sumHiOp + hiop[0];
double avg = 0.0;
if(range>0) avg = sum/(range);
return DoubleToString(avg,2);
}
string avgOpLo(int range) {
double sum = sumOpLo + oplo[0];
double avg = 0.0;
if(range>0) avg = sum/(range);
return DoubleToString(avg,2);
}
string avHiLo(int range) {
double avg = 0.0;
if(range>0) avg = sumHiLo/(range);
return DoubleToString(avg,2);
}
string avHiOp(int range) {
double avg = 0.0;
if(range>0) avg = sumHiOp/(range);
return DoubleToString(avg,2);
}
string avOpLo(int range) {
double avg = 0.0;
if(range>0) avg = sumOpLo/(range);
return DoubleToString(avg,2);
}
//####################################################################
Comments