candlesizes

Author: Tapochun
0 Views
0 Downloads
0 Favorites
candlesizes
//+------------------------------------------------------------------+
//|                                                  ÑandleSizes.mq5 |
//|                                                         Tapochun |
//|                         https://login.mql5.com/ru/users/tapochun |
//+------------------------------------------------------------------+
#property copyright "Tapochun"
#property link      "https://login.mql5.com/ru/users/tapochun"
#property version   "1.00"
#property indicator_separate_window
//---
#property indicator_plots 2
#property indicator_buffers 3
#property indicator_minimum 0
//---
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_label1 "CandleSize"
//---
#property indicator_type2 DRAW_LINE
#property indicator_label2 "csAverage"
//+------------------------------------------------------------------+
//| Ãëîáàëüíûå ïåðåìåííûå                                            |
//+------------------------------------------------------------------+
double bufSize[];               // Áóôåð çíà÷åíèé
double bufSizeClr[];            // Áóôåð öâåòà
double bufAverage[];            // Áóôåð ñðåäíèõ çíà÷åíèé
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum ENUM_CONSTRUCTION_TYPE  // Òèï ïîñòðîåíèÿ
  {
   upper_shadows,            // Âåðõíèå òåíè
   lower_shadows,            // Íèæíèå òåíè
   bodies                    // Òåëà
  };
//+------------------------------------------------------------------+
//| Âõîäíûå ïàðàìåòðû                                                |
//+------------------------------------------------------------------+
input ENUM_CONSTRUCTION_TYPE inpType = upper_shadows;  // Òèï ïîñòðîåíèÿ èíäèêàòîðà
input color inpClr = clrLime;                          // Öâåò ïîñòðîåíèÿ
input color inpNeutralClr=clrGray;                     // Íåéòðàëüíûé öâåò
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- ÒÔ ä.á. íå áîëüøå Í2
   if(_Period>PERIOD_H2) // Åñëè ÒÔ > Í2
     {
      Print(__FUNCTION__,": ÂÍÈÌÀÍÈÅ! Èíäèêàòîð ïðåäíàçíà÷åí äëÿ ðàáîòû íà ÒÔ íèæå Í2");
      return(INIT_FAILED); // Âûõîäèì ñ îøèáêîé
     }
//--- Óñòàíàâëèâàåì ïàðàìåòðû èíäèêàòîðà
   SetIndicatorParameters(inpType,inpClr,inpNeutralClr);
//---
   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 int dCount = 0;                 // Êîëè÷åñòâî îáðàçîâàííûõ ñâå÷åé çà òåêóùèé äåíü
   static int dSum=0;                     // Ñóììà ñîîòâåòñòâóþùèõ ðàçìåðîâ ñâå÷åé çà òåêóùèé äåíü
//---
   if(prev_calculated!=0) // Åñëè íå ïåðâûé çàïóñê
     {
      int n;                          // Íîìåð ïðîâåðÿåìîé ñâå÷è
      if(rates_total>prev_calculated) // Åñëè îáðàçîâàëñÿ íîâûé áàð
        {
         //--- Ñáðàñûâàåì çíà÷åíèå íà íóëåâîì áàðå
         bufSize[rates_total-1]=0.0;
         bufAverage[rates_total-1]=bufAverage[rates_total-2];
         //---
         n=rates_total-2;                  // Íîìåð ñôîðìèðîâàííîé ñâå÷è
         //--- Ðàñ÷åò èíäèêàòîðà íà ñôîðìèðîâàâøåéñÿ ñâå÷å
         Calculation_bar(inpType,n,dCount,dSum,time,high,low,open,close);
         //--- Ïðîâåðÿåì îáðàçîâàíèå íîâîãî äíÿ
         CheckNewDay(time[n+1],dNum,dCount,dSum);
        }
      else                                 // Åñëè òåêóùèé áàð
        {
         n=rates_total-1;                  // Íîìåð òåêóùåé ñâå÷è
         //--- Ðàññ÷èòûâàåì èíäèêàòîð íà òåêóùåé ñâå÷å
         Calculation(inpType,n,dCount+1,dSum,time[n],high[n],low[n],open[n],close[n]);
        }
     }
   else                                    // Åñëè ïåðâûé çàïóñê
     {
      //--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû íà÷àëüíûìè çíà÷åíèÿìè
      ArrayInitialize(bufSize,0.0);
      ArrayInitialize(bufAverage,0.0);
      //--- Îïðåäåëÿåì íîìåð áàðà ïåðâîãî ïîëíîñòüþ äîñòóïíîãî äíÿ
      int first = GetFirstBar( time, rates_total, dNum );
      if( first == 0 ) return( 0 );
      //--- Ðàñ÷åò èíäèêàòîðà íà èñòîðèè
      for(int i=first; i<rates_total-1; i++)
        {
         //--- Ðàñ÷åò çíà÷åíèé (ïî áàðàì)
         Calculation_bar(inpType,i,dCount,dSum,time,high,low,open,close);
         //--- Ïðîâåðÿåì îáðàçîâàíèå íîâîãî äíÿ
         CheckNewDay(time[i+1],dNum,dCount,dSum);
        }
     }
