Код: Выделить всё
function Initialize()
{
IndicatorName = "RenkoLevels";
PriceStudy=false;
AddInput("Input", Inputs.Candle);
AddParameter("DEMAperiod", 8);
AddParameter("ATRperiod", 60);
AddParameter("ATRk", 1.0);
AddParameter("Sens", 1.0);
AddSeries("RenkoBuySell", DrawAs.Custom, Color.Black, AxisType.ZeroBased);
AddSeries("RenkoUp", DrawAs.Custom, Color.Black, true, Axes.Parent);
AddSeries("RenkoDn", DrawAs.Custom, Color.Black, true, Axes.Parent);
AddGlobalVariable("atr_", Types.Double);
}
function Evaluate()
{
// По неизвестной причине не выдает значений до индекса=ATRperiod,
// что противоречит документации.
// double atr=ATR(Input, (int)ATRperiod)[0];
// Пришлось взять код из документации и вставить сюда для прямого счета.
double atr;
if(CurrentIndex==0) atr=Input.High[0]-Input.Low[0];
else
{
double tr=(Math.Max(Input.High[0], Input.Close[-1])-Math.Min(Input.Low[0], Input.Close[-1]));
double atp=ATRperiod;
atr=((atp-1.0)*atr_+tr)/atp;
}
atr_=atr;
atr*=ATRk;
double sens=Sens;
if(atr<sens) atr=sens;
double rup, rdn, h;
int bs;
if(CurrentIndex==0)
{
double mid=(Input.High[0]+Input.Low[0])/2.0;
double atr2=atr/2.0;
rup=mid+atr2;
rdn=mid-atr2;
h=atr;
bs=0;
}
else
{
rup=RenkoUp[-1];
rdn=RenkoDn[-1];
h=rup-rdn;
if(h==0.0) h=atr; // если при страте попалось atr=0, за ширину канала возьмем текущее
bs=(int)RenkoBuySell[-1];
}
double cl;
int demap=(int)DEMAperiod;
if(demap<=1) cl=Input.Close[0]; // просто цена закрытия
else cl=MY.DEMA(Input.Close, demap)[0]; // цена закрытия, сглаженная EMA с компенсацией запаздывания
int Up, Dn;
if(h>0.0)
{
Up=(int)((cl-rup)/h); if(Up>3) Up=3;
Dn=(int)((rdn-cl)/h); if(Dn>3) Dn=3;
}
else Up=Dn=0;
Color c;
if(Up>0)
{
c=Color.Lime;
if(bs<0) bs=0;
bs+=Up;
rup+=atr*Up;
rdn=rup-atr;
} else
if(Dn>0)
{
c=Color.Crimson;
if(bs>0) bs=0;
bs-=Dn;
rdn-=atr*Dn;
rup=rdn+atr;
}
else // Up<=0, Dn<=0
{
if(bs>0) c=Color.Lime; else
if(bs<0) c=Color.Crimson;
else c=Color.Silver;
}
RenkoUp[0]=rup;
RenkoDn[0]=rdn;
RenkoBuySell[0]=bs;
RenkoDn.DrawChannel(RenkoUp, c, 50);
RenkoBuySell.DrawHistogram(c);
}
Привнесено:
- опциональное сглаживание цены закрытия EMA с компенсацией запаздывания: при DEMA<=1 берется просто закрытие, иначе сглаженные цены закрытия;
- параметр чувствительности Sens: если посчитанный ATR меньше порога чувствительности, то берем именно порог. Это приближает к исходному Renko, снижая степень чувствительности в периодах малой волатильности. При Sens=0, естественно, чувствительность максимальная;
- подкрасил бывшее серым, выглядит повеселее.

Пример с Dema=8 и Sens=1.0.
На график для наглядности добавлена DEMA(Close) с периодом 8.
DEMA можно установить через окно добавления индикаторов: кликнуть обновление, искать в разделе "Скользящие с мин. запаздыванием".