Страница 4 из 5

Re: Renko Levels

Добавлено: 27 дек 2021, 10:07
BugsDigger
Добавить другой ТФ на тот же график возможности нет.

На форуме есть 2 варианта ручного счета, единственная проблема в том, что они выдают "числовые" серии Open, Low, High и Close, а не свечки.
Если индикатор, который вы хотите использовать, работает с числовыми сериями, то все ОК, если же требует свечек, то его придется слегка допилить, чтобы вместо свечек брать данные из отдельных числовых серий.

CustomCandle
viewtopic.php?f=4&t=601#p3872
Генерирует "свечку" по последнему интервалу любой заказанной длины.

BarFrame - бары вышестоящего таймфрейма
viewtopic.php?f=4&t=102#p520
Генерирует данные, совместимые с "настоящей" (еще незаконченной) свечкой более длинного ТФ.

Re: Renko Levels

Добавлено: 27 дек 2021, 10:45
K_R_L
отображать на графике свечи не нужно, числа нужны.
что бы RenkoUp, RenkoDn, RenkoBuySell соответствовала часовому тайфрейму на 15 минутном графике

З.Ы.
Суппорт ...эээ ... послал к "робото писателям", написал им о нестабильности графика.
Посмотрим, может что ответят.

Re: Renko Levels

Добавлено: 27 дек 2021, 13:01
BugsDigger
Числа там и так есть.

Также недавно стало можно использовать данные из другого ТФ в стратегиях (но не в индикаторах). Сам не пробовал, без надобности, но в первых версиях были странности, обсждались на форуме; сейчас не знаю.

Re: Renko Levels

Добавлено: 27 дек 2021, 14:02
K_R_L
BugsDigger

пробую прикрутить это в дополнение
https://www.tradingview.com/script/j2gf ... o-Candles/

пока по черновому, на RenkoBuySell.
в принципе работает, но не так. Движение есть, но оно отображается во времени, а во времени не надо.
т.е. есть изменение - отобразили, а временную шалу не трогаем.
А сейчас изменение - отобразили, но временная шкала дальше идёт.

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


if (Change == 1)
{
 RenkoBuySell[0]=ATR ;
 RenkoBuySell.DrawHistogram(c);
 }

Re: Renko Levels

Добавлено: 28 дек 2021, 07:43
BugsDigger
Так уж устроен терминал: все графики привязаны ко времени. Вы можете присваивать отдельные точки в серии, а не подряд, и они будут отображаться как отдельные, а между ними будет зазор. При обращении к ряду по индексу [0]. [-1] ... [-n] вы будете получать значения подряд, но значения BarTime(-n) будут не подряд.

Я в неизменные участки проставляю старые значения и в первом варианте красил их серым, чтобы на сером фоне подчеркивать именно изменения.

Графиков без привязки ко времени нет. По здравом размышлении случаев, где они бы были позарез нужны (прямо "кушать не могу без них") придумать трудно.

Re: Renko Levels

Добавлено: 28 дек 2021, 09:45
K_R_L
ясно, тоды не тыкаю больше в этом направлении.

Хотел Ренко в АД, но похоже Ренко условный получается. Но в принципе тоже нормальный, если бы не одно но - с косячным отображением истории.
На 4 х часах и днях косячит меньше :)

Re: Renko Levels

Добавлено: 29 дек 2021, 21:26
BugsDigger
Вариант с опциональным рестартом в начале дня.

При включенном рестарте:
- для ТФ>=1 минуты (и меньше суточного, естественно) гарантирует стабильность показаний;
- в начале дня может появиться участок, выделенный серым; это значит, что тренд еще не выявлен (начальный коридор не пробит вверх или вниз).

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

function Initialize()
{
 IndicatorName = "RenkoLevels";
 PriceStudy=false;
 AddInput("Input", Inputs.Candle);

 AddParameter("DEMAperiod", 8);
 AddParameter("ATRperiod", 60);
 AddParameter("ATRk", 1.0);
 AddParameter("Sens", 1.0);
 AddParameter("Daily", 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()
{
 double sens=Sens;

 double atr;
 bool b=(CurrentIndex==0 || (Daily!=0 && BarDate(0)!=BarDate(-1)));
 if(b)
 { // начало дня
  atr=Input.High[0]-Input.Low[0];
  if(sens!=0.0 && atr>3.0*sens) atr=3.0*sens; // сделал ограничение, иначе начальное значение ATR выглядит слишком большим   
 }
 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;
 if(atr<sens) atr=sens;

 double rup, rdn, h;
 int bs;
 if(b)
 { // начало дня
  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);
}

Re: Renko Levels

Добавлено: 30 дек 2021, 11:33
BugsDigger
Видимо, последняя вариация на тему.

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

Re: Renko Levels

Добавлено: 08 янв 2022, 11:32
BugsDigger
Update: во все исходники добавлен еще один параметр (по примеру индикатора NATR).

ATRk - коэффициент, на который множится насчитанный ATR.
При ATRk<1 чувствительность повышается, при >1 - загрубляется.
Т.е., еще одна ручка для оптимизации.

Можно, например, использовать 2 индикатора: один с - бoльшим ATRk - для определения общего тренда, второй - с меньшим - для операций (с учетом общего тренда).

Re: Renko Levels

Добавлено: 14 янв 2022, 10:59
K_R_L
Привет всем.

А как изобразить значок "Bay" и "Sell" ?
DrawArrowDown и DrawArrowUp - мелковато получается


P/S/

только так можно ?

B.DrawFigure(Figure.Up,Color.Green,Line.DashBig,3,Color.Green,0);
B.DrawFigure(Figure.Up,Color.Green,Line.Solid,3,Color.Green,0);
S.DrawFigure(Figure.Down,Color.Red,Line.Solid,3,Color.Red,0);
S.DrawFigure(Figure.Up,Color.Red,Line.DashBig,3,Color.Red,0);