dayextremumzones

Author: Tapochun
0 Views
0 Downloads
0 Favorites
dayextremumzones
//+------------------------------------------------------------------+
//|                                             DayExtremumZones.mq5 |
//|                                                         Tapochun |
//|                         https://login.mql5.com/ru/users/tapochun |
//+------------------------------------------------------------------+
#property copyright "Tapochun"
#property link      "https://login.mql5.com/ru/users/tapochun"
#property version   "1.01"
#property indicator_chart_window
#property description "Èíäèêàòîð îòîáðàæàåò çîíû ìàêñèìóìîâ è ìèíèìóìîâ äíÿ â ïðîöåíòàõ îò äíåâíîãî äâèæåíèÿ."
#property description "Èñïîëüçóåò èíäèêàòîð DailySize https://www.mql5.com/ru/code/13323"
#property indicator_plots 2
#property indicator_buffers 4
//+------------------------------------------------------------------+
//| Ãëîáàëüíûå ïåðåìåííûå															|
//+------------------------------------------------------------------+
double bufW[];         // Çíà÷åíèÿ ìàêñèìóìîâ äíåâíîãî äèàïàçîíà
double bufX[];         // Ãðàíèöà çîíû ìàêñèìóìîâ/çíà÷åíèÿ ìèíèìóìîâ äíåâíîãî äèàïàçîíà

double bufY[];         // Çíà÷åíèÿ ìèíèìóìîâ äíåâíîãî äèàïàçîíà
double bufZ[];         // Ãðàíèöà çîíû ìèíèìóìîâ
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum ENUM_DW_TYPE   // Ïåðå÷èñëåíèå - äîñòóïíûå òèïû îòðèñîâêè
  {
   FILLING,         // Çàëèâêà
   HISTOGRAM2,      // Ãèñòîãðàììà
   LINE,            // Ëèíèè
   ARROW,           // Ñòðåëêè
   NONE             // Íå îòðèñîâûâàåòñÿ
  };

int globHandle;     // Õýíäë èíäèêàòîðà äíåâíûõ äèàïàçîíîâ (DailySize)
//+------------------------------------------------------------------+
//| Âõîäíûå ïàðàìåòðû																|
//+------------------------------------------------------------------+
input int inpUpZonePct = 15;                     // Ðàçìåð çîíû ìàêñèìóìîâ, % îò äíåâíîãî äâèæåíèÿ [0..50]
input int inpDnZonePct = 15;                     // Ðàçìåð çîíû ìèíèìóìîâ, % îò äíåâíîãî äâèæåíèÿ [0..50]
input ENUM_DW_TYPE inpDrawType=ARROW;            // Òèï îòðèñîâêè
input bool inpDrawInternalZone= true;            // Îòîáðàæàòü âíóòðåííþþ çîíó (äëÿ òèïîâ "Ëèíèÿ"/"Ñòðåëêè"/"Íå îòðèñîâûâàåòñÿ")
input bool inpShowData = false;                  // Îòîáðàæàòü çíà÷åíèÿ èíäèêàòîðà â îêíå äàííûõ
sinput string d1 = "";                           // Îáùèå íàñòðîéêè îòðèñîâêè
input int inpUpWidth = 1;                        // Òîëùèíà îòðèñîâêè çîíû ìàêñèìóìîâ
input int inpDnWidth = 1;                        // Òîëùèíà îòðèñîâêè çîíû ìèíèìóìîâ
input color inpUpColor= clrLightBlue;            // Öâåò îòðèñîâêè çîíû ìàêñèìóìîâ
input color inpDnColor = clrSpringGreen;         // Öâåò îòðèñîâêè çîíû ìèíèìóìîâ
sinput string d2 = "";                           // Íàñòðîéêè îòðèñîâêè òèïà "Ëèíèÿ"/"Ãèñòîãðàììà"
input ENUM_LINE_STYLE inpUpStyle = STYLE_DOT;    // Ñòèëü ëèíèè/çîíû ìàêñèìóìîâ
input ENUM_LINE_STYLE inpDnStyle = STYLE_DOT;    // Ñòèëü ëèíèè/çîíû ìèíèìóìîâ
sinput string d3 = "";                           // Íàñòðîéêè îòðèñîâêè òèïà "Ñòðåëêè"
input int inpUpArrowCode = 158;                  // Êîä ñòðåëîê çîíû ìàêñèìóìîâ (äëÿ òèïà "Ñòðåëêè")
input int inpDnArrowCode = 158;                  // Êîä ñòðåëîê çîíû ìèíèìóìîâ (äëÿ òèïà "Ñòðåëêè")
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Ïðîâåðêà ïðàâèëüíîñòè âõîäíûõ ïàðàìåòðîâ
   if(inpUpZonePct<0 || inpUpZonePct>50 || 
      inpDnZonePct<0 || inpDnZonePct>50)
     {
      Print(__FILE__,": ÎØÈÁÊÀ! Ðàçìåð çîí äîëæåí íàõîäèòüñÿ â äèàïàçîíå îò 0 äî 50%. Ïðîâåðüòå âõîäíûå ïàðàìåòðû!");
      return( INIT_PARAMETERS_INCORRECT );
     }
