Пользовательские индикаторы > Renko Levels

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
BugsDigger
Сообщения: 502
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 84 раза

Renko Levels

Непрочитанное сообщение BugsDigger » 20 дек 2021, 17:21

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

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

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
Последний раз редактировалось BugsDigger 08 янв 2022, 11:09, всего редактировалось 2 раза.

BugsDigger
Сообщения: 502
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 84 раза

Re: Renko Levels

Непрочитанное сообщение BugsDigger » 21 дек 2021, 10:18

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

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

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 можно установить через окно добавления индикаторов: кликнуть обновление, искать в разделе "Скользящие с мин. запаздыванием".
Последний раз редактировалось BugsDigger 08 янв 2022, 11:11, всего редактировалось 2 раза.

K_R_L
Сообщения: 27
Зарегистрирован: 19 июн 2021, 21:39
Благодарил (а): 1 раз

Re: Renko Levels

Непрочитанное сообщение K_R_L » 21 дек 2021, 10:50

Круто..

Поделюсь идеей, зачем он мне был нужен.
Основная идея Renko Leves - на 15 минутный тайфрейм положить отображение 60 минутного тайфрейма. Это нужно для определения краткосрочного тренда.
Внутри дня (для перезахода) думал юзать это.
https://www.tradingview.com/script/j2gf ... o-Candles/
но там код он закрыт, хотя принцип тот же, только отображение другое.

На этом форуме есть индикаторы типа супертренд - в целом, по сигналам, они схожи, но например на последнем проливе сигналы на покупку тут появились раньше даже на 60 минутном таймфрейме.

K_R_L
Сообщения: 27
Зарегистрирован: 19 июн 2021, 21:39
Благодарил (а): 1 раз

Re: Renko Levels

Непрочитанное сообщение K_R_L » 21 дек 2021, 23:32

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


меняет значение индикатор по мере добавления свечей.
С чем это может быть связанно ?

BugsDigger
Сообщения: 502
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 84 раза

Re: Renko Levels

Непрочитанное сообщение BugsDigger » 22 дек 2021, 08:49

В смысле?

Что-то меняется в "прошлом"? Такого вроде быть не должно.

При листании графика существенно назад, затем вперед? Это возможно, т.к. индикаторы считаются по некоторому участку данных. Его начало выбирает сам терминал "где-то достаточно далеко" в прошлом (до точки начала графика на экране). "Далеко" - понятие относительное, ~2000-5000 баров, точно можно установить, сделав лог и выведя время бара при CurrentIndex=0. "Устойчивые" индикаторы, вроде простого бегущего среднего, быстро "забывают" начальную точку (SMA конкретно - за период рассчета), другие могут "запоминать", что, конечно, не очень хорошо, но не смертельно, т.к. расчеты делаются обычно не по значению индикатора, а по тому, как он изменился.

Конкретно здесь, скорее всего, первый "кирпич" ренко устанавливается в некоторый (фактически произвольный) начальный момент (CurrentIndex=0), дальнейшие вычисления идут относительно этого "фундамента". Если сместить начало, то начальный кирпич тоже как-то сместится, и вся последующая история тоже изменится. С этим трудно что-то поделать, т.к. невозможно пересчитывать графики "от начала времен", какая-то начальная точка волей-неволей нужна; даже если задать ее руками (например, считать с начала года), то само устройство программы, как описано выше, может не дать нам этих данных, если заданная исходная точка выйдет в прошлое дальше, чем те самые 2-5 тыс. разгонных баров.

Классическая версия ренко работает с жестко заданной толщиной кирпича, скажем, 1 рупь, начало отсчета - цена, кратная этому значению. В такой редакции проблемы начальной точки нет. В нашей редакции толщина кирпича переменная (зависит от волатильности), а начальный уровень цены - случайный, соответственно результаты будут зависеть от начальной цены и волатильности в начальный момент.

K_R_L
Сообщения: 27
Зарегистрирован: 19 июн 2021, 21:39
Благодарил (а): 1 раз

Re: Renko Levels

Непрочитанное сообщение K_R_L » 22 дек 2021, 09:32

BugsDigger писал(а):В смысле?

Что-то меняется в "прошлом"? Такого вроде быть не должно.



Исторические данные.
Например 15 минут, мтс, вчера.
Если свечки убирать - видно будет.

Я вчера читал код оригинальный, там много условий, для которых разный расчет.
Может из за этого ?

BugsDigger
Сообщения: 502
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 84 раза

Re: Renko Levels

Непрочитанное сообщение BugsDigger » 22 дек 2021, 09:39

Нет, код гораздо проще сделан, а логика та же.
Скриншот(ы) надо, без этого не понимаю, в чем у вас проблема.

K_R_L
Сообщения: 27
Зарегистрирован: 19 июн 2021, 21:39
Благодарил (а): 1 раз

Re: Renko Levels

Непрочитанное сообщение K_R_L » 22 дек 2021, 09:58

BugsDigger писал(а):Нет, код гораздо проще сделан, а логика та же.
Скриншот(ы) надо, без этого не понимаю, в чем у вас проблема.


Скриншоты вечером сделаю.

График мтс, 15 минут. Листаем график назад кнопкой в верхней части графика .

Вчера вечером заметил - новая свечка появилась в вечёрке, историческая часть графика изменилась.

BugsDigger
Сообщения: 502
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 84 раза

Re: Renko Levels

Непрочитанное сообщение BugsDigger » 22 дек 2021, 10:32

Ну, если входные данные поменялись, то результаты тоже, естественно, поменяются. Я тут точно ни при чем. :)

K_R_L
Сообщения: 27
Зарегистрирован: 19 июн 2021, 21:39
Благодарил (а): 1 раз

Re: Renko Levels

Непрочитанное сообщение K_R_L » 22 дек 2021, 10:37

BugsDigger писал(а):Ну, если входные данные поменялись, то результаты тоже, естественно, поменяются. Я тут точно ни при чем. :)


А каждая свеча разве не индивидуально расчитывается?
Рассчитали, отметили и забыли.
Вышла из диапазона - обозначили и считаем новую.


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя