//+------------------------------------------------------------------+ //| AG_Renko_Сhart.mq4 | //| Построение линий ренко на ценовом графике | //+------------------------------------------------------------------+ #property copyright "Бармалей" #property link "" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 8 #property indicator_plots 8 //--- plot Direct #property indicator_label1 "Renko" #property indicator_color1 clrYellow #property indicator_color2 clrRoyalBlue #property indicator_color3 clrRed #property indicator_color4 clrRoyalBlue #property indicator_color5 clrRed #property indicator_color6 clrDimGray #property indicator_color7 clrBlue #property indicator_color8 clrRed //--- indicator buffers double Renco[]; // График Ренко double RencoUP[]; // Раскладка по цветам double RencoDN[]; // Раскладка по цветам double DirectUP[]; // Сигналы вверх double DirectDN[]; // Сигналы вниз double RencoDirect[]; // Текущее Направление Ренко double CandleWickUP[]; // Хвосты ренко double CandleWickDN[]; // Хвосты ренко double ZZ[]; // Зигзаг input int Step=250; // Размер кирпичиков Ренко в пунктах input bool Signals=false; // Показать сигналы input bool ZigZag=false; // Рисовать ренко-зигзаг input int Revers=2; // Реверс - количество кирпичиков для разворота double step; int TF=0; int StartBar; double Lewel; // Круглый текущий уровень double LewelX; // Последний круглый уровень в движении ренко double LewelR; // Последний круглый уровень в реверсе ренко double DIRECT; // Текущее направление double Start; // Начало последнего тренда //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { IndicatorBuffers(9); //--- indicator buffers mapping // Буферы для вывода ренко SetIndexBuffer(0,Renco,INDICATOR_DATA); SetIndexStyle(0,DRAW_NONE,STYLE_SOLID,3); SetIndexBuffer(1,RencoUP,INDICATOR_DATA); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3); SetIndexBuffer(2,RencoDN,INDICATOR_DATA); SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,3); // Буферы для сигналов SetIndexBuffer(3,DirectUP,INDICATOR_DATA); SetIndexStyle(3,DRAW_ARROW,STYLE_SOLID,3); SetIndexArrow(3,233); SetIndexBuffer(4,DirectDN,INDICATOR_DATA); SetIndexStyle(4,DRAW_ARROW,STYLE_SOLID,3); SetIndexArrow(4,234); // Зигзаг SetIndexBuffer(5,ZZ,INDICATOR_DATA); SetIndexStyle(5,DRAW_SECTION,STYLE_SOLID,1); if(!ZigZag) SetIndexStyle(5,DRAW_NONE,STYLE_SOLID,1); // Хвост вверх SetIndexBuffer(6,CandleWickUP,INDICATOR_DATA); SetIndexStyle(6,DRAW_NONE,STYLE_SOLID,1); // Хвост вниз SetIndexBuffer(7,CandleWickDN,INDICATOR_DATA); SetIndexStyle(7,DRAW_NONE,STYLE_SOLID,1); // Служебный буфер для последующей связи с советниками, можно удалить, если не нужен SetIndexBuffer(8,RencoDirect,INDICATOR_CALCULATIONS); SetIndexStyle(8,DRAW_NONE); //--- step=Step*Point; // Пересчет кубика из пунктов в приращение цены IndicatorShortName(_Symbol+" RencoChart TF="+(string)Period()+" Step="+(string)Step+" "); 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[]) { //--- // Считаем от первого доступного бара int ReversX=0; int limit=Bars-2; double c=0,h=0,l=0; // Цена закрытия if(prev_calculated==0) //Считаем от начала при запуске индикатора { c=iClose(_Symbol,TF,Bars-1); Renco[Bars-1]=1; Lewel=NormalizeDouble(MathRound(c/step)*step,Digits); DIRECT=1; LewelX=NormalizeDouble(Lewel+step,Digits); LewelR=NormalizeDouble(Lewel-Revers*step,Digits); } else limit=1; // Пересчитывается только бар №1 for(int i=limit;i>=1;i--) { c=iClose(_Symbol,TF,i); h=iHigh(_Symbol,TF,i); l=iLow(_Symbol,TF,i); Renco[i]=Renco[i+1]; CandleWickUP[i]=CandleWickUP[i+1]; CandleWickDN[i]=CandleWickDN[i+1]; Lewel=NormalizeDouble(MathRound(c/step)*step,Digits); if(lCandleWickUP[i]) CandleWickUP[i]=h; // Сохранение старта и бара последнего ренко-тренда, расчет зигзага if((DIRECT>0 && cLewelR)) { Start=NormalizeDouble(LewelX,Digits); ZZ[StartBar]=Start; } // Направление вверх или реверс вверх if((DIRECT>0 && c>LewelX) || (DIRECT<0 && c>LewelR)) { DIRECT=1; if(DIRECT>0 && c>LewelX) StartBar=i; if(cLewelX) {LewelX=Lewel; CandleWickUP[i]=Lewel;CandleWickDN[i]=Lewel;} // if (c0 && cLewel) {Lewel=NormalizeDouble(Lewel+step,Digits);} if(LewelCandleWick[i]) CandleWick[i]=c; LewelR=NormalizeDouble(LewelX+Revers*step,Digits); } // Расчет линии ренко и раскладка по цветам Renco[i]=NormalizeDouble(LewelX,Digits); if(DIRECT<0) RencoDN[i]=LewelX; if(DIRECT>0) RencoUP[i]=LewelX; // Удаление разрывов в графике if(RencoDN[i]!=EMPTY_VALUE && RencoDN[i+1]==EMPTY_VALUE) {RencoUP[i]=Renco[i];} if(RencoUP[i]!=EMPTY_VALUE && RencoUP[i+1]==EMPTY_VALUE) {RencoDN[i]=Renco[i];} // Сигналы if(!Signals) continue; if(DIRECT>0 && RencoUP[i+1]==EMPTY_VALUE) DirectUP[i]=LewelX+step/2; if(DIRECT<0 && RencoDN[i+1]==EMPTY_VALUE) DirectDN[i]=LewelX-step/2; } Renco[0]=Renco[1]; // В нулевой бар - значение на 1-м баре CandleWickUP[0]=CandleWickUP[1]; CandleWickDN[0]=CandleWickDN[1]; ZZ[1]=EMPTY_VALUE; // Расчет зигзага в 0-й точке ZZ[0]=LewelX; // В служебный буфер в 0-й бар вписывается количество кирпичиков в последнем ренко-тренде // Сюда можно писать что угодно, что потом понадобится в советниках RencoDirect[0]=MathRound((Renco[0]-Start)/step); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+