//---
   if(_Period>PERIOD_H2)
     {
      Print(__FILE__,": ÎØÈÁÊÀ! Èíäèêàòîð ïðåäíàçíà÷åí äëÿ ðàáîòû íà ÒÔ íå âûøå H2!");
      return( INIT_PARAMETERS_INCORRECT );
     }
//---
   if(( inpDrawType==FILLING || inpDrawType==HISTOGRAM2) &&
      (inpUpZonePct==0 || inpDnZonePct==0))
     {
      Print(__FILE__,": ÎØÈÁÊÀ! Îòðèñîâêà ñòèëåì 'Çàëèâêà' èëè 'Ãèñòîãðàììà' äîñòóïíà òîëüêî ïðè ðàçìåðàõ çîí > 0. Ïðîâåðüòå âõîäíûå ïàðàìåòðû!");
      return( INIT_PARAMETERS_INCORRECT );
     }
//--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû
   SetIndexBuffer(0,bufW,INDICATOR_DATA);
   SetIndexBuffer(1,bufX,INDICATOR_DATA);
//---
   SetIndexBuffer(2,bufY,INDICATOR_DATA);
   SetIndexBuffer(3,bufZ,INDICATOR_DATA);
//--- Óñòàíàâëèâàåì ïàðàìåòðû îòðèñîâêè
   switch(inpDrawType)
     {
      case FILLING:
         PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_FILLING);
         PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_FILLING);
         //---
         PlotIndexSetString(0,PLOT_LABEL,"dez: up;dez: upZone");
         PlotIndexSetString(1,PLOT_LABEL,"dez: dn;dez: dnZone");
         //---
         PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);
         PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);
         //---
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,inpUpColor);
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,inpUpColor);
         //---
         PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,inpDnColor);
         PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,inpDnColor);
         break;
      case HISTOGRAM2:
         PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM2);
         PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_HISTOGRAM2);
         //---
         PlotIndexSetString(0,PLOT_LABEL,"dez: up;dez: upZone");
         PlotIndexSetString(1,PLOT_LABEL,"dez: dn;dez: dnZone");
         //---
         PlotIndexSetInteger(0,PLOT_LINE_STYLE,inpUpStyle);
         PlotIndexSetInteger(1,PLOT_LINE_STYLE,inpDnStyle);
         break;
      case LINE:
         PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
         PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
         //---
         PlotIndexSetInteger(0,PLOT_LINE_STYLE,inpUpStyle);
         PlotIndexSetInteger(1,PLOT_LINE_STYLE,inpDnStyle);
         //---
         PlotIndexSetString(0,PLOT_LABEL,"dez: up");
         PlotIndexSetString(1,PLOT_LABEL,"dez: dn");
         //---
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,inpUpColor);
         PlotIndexSetInteger(1,PLOT_LINE_COLOR,inpDnColor);
         break;
      case ARROW:
         PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ARROW);
         PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_ARROW);
         //---
         PlotIndexSetInteger(0,PLOT_ARROW,inpUpArrowCode);
         PlotIndexSetInteger(1,PLOT_ARROW,inpDnArrowCode);
         //---
         PlotIndexSetString(0,PLOT_LABEL,"dez: up");
         PlotIndexSetString(1,PLOT_LABEL,"dez: dn");
         //---
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,inpUpColor);
         PlotIndexSetInteger(1,PLOT_LINE_COLOR,inpDnColor);
         break;
      case NONE:
         PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE);
         PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE);
         //---
         PlotIndexSetString(0,PLOT_LABEL,"dez: up");
         PlotIndexSetString(1,PLOT_LABEL,"dez: dn");
         break;
      default:
         Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï îòðèñîâêè: "+EnumToString(inpDrawType));
         return( INIT_FAILED );
     }
