AG_Renko_Bricks

Author: Copyright 2014, MetaQuotes Software Corp.
Price Data Components
Series array that contains close prices for each bar
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
AG_Renko_Bricks
//+------------------------------------------------------------------+
//|                                                     AG_Renko.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict

#property indicator_separate_window

#property indicator_buffers 9
#property indicator_plots   9
//--- plot Direct
#property indicator_label1  "Renko"

//--- indicator buffers
double         Renko[];        // Áóôåð Ðåíêî
double         RenkoUP[];      // Ðàñêëàäêà ïî öâåòàì
double         RenkoDN[];      // Ðàñêëàäêà ïî öâåòàì

double         RenkoSS[];      // Áóôåð Ðåíêî äëÿ êèðïè÷èêîâ
double         WickUP[];       // Âåðõíèé õâîñò
double         WickDN[];       // Íèæíèé õâîñò
double         RenkoGround[];  // Çàêðàñêà äëÿ ãèñòîãðàììû êèðïè÷èêîâ
double         Ground[];       // Çàêðàñêà äëÿ ãèñòîãðàìì õâîñòîâ
double         WH[];           // Áóôåð âåðõíåãî õâîñòà
double         WL[];           // Áóôåð íèæíåãî õâîñòà
double         CLOSE[];        // Òåêóùàÿ öåíà

input int Step=250;     // Ðàçìåð êèðïè÷èêà ðåíêî â ïóíêòàõ
extern int Revers=2;    // Ðåâåðñ - êîëè÷åñòâî êèðïè÷èêîâ äëÿ ðàçâîðîòà
input bool Wicks=false; // Ðèñîâàòü õâîñòû
int BricksWidth=5;      // Òîëùèíà êèðïè÷èêà (0 - 5)
double step;
int TF=0;
int BeginBar,EndBar;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   IndicatorBuffers(11);

   color GroundColor=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND);
//      Comment(GroundColor);

//   Áóôåðû äëÿ âûâîäà ðåíêî
   SetIndexBuffer(0,WickUP,INDICATOR_DATA);
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1,clrDarkSlateGray);
   if(!Wicks) SetIndexStyle(0,DRAW_NONE);

   SetIndexBuffer(1,RenkoUP,INDICATOR_DATA);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,BricksWidth,clrRoyalBlue);

   SetIndexBuffer(2,RenkoDN,INDICATOR_DATA);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,BricksWidth,clrRed);

   SetIndexBuffer(3,RenkoGround,INDICATOR_DATA);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,BricksWidth,GroundColor);

   SetIndexBuffer(4,WickDN,INDICATOR_DATA);
   SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID,1,clrDarkSlateGray);
   if(!Wicks) SetIndexStyle(4,DRAW_NONE);

   SetIndexBuffer(5,Ground,INDICATOR_DATA);
   SetIndexStyle(5,DRAW_HISTOGRAM,STYLE_SOLID,BricksWidth,GroundColor);

   SetIndexBuffer(6,RenkoSS,INDICATOR_DATA);
   SetIndexStyle(6,DRAW_SECTION,STYLE_SOLID,1,clrDarkSlateGray);
   if(Revers==1) SetIndexStyle(6,DRAW_NONE,STYLE_SOLID,1,clrDarkSlateGray);

// Ñòðåëî÷êà - òåêóùàÿ öåíà
   SetIndexBuffer(7,CLOSE,INDICATOR_DATA);
   SetIndexStyle(7,DRAW_ARROW,STYLE_SOLID,2,clrDarkSlateGray);
   SetIndexArrow(7,224);

   SetIndexBuffer(8,Renko,INDICATOR_DATA);
   SetIndexStyle(8,DRAW_NONE,STYLE_SOLID,2,clrDarkSlateGray);
   if(Revers==1) SetIndexStyle(8,DRAW_LINE,STYLE_SOLID,1,clrDarkSlateGray);

   SetIndexBuffer(10,WH,INDICATOR_CALCULATIONS);
   SetIndexBuffer(9,WL,INDICATOR_CALCULATIONS);

