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

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

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

Добавлено: BugsDigger » 20 дек 2021, 17:24

Тема: Renko Levels

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

По просьбам трудящихся; всё для профита!

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

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 – область отображения ряда // Не сохраняется в конфигурацию

Renko.png