Каталог файлов форума

Список вложений в сообщениях, оставленных на этой конференции.

Все файлы форума: 1233

Добавлено: BugsDigger » 30 дек 2021, 11:29

Тема: Re: Renko Levels

Текст сообщения:

Видимо, последняя вариация на тему.

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); // не визуализируется
}


pRenko.png