//---
   step=Step*Point; // Ïåðåñ÷åò êóáèêà èç ïóíêòîâ â ïðèðàùåíèå öåíû
   if(Revers<1) Revers=1;

   IndicatorShortName(_Symbol+" RencoChart TF="+(string)Period()
                      +"  Step="+(string)Step
                      +"  Revers="+(string)Revers);
   IndicatorDigits(Digits);

   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[])
  {
//---

   ArrayInitialize(Renko,EMPTY_VALUE);
   ArrayInitialize(RenkoUP,EMPTY_VALUE);
   ArrayInitialize(RenkoDN,EMPTY_VALUE);
   ArrayInitialize(RenkoGround,EMPTY_VALUE);
   ArrayInitialize(RenkoSS,EMPTY_VALUE);
   ArrayInitialize(WickUP,EMPTY_VALUE);
   ArrayInitialize(WickDN,EMPTY_VALUE);
   ArrayInitialize(Ground,EMPTY_VALUE);
   ArrayInitialize(WH,EMPTY_VALUE);
   ArrayInitialize(WL,EMPTY_VALUE);
   ArrayInitialize(CLOSE,EMPTY_VALUE);

// Ðàñ÷åò ðàçìåðà îêíà ãðàôèêà, óñòàíîâêà ïàðàìåòðîâ îòðèñîâêè
   double x=ChartGetDouble(0,CHART_SHIFT_SIZE);
   BeginBar=(int)MathMax(0,WindowFirstVisibleBar()-WindowBarsPerChart()*(1-x/100));
   if(BeginBar==0) BeginBar=1;
   int j=BeginBar;
   int jj=j;

   CLOSE[j]=iClose(_Symbol,TF,0);

// Çíà÷åíèÿ ðåíêî íà ïðàâîì êðàþ
   x=iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,0,0);

   Renko[j]=x; RenkoSS[j]=x;
   WH[j]=NormalizeDouble(iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,6,0),Digits);
   WL[j]=NormalizeDouble(iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,7,0),Digits);

// Îòðèñîâêà óðîâíåé èíäèêàòîðà
   SetLevelStyle(STYLE_DOT,0,clrDimGray);
   SetLevelValue(0,x);
   for(int i=1;i<=15;i++)
     {
      SetLevelValue(i,x+i*step);
      SetLevelValue(i+15,x-i*step);
     }

   int i=1;
   double x0=Renko[j];
   double x1=x;

   while(jj<=WindowFirstVisibleBar() && i<Bars-1) // Îòðèñîâêà íà âèäèìîì ó÷àñòêå ãðàôèêà è êîíòðîëü, ÷òîáû õâàòèëî áàðîâ
     {
      // Ñðàâíèâàåì äâà ñîñåäíèõ çíà÷åíèÿ ðåíêî ñ öåíîâîãî ãðàôèêà
      x1=x0;
      x0=NormalizeDouble(iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,0,i),Digits);
      if(x0==x1) {i++;continue;} // Åñëè çíà÷åíèÿ ðàâíû - íè÷åãî íå äåëàåì
      double xup=NormalizeDouble(iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,6,i),Digits);
      double xdn=NormalizeDouble(iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,7,i),Digits);


      int k=(int)MathRound((x1-x0)/step); // Êîëè÷åñòâî êèðïè÷èêîâ ðåíêî
      int l=0;
      if(k<0) l=1;if(k>0) l=-1; //Íàïðàâëåíèå ïðèðàùåíèÿ êèðïè÷èêîâ

      k=MathAbs(k);

      for(int n=1;n<=k;n++) // Ðàñ÷åò ëèíèè ðåíêî
        {
         j++; jj++;
         Renko[j]=Renko[j-1]+l*step;
         if(n==k) {WH[j]=xup; WL[j]=xdn;} else {WH[j]=Renko[j]; WL[j]=Renko[j];}
         Renko[j]=NormalizeDouble(Renko[j],Digits);
         if(j>1 && Renko[j]==Renko[j-2]) jj--;
        }
      i++;
     }

//   if (Bricks)
     {
      EndBar=j;
      jj=BeginBar-1;

      // Ðàñêëàäêà ïî öâåòàì
      for(j=BeginBar;j<EndBar-1;j++)
        {
         if //Êèðïè÷èêè âíèç
         (
          (Revers==1 && Renko[j]<Renko[j+1])
          || (Revers>1 && Renko[j]<Renko[j+1] && Renko[j+1]<Renko[j+2])
          )
           {
            jj++;
            RenkoDN[jj]=Renko[j]+step;
            WickUP[jj]=WH[j];
            RenkoGround[jj]=Renko[j];
            WickDN[jj]=Renko[j];
            Ground[jj]=MathMin(WL[j],Renko[j]);
           }

         if //Êèðïè÷èêè ââåðõ
         (
          (Revers==1 && Renko[j]>Renko[j+1])
          || (Revers>1 && Renko[j]>Renko[j+1] && Renko[j+1]>Renko[j+2])
          )
           {
            jj++;
            RenkoUP[jj]=Renko[j];
            // Îòðèñîâêà õâîñòîâ è ôîíà
            WickUP[jj]=WH[j]; // Âåðõíèé õâîñò
            RenkoGround[jj]=Renko[j]-step; //Ôîí äëÿ êèðïè÷èêîâ
            WickDN[jj]=Renko[j]-step; // Íèæíèé õâîñò - öåïëÿåòñÿ ê êèðïè÷èêó
            Ground[jj]=MathMin(WL[j],Renko[j]-step); // Íèæíèé õâîñò îáðåçàåòñÿ ïî çíà÷åíèþ ëèáî ïî êèðïè÷èêó
           }

         // Ïåðåñ÷åò ëèíèè ðåíêî
         if((Renko[j]<Renko[j+1] && Renko[j+1]>Renko[j+2]) || (Renko[j]>Renko[j+1] && Renko[j+1]<Renko[j+2]))
            RenkoSS[jj+1]=Renko[j+1];
        }
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Comments