Author: Copyright 2016, MetaQuotes Software Corp.
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
IndVol
//+------------------------------------------------------------------+
//|                                                       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