WmiVol_Pluse

Author: Copyright 2014, Murad Ismayilov
0 Views
0 Downloads
0 Favorites
WmiVol_Pluse
//+---------------------------------------------------------------------+ 
//|                                                    WmiVol_Pluse.mq5 | 
//|                                     Copyright 2014, Murad Ismayilov | 
//|                                  http://www.mql4.com/ru/users/wmlab | 
//+---------------------------------------------------------------------+ 
#property copyright "Copyright 2014, Murad Ismayilov"
#property link      "http://www.mql4.com/ru/users/wmlab" 
//---- íîìåð âåðñèè èíäèêàòîðà
#property version   "1.00"
//---- îòðèñîâêà èíäèêàòîðà â îòäåëüíîì îêíå
#property indicator_separate_window 
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ 2
#property indicator_buffers 2 
//---- èñïîëüçîâàíî âñåãî îäíî ãðàôè÷åñêîå ïîñòðîåíèå
#property indicator_plots   1
//+-----------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà   |
//+-----------------------------------+
//---- îòðèñîâêà èíäèêàòîðà â âèäå ÷åòûð¸õöâåòíîé ãèñòîãðàììû
#property indicator_type1 DRAW_COLOR_HISTOGRAM
//---- â êà÷åñòâå öâåòîâ ÷åòûð¸õöâåòíîé ãèñòîãðàììû èñïîëüçîâàíû
#property indicator_color1 clrDodgerBlue,clrMagenta
//---- ëèíèÿ èíäèêàòîðà - ñïëîøíàÿ
#property indicator_style1 STYLE_SOLID
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
#property indicator_width1 2
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1 "WmiVol_Pluse"

#property indicator_maximum    1.1
#property indicator_minimum    0.0
//+-----------------------------------+
//|  ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ     |
//+-----------------------------------+
input ENUM_TIMEFRAMES TimeFrame=PERIOD_D1;         //Òàéìôðåéì
//+-----------------------------------+
//---- Îáúÿâëåíèå öåëûõ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
int min_rates_total;
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â 
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double IndBuffer[],ColorIndBuffer[];
double barVols[],avgVol;
int barsInDay,barCounts[];
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå òàéìôðåéìà â âèäå ñòðîêè                               |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
  {return(StringSubstr(EnumToString(timeframe),7,-1));}
//+------------------------------------------------------------------+    
//| WmiVol_Pluse indicator initialization function                   | 
//+------------------------------------------------------------------+  
int OnInit()
  {
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
   if(Period()>=TimeFrame) 
     {
      Print(__FUNCTION__+"(): Ïåðèîä ãðàôèêà äîëæåí áûòü ìåíüøå, ÷åì "+GetStringTimeframe(TimeFrame));
      Print(__FUNCTION__+"(): Ñëåäóåò óìåíüøèòü ïåðèîä ãðàôèêà ëèáî óâåëè÷èòü çíà÷åíèå âõîäíîãî ïàðàìåòðà èíäèêàòîðà <<TimeFrame>>!");
      return(INIT_FAILED);
     }
   barsInDay=PeriodSeconds(TimeFrame)/(PeriodSeconds(PERIOD_CURRENT));
   if(!barsInDay) return(INIT_FAILED);
   min_rates_total=barsInDay;

//---- Ðàñïðåäåëåíèå ïàìÿòè ïîä ìàññèâû ïåðåìåííûõ  
   if(ArrayResize(barCounts,barsInDay)<barsInDay) 
     {
      Print("Íå óäàëîñü ðàñïðåäåëèòü ïàìÿòü ïîä ìàññèâ barCounts[]");
      return(INIT_FAILED);
     }
   if(ArrayResize(barVols,barsInDay)<barsInDay)
     {
      Print("Íå óäàëîñü ðàñïðåäåëèòü ïàìÿòü ïîä ìàññèâ barVols[]");
      return(INIT_FAILED);
     }
//---- Èíèöèàëèçàöèÿ ìàññèâîâ ïåðåìåííûõ
   ArrayInitialize(barCounts,0);
   ArrayInitialize(barVols,0.0);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà IndBuffer â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(0,IndBuffer,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â öâåòîâîé, èíäåêñíûé áóôåð   
   SetIndexBuffer(1,ColorIndBuffer,INDICATOR_COLOR_INDEX);

//---- èíèöèàëèçàöèè ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
   string shortname;
   StringConcatenate(shortname,"WmiVol_Pluse(",GetStringTimeframe(TimeFrame),")");
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
   
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- çàâåðøåíèå èíèöèàëèçàöèè
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+  
//| WmiVol_Pluse 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[])
  {
//---- Ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü äëÿ ðàñ÷¸òà
   if(rates_total<min_rates_total) return(0);

///---- îáúÿâëåíèÿ ëîêàëüíûõ ïåðåìåííûõ 
   int first,bar;
   double;

//---- ðàñ÷¸ò ñòàðòîâîãî íîìåðà first äëÿ öèêëà ïåðåñ÷¸òà áàðîâ è èíèöèàëèçàöèÿ ïåðåìåííûõ â áëîêå OnCalculate 
   if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
     {
      first=0;
      for(bar=rates_total-1; bar>0; bar--)
        {
         int barOfDay=iBarOfDay(time[bar]);
         barVols[barOfDay]+=high[bar]-low[bar];
         barCounts[barOfDay]++;
        }
      for(bar=0; bar<barsInDay; bar++) if(barCounts[bar]) barVols[bar]/=barCounts[bar];
      double minVol=barVols[ArrayMinimum(barVols)];
      double maxVol=barVols[ArrayMaximum(barVols)];
      avgVol=0.0;
      for(bar=0; bar<barsInDay; bar++) if(maxVol>minVol) avgVol+=barVols[bar]=(barVols[bar]-minVol)/(maxVol-minVol);
      avgVol/=barsInDay;  
     }
   else first=prev_calculated-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà íîâûõ áàðîâ

//---- Îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà
   for(bar=first; bar<rates_total && !IsStopped(); bar++)
     {
      int barOfDay=iBarOfDay(time[bar]);
      double vol=barVols[barOfDay];
      IndBuffer[bar]=vol;
      if(vol>=avgVol) ColorIndBuffer[bar]=0;
      else ColorIndBuffer[bar]=1;
     }
//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|  iBarOfDay()                                                     |
//+------------------------------------------------------------------+
int iBarOfDay(datetime timeOpenBar) 
  {
//----
   int minutesInPeriod=PeriodSeconds()/60;
   double minutesSinceMidnight=MathMod(timeOpenBar/60,PeriodSeconds(TimeFrame)/60);
   int barsSinceMidnight=(int)MathFloor(minutesSinceMidnight/minutesInPeriod);
//----
   return (barsSinceMidnight);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---