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

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

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

Добавлено: BugsDigger » 21 дек 2021, 10:16

Тема: Re: Renko Levels

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

Слегка усовершенствованная версия.

Код: Выделить всё

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.
Renko2.png

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