//--- Óñòàíàâëèâàåì òîëùèíó
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,inpUpWidth);
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,inpDnWidth);
//--- Óñòàíàâëèâàåì ïóñòûå çíà÷åíèÿ áóôåðîâ
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- Óñòàíàâëèâàåì òî÷íîñòü çíà÷åíèé èíäèêàòîðà
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- Óñòàíàâëèâàåì âèäèìîñòü çíà÷åíèé â îêíå äàííûõ
   PlotIndexSetInteger(0,PLOT_SHOW_DATA,inpShowData);
   PlotIndexSetInteger(1,PLOT_SHOW_DATA,inpShowData);
//--- Ïîëó÷àåì õýíäëû èñïîëüçóåìûõ èíäèêàòîðîâ
   bool answer=InitializeIndicatorHandle(globHandle);
   if( !answer ) return( INIT_FAILED );
//---
   return( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Ïðîâåðêà íàëè÷èÿ äàííûõ
   if( rates_total <= 0 ) return( 0 );
//---
   static int dNum;                         // Íîìåð ïðîâåðÿåìîãî äíÿ
   static double dHigh = 0.0;               // Ìàêñèìóì äíÿ
   static double dLow = DBL_MAX;            // Ìèíèìóì äíÿ
//---
   bool answer;                             // Îòâåò ôóíêöèè ïîëó÷åíèÿ äàííûõ
   int firstBar = rates_total-2;            // Íîìåð ïåðâîãî àíàëèçèðóåìîãî áàðà
   int firstInd = 0;                        // Íîìåð ïåðâîãî ýëåìåíòà â ìàññèâå çíà÷åíèé èíäèêàòîðà
   double sizes[];                          // Ìàññèâ - ïðèåìíèê ðàçìåðîâ äíåâíûõ äèàïàçîíîâ
//---
   if(prev_calculated!=0) // Åñëè íå ïåðâûé çàïóñê
     {
      if(rates_total>prev_calculated) // Åñëè îáðàçîâàëàñü íîâàÿ ñâå÷à
        {
         //--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû íà÷àëüíûìè çíà÷åíèÿìè
         const int n=rates_total-1;         // Îáíóëÿåìûé èíäåêñ ìàññèâà
         bufW[ n ] = EMPTY_VALUE;
         bufX[ n ] = EMPTY_VALUE;
         bufY[ n ] = EMPTY_VALUE;
         bufZ[ n ] = EMPTY_VALUE;
         //--- Ïîëó÷àåì äàííûå ïî èíäèêàòîðó ðàçìåðîâ äíåâíîãî äèàïàçîíà
         answer=GetIndicatorData(globHandle,0,1,1,sizes,"DailySize");
         if( !answer ) return( prev_calculated );
        }
      else return(prev_calculated);         // Åñëè íå îáðàçîâàëàñü - âûõîäèì
     }
   else                                     // Åñëè ïåðâûé çàïóñê
     {
      //--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû íà÷àëüíûìè çíà÷åíèÿìè
      ArrayInitialize(bufW,EMPTY_VALUE);
      ArrayInitialize(bufX,EMPTY_VALUE);
      ArrayInitialize(bufY,EMPTY_VALUE);
      ArrayInitialize(bufZ,EMPTY_VALUE);
      //--- Îïðåäåëÿåì íîìåð áàðà ïåðâîãî ïîëíîñòüþ äîñòóïíîãî äíÿ
      firstBar=GetFirstBar(time,rates_total,dNum);
      if( firstBar == 0 ) return( prev_calculated );
      //--- Ïåðâûé àíàëèçèðóåìûé ýëåìåíò â ìàññèâå äàííûõ èíäèêàòîðà äíåâíûõ äèàïàçîíîâ
      firstInd=firstBar;
      //--- Ïîëó÷àåì äàííûå ïî èíäèêàòîðó ðàçìåðîâ äíåâíîãî äèàïàçîíà
      answer=GetIndicatorData(globHandle,0,0,rates_total,sizes,"DailySize");
      if( !answer ) return( prev_calculated );
     }
//---
   int iNum;                                    // Íîìåð äíÿ íà i áàðå  
   for(int i=firstBar,j=firstInd; i<rates_total-1; i++,j++)
     {
      iNum=GetDayNumber(time[i]);         // Ïîëó÷àåì íîìåð äíÿ íà i áàðå
      if(dNum!=iNum) // Åñëè ñ÷èòàåòñÿ íîâûé äåíü
        {
         //--- Ñáðàñûâàåì ïàðàìåòðû äíÿ
         dNum = iNum;                           // Çàïîìèíàåì íîâûé íîìåð ïðîâåðÿåìîãî äíÿ
         dHigh = high[ i ];                     // Çàïîìèíàåì ìàêñèìóì i ñâå÷è
         dLow= low[ i ];                        // Çàïîìèíàåì ìèíèìóì i ñâå÷è
        }
      else                                     // Åñëè ñ÷èòàåòñÿ òåêóùèé äåíü
        {
         //--- Ïðîâåðÿåì îáðàçîâàíèå íîâîãî ìèíèìóìà/ìàêñèìóìà äíÿ
         if( high[ i ] > dHigh )                // Åñëè ìàêñèìóì íà i ñâå÷å áîëüøå ñîõðàíåííîãî
            dHigh = high[ i ];                  // Çàïîìèíàåì íîâîå çíà÷åíèå ìàêñèìóìà òåêóùåãî äíÿ

         if( low[ i ] < dLow )                   // Åñëè ìèíèìóì íà i ñâå÷å ìåíüøå ñîõðàíåííîãî
            dLow = low[ i ];                     // Çàïîìèíàåì íîâîå çíà÷åíèå ìèíèìóìà òåêóùåãî äíÿ
        }
      //---
      switch(inpDrawType) // Â çàâèñèìîñòè îò òèïà îòðèñîâêè
        {
         case FILLING:                           // Òèï - çàëèâêà
         case HISTOGRAM2:                        // Òèï - ãèñòîãðàììà
            bufW[i]=dHigh;                                             // Çíà÷åíèå ìàêñèìóìà
            bufX[i]=bufW[i]-sizes[j]*inpUpZonePct/100*_Point;   // Çíà÷åíèå çîíû ìàêñèìóìà
            //---
            bufY[ i ] = dLow;                                             // Çíà÷åíèå ìèíèìóìà
            bufZ[ i ] = bufY[ i ] + sizes[ j ]*inpDnZonePct/100*_Point;   // Çíà÷åíèå çîíû ìèíèìóìà
            break;
         case LINE:                              // Òèï - ëèíèÿ
         case ARROW:                           // Òèï - ñòðåëêè
         case NONE:                              // Òèï - áåç îòîáðàæåíèÿ
            if(inpDrawInternalZone) // Åñëè óñòàíîâëåíà íàñòðîéêà îòîáðàæåíèÿ âíóòðåííåé çîíû
              {
               bufW[ i ]= dHigh-sizes[ j ]*inpUpZonePct/100*_Point;      // Çíà÷åíèå çîíû ìàêñèìóìà
               bufX[ i ] = dLow+sizes[ j ]*inpDnZonePct/100*_Point;      // Çíà÷åíèå çîíû ìèíèìóìà
              }
            else                               // Åñëè íàñòðîéêà íå óñòàíîâëåíà
              {
               bufW[ i ]= dHigh;               // Çíà÷åíèå ìàêñèìóìà
               bufX[ i ] = dLow;               // Çíà÷åíèå ìèíèìóìà
              }
            break;
         default:
            Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï îòðèñîâêè: "+EnumToString(inpDrawType));
            return( rates_total );
        }
     }
//---
   return( rates_total );
  }
