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