Код: Выделить всё
function Initialize()
{
IndicatorName = "RenkoLevels";
PriceStudy=false;
AddInput("Input", Inputs.Candle);
AddParameter("ATRperiod", 60);
AddParameter("ATRk", 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 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=Input.Close[0];
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
{
c=Color.Silver;
}
RenkoUp[0]=rup;
RenkoDn[0]=rdn;
RenkoBuySell[0]=bs;
RenkoDn.DrawChannel(RenkoUp, c, 50);
RenkoBuySell.DrawHistogram(c);
}
В данной реализации направление хода цен фиксируется в серии RenkoBuySell (числа со знаком).
Раскрашиваются только моменты изменения, серым цветом рисуются интервалы постоянства.
Дополнительное замечание: порядок объявления серий имеет значение (подсказано когда-то давно evge, спасибо). Если объявить серию RenkoBuySell после других серий, то при копировании окна или при перезапуске терминала она будет отрисовываться ... в главном окне! На странное поведение индикаторов, рисуемых в разных областях, в документации намекает загадочное примечание к методу AddSeries(Name, Type, Color, AxisType, Visible, Axes):
Axes – область отображения ряда // Не сохраняется в конфигурацию