//+------------------------------------------------------------------+
//| Ïîëó÷àåì äàííûå èíäèêàòîðíîãî áóôåðà										|
//+------------------------------------------------------------------+
bool GetIndicatorData(const int handle,           // Õýíäë èíäèêàòîðà
                      const int bufferNum,        // Íîìåð áóôåðà äëÿ êîïèðîâàíèÿ
                      const int startPos,         // Ñòàðòîâàÿ ïîçèöèÿ äëÿ êîïèðîâàíèÿ
                      const int count,            // Ñêîëüêî ýëåìåíòîâ êîïèðóåì
                      double &array[],            // Ìàññèâ ïðèåìíèê (out)
                      string strIndName = ""      // Èìÿ èíäèêàòîðà (äëÿ ñîîáùåíèÿ îá îøèáêå)
                      )
  {
   int num=CopyBuffer(handle,bufferNum,startPos,count,array);      // Êîïèðóåì äàííûå
   if(num==-1) // Åñëè ïðîèçîøëà îøèáêà êîïèðîâàíèÿ
     {
      Print(__FUNCTION__,": ÎØÈÁÊÀ #",GetLastError(),". Äàííûå èíäèêàòîðà "+strIndName+" íå ïîëó÷åíû. Ñêîïèðîâàíî ýëåìåíòîâ: ",num);
      return(false);                                                      // Âîçâðàùàåì ëîæü
     }
   return(true);                                                         // Åñëè äàííûå ñêîïèðîâàíû - âîçâðàùàåì èñòèíó
  }
