//+------------------------------------------------------------------+ //| 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() && i0) 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;j1 && 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+2]) || (Renko[j]>Renko[j+1] && Renko[j+1]