pRenkoLevels - вариант для "ценового"/"числового" входного ряда (не свечек).
В качестве меры волатильности для счета уровней выступает просто разница между текущим и предыдущим значениями. Поскольку эта разница часто бывает довольно маленькой, визуально результат рисования м.б., к сожалению, не очень нагляден. Но нам же лишь бы работало.
Код: Выделить всё
function Initialize()
{
IndicatorName = "pRenkoLevels";
PriceStudy=true;
AddInput("Input", Inputs.Price);
AddParameter("DEMAperiod", 8);
AddParameter("ATRperiod", 60);
AddParameter("ATRk", 1.0);
AddParameter("Sens", 0.0);
AddParameter("Daily", 0);
AddSeries("RenkoUp", DrawAs.Custom, Color.Black);
AddSeries("RenkoDn", DrawAs.Custom, Color.Black);
AddSeries("RenkoBuySell", DrawAs.Custom, Color.Black, false); // не визуализируется
AddGlobalVariable("atr_", Types.Double, 0.0);
}
function Evaluate()
{
double cl=Input[0];
double atr;
bool b=(CurrentIndex==0 || (Daily!=0 && BarDate(0)!=BarDate(-1)));
if(b)
{ // начало дня
atr=0.0;
}
else
{ // очередной бар дня
double tr=Math.Abs(Input[-1]-cl);
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(b)
{ // начало дня
rup=rdn=cl;
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];
}
int demap=(int)DEMAperiod;
if(demap>1) cl=MY.DEMA(Input, 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); // не визуализируется
}