//---
   return( rates_total );
  }
//+------------------------------------------------------------------+
//| Îïðåäåëÿåì òèï ñâå÷è                                             |
//+------------------------------------------------------------------+
int GetCandleType(const double open,  // Öåíà îòêðûòèÿ ñâå÷è
                  const double close) // Öåíà çàêðûòèÿ ñâå÷è
  {
   if( open > close ) return( 1 );    // Åñëè öåíà îòêðûòèÿ âûøå öåíû çàêðûòèÿ - íèñõîäÿùàÿ
   else               return( 0 );    // Åñëè íàîáîðîò - âîñõîäÿùàÿ
  }
//+------------------------------------------------------------------+
//| Óñòàíàâëèâàåì ïàðàìåòðû èíäèêàòîðà                               |
//+------------------------------------------------------------------+
bool SetIndicatorParameters(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
                            const color clr,                   // Öâåò ýëåìåíòîâ
                            const color neutralClr)            // Íåéòðàëüíûé öâåò
  {
//--- Ïðèñâàèâàåì èíäåêñû èíäèêàòîðíûì áóôåðàì
   SetIndexBuffer(0,bufSize);
   SetIndexBuffer(1,bufSizeClr,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,bufAverage);
//--- Óñòàíàâëèâàåì òî÷íîñòü çíà÷åíèé èíäèêàòîðà
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- Óñòàíàâëèâàåì ïóñòûå çíà÷åíèÿ ãðàôè÷åñêèõ ñåðèé
   PlotIndexSetDouble( 0, PLOT_EMPTY_VALUE, EMPTY_VALUE );   // Ãèñòîãðàììû
   PlotIndexSetDouble( 1, PLOT_EMPTY_VALUE, EMPTY_VALUE );   // Ñðåäíåé ëèíèè
//--- Óñòàíàâëèâàåì öâåòà èíäèêàòîðà
   PlotIndexSetInteger( 0, PLOT_COLOR_INDEXES, 2 );           // Êîëè÷åñòâî öâåòîâ ãèñòîãðàììû
   PlotIndexSetInteger( 0, PLOT_LINE_COLOR, 0, neutralClr );  // Öâåò íåéòðàëüíîãî ñòîëáöà
   PlotIndexSetInteger( 0, PLOT_LINE_COLOR, 1, clr );         // Öâåò ïðåâûøàþùåãî ñòîëáöà
   PlotIndexSetInteger( 1, PLOT_LINE_COLOR, 0, clr );         // Öâåò ñðåäíåé ëèíèè
//--- Óñòàíàâëèâàåì èìÿ â ïîäîêíå
   string name="CandleSizes ("+GetConstructionStringType(type)+")";
   IndicatorSetString(INDICATOR_SHORTNAME,name);
//---
   return( true );
  }
//+------------------------------------------------------------------+
//| Ïîëó÷àåì ñòðîêîâûé òèï ïîñòðîåíèÿ èíäèêàòîðà                     |
//+------------------------------------------------------------------+
string GetConstructionStringType(const ENUM_CONSTRUCTION_TYPE type) // Òèï ïîñòðîåíèÿ
  {
   switch(type)
     {
      case upper_shadows: return( "upper" );
      case lower_shadows: return( "lower" );
      case bodies:         return( "bodies" );
      default:
         Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï ïîñòðîåíèÿ "+EnumToString(type));
         return( "" );
     }
  }