//+------------------------------------------------------------------+
//| Ïîëó÷àåì íîìåð ïåðâîãî áàðà ïîëíîñòüþ äîñòóïíîãî äíÿ					|
//+------------------------------------------------------------------+
int GetFirstBar(const datetime &time[],     // Ìàññèâ âðåìåí îòêðûòèÿ áàðîâ ïî òåêóùåìó ÒÔ
                const int rates_total,      // Êîëè÷åñòâî ïðîñ÷èòàííûõ áàðîâ
                int &dayNum                 // Íîìåð ïðîâåðÿåìîãî äíÿ (out)
                )
  {
   int prev = GetDayNumber( time[ 0 ] );    // Íîìåð äíÿ íà ïðåäûäóùåì áàðå
   int curr;                                // Íîìåð äíÿ íà òåêóùåì áàðå
   for(int i=1; i<rates_total; i++) // Öèêë ïî ïðîñ÷èòàííûõ áàðàì
     {
      curr = GetDayNumber( time[ i ] );     // Îïðåäåëÿåì íîìåð äíÿ íà òåêóùåì áàðå
      if( curr == prev) continue;           // Åñëè íîìåðà ñîâïàäàþþò - ïåðåõîäèì ê ñëåä. áàðó
      else                                  // Åñëè íîìåðà íå ñîâïàäàþò
        {
         dayNum = curr;                     // Çàïîìèíàåì íîìåð ïåðâîãî ïðîâåðÿåìîãî äíÿ
         return( i );                       // Âîçâðàùàåì íîìåð áàðà ïåðâîãî ïîëíîãî äíÿ
        }
     }
//---
   Print(__FUNCTION__,": Îæèäàåì áîëüøå äàííûõ..");
   return(0);                             // Âîçâðàùàåì 0
  }
//+------------------------------------------------------------------+
//| Îïðåäåëÿåì íîìåð äíÿ ïî âðåìåíè	áàðà										|
//+------------------------------------------------------------------+
int GetDayNumber(const datetime time) // Âðåìÿ áàðà
  {
   MqlDateTime tStr;                        // Ñòðóêòóðà âðåìåíè
   TimeToStruct( time, tStr );              // Âðåìÿ â ñòðóêòóðó
   return( tStr.day );                      // Âîçâðàùàåì íîìåð òåêóùåãî äíÿ
  }
//+------------------------------------------------------------------+
//| Èíèöèàëèçèðóåì õýíäë èíäèêàòîðà äíåâíûõ äèàïàçîíîâ					|
//+------------------------------------------------------------------+
bool InitializeIndicatorHandle(int &handle) // Õýíäë èíäèêàòîðà (out)
  {
   handle=iCustom(_Symbol,_Period,"DailySize");   // Ïîïûòêà ïîëó÷åíèÿ õýíäëà..
   if(handle==INVALID_HANDLE) // Åñëè õýíäë íå ïîëó÷åí
     {
      Print(__FUNCTION__,": ÎØÈÁÊÀ #",_LastError,". Õýíäë èíäèêàòîðà DailySize íå ïîëó÷åí!");
      return(false);                                    // Âûõîäèì ñ îøèáêîé
     }
   else return(true);                                 // Åñëè õýíäë ïîëó÷åí - âîçâðàùàåì èñòèíó
  }
//+------------------------------------------------------------------+

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 ---