//+------------------------------------------------------------------+
//| Ïîëó÷àåì íîìåð ïåðâîãî áàðà ïîëíîñòüþ äîñòóïíîãî äíÿ             |
//+------------------------------------------------------------------+
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);                  // Âîçâðàùàåì íîìåð òåêóùåãî äíÿ
  }
//+------------------------------------------------------------------+
//| Ôóíêöèÿ ðàñ÷åòà èíäèêàòîðà íà òåêóùåé ñâå÷å                      |
//+------------------------------------------------------------------+
void Calculation(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
                 const int num,                     // Íîìåð òåêóùåãî áàðà
                 const int dCount,                  // Êîëè÷åñòâî îáðàçîâàâøèõñÿ áàðîâ çà äåíü (ñ ó÷åòîì òåêóùåãî)
                 const int dSum,                    // Ñóììà ñîîòâåòñòâóþùèõ çíà÷åíèé çà äåíü (íà ïðåäûäóùåì áàðå)
                 const datetime time,               // Ìàññèâ âðåìåí îòêðûòèÿ ïðîñ÷èòàííûõ áàðîâ
                 const double high,                 // Ìàññèâ ìàêñèìóìîâ ïðîñ÷èòàííûõ áàðîâ
                 const double low,                  // Ìàññèâ ìèíèìóìîâ ïðîñ÷èòàííûõ áàðîâ
                 const double open,                 // Ìàññèâ öåí îòêðûòèÿ
                 const double close)                // Ìàññèâ öåí çàêðûòèÿ
  {
//--- Îïðåäåëÿåì ðàçìåð ýëåìåíòà íà òåêóùåì áàðå
   int cdlType = GetCandleType( open, close );                           // Òèï òåêóùåé ñâå÷è
   int size = GetElementSize( type, cdlType, open, high, low, close );   // Ðàçìåð ýëåìåíòà
   if( size == 0 ) return;
//--- Çàïîìèíàåì ïàðàìåòðû â áóôåð
   bufSize[ num ] = size;      // Ðàçìåð 
   bufSizeClr[ num ] = 0;      // Öâåò
//--- Îïðåäåëÿåì ñðåäíåå çíà÷åíèå çà äåíü
   bufAverage[num]=int(MathRound(( dSum+size)/dCount));
//--- Ïðîâåðÿåì ïðåâûøåíèå ðàçìåðà ýëåìåíòà ñðåäíåå çíà÷åíèå íà òåêóùåì áàðå
   if(bufSize[num]>bufAverage[num]) // Åñëè çíà÷åíèå ïðåâûøåíî
      bufSizeClr[num]=1;            // Ìåíÿåì öâåò ñòîëáèêà ãèñòîãðàììû
  }
//+------------------------------------------------------------------+
//| Ðàñ÷åò çíà÷åíèé èíäèêàòîðà íà íîâîé ñâå÷å                        |
//+------------------------------------------------------------------+
void Calculation_bar(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
                     const int num,                     // Íîìåð ñôîðìèðîâàííîãî
                     int &dCount,                       // Êîëè÷åñòâî ñôîðìèðîâàííûõ áàðîâ çà äåíü (out)
                     int &dSum,                         // Ñóììà ñîîòâåòñòâóþùèõ çíà÷åíèé çà äåíü (out)
                     const datetime &time[],            // Ìàññèâ âðåìåí îòêðûòèÿ ïðîñ÷èòàííûõ áàðîâ
                     const double &high[],              // Ìàññèâ ìàêñèìóìîâ ïðîñ÷èòàííûõ áàðîâ
                     const double &low[],               // Ìàññèâ ìèíèìóìîâ ïðîñ÷èòàííûõ áàðîâ
                     const double &open[],              // Ìàññèâ öåí îòêðûòèÿ
                     const double &close[])             // Ìàññèâ öåí çàêðûòèÿ
  {
//--- Óâåëè÷èâàåì ñ÷åò÷èê ñôîðìèðîâàííûõ áàðîâ
   dCount++;
//--- Îïðåäåëÿåì ðàçìåð íà ïðåäûäóùåé ñâå÷å
   int cdlType = GetCandleType( open[ num ],close[ num ] );                                          // Òèï ïðåäûäóùåé ñâå÷è
   int size = GetElementSize( type, cdlType, open[ num ], high[ num ], low[ num ], close[ num ] );   // Ðàçìåð ýëåìåíòà
   if( size == -1 ) return;
//--- Äîáàâëÿåì ðàçìåð ê ñóììå
   dSum+=size;
//--- Îáíîâëÿåì çíà÷åíèå ñòîëáöà ãèñòîãðàììû
   bufSize[num]=size;
//--- Îáíîâëÿåì ñðåäíåå çíà÷åíèå
   bufAverage[num]=int(MathRound(dSum/dCount));
//--- Ïðîâåðêà ðàçìåðà ýëåìåíòà òåíè
   if(bufSize[num]>bufAverage[num]) // Åñëè ýëåìåíò áîëüøå ñðåäíåãî çíà÷åíèÿ
      bufSizeClr[num]=1;            // Ïîäñâåòêà ñòîëáöà ãèñòîãðàììû
   else                             // Åñëè çíà÷åíèå íå áîëüøå ñðåäíåãî
   bufSizeClr[num]=0;               // Ñòîëáåö áåç ïîäñâåòêè
  }
//+------------------------------------------------------------------+
//| Ïîëó÷àåì ðàçìåð ýëåìåíòà òèïà type                               |
//+------------------------------------------------------------------+
int GetElementSize(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
                   const int cdlType,                 // Òèï ñâå÷è
                   const double open,                 // Öåíà îòêðûòèÿ
                   const double high,                 // Öåíà ìàêñèìóìà
                   const double low,                  // Öåíà ìèíèìóìà
                   const double close)                // Öåíà çàêðûòèÿ
  {
   switch(type) // Â çàâèñèìîñòè îò òèïà ïîñòðîåíèÿ
     {
      case upper_shadows:                                 // Âåðõíèå òåíè
         if( cdlType == 0 ) return( int( NormalizeDouble( high - close, _Digits )/_Point ) );   // Âîñõîäÿùàÿ ñâå÷à
         else               return( int( NormalizeDouble( high - open, _Digits  )/_Point ) );   // Íèñõîäÿùàÿ ñâå÷à
         break;
      case lower_shadows:                                 // Íèæíèå òåíè
         if( cdlType == 0 ) return( int( NormalizeDouble( open  - low, _Digits )/_Point ) );   // Âîñõîäÿùàÿ ñâå÷à
         else               return( int( NormalizeDouble( close - low, _Digits )/_Point ) );   // Íèñõîäÿùàÿ ñâå÷à
         break;
      case bodies:                                       // Òåëà ñâå÷åé
         if( cdlType == 0 ) return( int( NormalizeDouble( close - open, _Digits )/_Point ) );   // Âîñõîäÿùàÿ ñâå÷à
         else               return( int( NormalizeDouble( open - close, _Digits )/_Point ) );   // Íèñõîäÿùàÿ ñâå÷à
         break;
      default:                                          // Íåèçâåñòíûé òèï
         Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï ïîñòðîåíèÿ: "+EnumToString(type));
         return(-1);                                    // Âûõîä ñ îøèáêîé
     }
  }
//+------------------------------------------------------------------+
//| Ôóíêöèÿ ïðîâåðêè îáðàçîâàíèÿ íîâîãî äíÿ + ñáðîñ ñòàòè÷. ïàðàì-â  |
//+------------------------------------------------------------------+
void CheckNewDay(const datetime time, // Âðåìÿ îòêðûòèÿ áàðà
                 int &dNum,           // Íîìåð ïðîâåðÿåìîãî äíÿ (out)
                 int &dCount,         // Êîëè÷åñòâî îáðàçîâàííûõ ñâå÷åé çà òåêóùèé äåíü (out)
                 int &dSum)           // Ñóììà ñîîòâåòñòâóþùèõ ðàçìåðîâ ñâå÷åé çà òåêóùèé äåíü (out)
  {
   int currDayNum=GetDayNumber(time); // Íîìåð òåêóùåãî äíÿ
   if(currDayNum!=dNum)               // Åñëè íîìåð íå ñîâïàäàåò ñ ñîõðàíåííûì
     {
      //--- Ñáðàñûâàåì ïàðàìåòðû ñòàòè÷åñêèõ ïåðåìåííûõ
      dNum= currDayNum;               // Íîìåð äíÿ
      dCount = 0;                     // Êîëè÷åñòâî áàðîâ òåêóùåãî äíÿ
      dSum= 0;                        // Ñóììà çíà÷åíèé íà ñôîðìèðîâàâøèõñÿ áàðàõ
     }
  }
//+------------------------------------------------------------------+

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