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

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
K_R_L
Сообщения: 27
Зарегистрирован: 19 июн 2021, 21:39
Благодарил (а): 1 раз

Re: Renko Levels

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

Может тип переменой надо поменять, int на double ?

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

Re: Renko Levels

Непрочитанное сообщение BugsDigger » 23 дек 2021, 06:53

Нет, "может" в програмировании не действует. :)

Ларчик-то просто открывается: не следует ставить параметр Sens больше ... цен инструмента или многкратно больше ожидаемого ATR. Иначе "толщина" первого кирпича надолго или даже навсегда охватит все цены, и индикатор никогда не сдвинется с мертвой точки (цены никогда не выйдут из коридора). В этом случае цвет остается серым (раскраску серым я оставил в коде на всякий случай - и вот он реализовался).

В случае ВТБ приемлемый уровень Sens=0.0001. а не 1 рупь, который стоит по умолчанию (при цене бумаги в 5 копеек).

Насчет сравнения с исходной реализацией в другой системе. Если уж сравнивать, то в равных условиях, т.е. выключить дополнительные фичи сглаживания цен закрытия и порога чувствительности (сделать DEMA=0 и Sens=0). Иначе сравнение будет заведомо некорректным.

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

Re: Renko Levels

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

DEMA<2 вроде Как обрабатываться не должно.
Sens - без него посмотрю, вечером.

Спросил про double- для большей точности со знаком после запятой, для втб с его нулями актуально, да и для интер рао с системой тоже. Там шаг примерно 0,045 и 0,25 соответсвенно в классическом ренко для текущих цен.

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

Re: Renko Levels

Непрочитанное сообщение BugsDigger » 23 дек 2021, 07:24

Типы данных при вычислениях я проверил, там все правильно.

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

Re: Renko Levels

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

Сравнение оригинального индикатора и парированного без учета Sens и DEMA


оригинал
10.png


портированный на весь экран
11.png


портированный в окне поменьше
12.png


портированный в окне поменьше с небольшим сдвигом
13.png


14.png



результат стремноватый прям скажем.
За оригиналом смотрю, его так не колбасит.
Не понятно, это проблема AD ?
Последний раз редактировалось K_R_L 01 янв 2022, 10:20, всего редактировалось 2 раза.

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

Re: Renko Levels

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

Я уже объяснял причину и возможный обход проблемы (не блестящий с принципиальной точки зрения, но пригодный практически), почитайте внимательнее.
viewtopic.php?f=4&t=1161&start=10#p6436

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

Re: Renko Levels

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

BugsDigger писал(а):Я уже объяснял причину и возможный обход проблемы (не блестящий с принципиальной точки зрения, но пригодный практически), почитайте внимательнее.
viewtopic.php?f=4&t=1161&start=10#p6436


я с tradingview сравниваю.

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

Re: Renko Levels

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

Я не знаю, как там устроены вычисления. Например, начальная точка счета м.б. зафиксирована, дальше данные только досчитываются. В этом случае существует иллюзия стабильных результатов; именно иллюзия, поскольку индикатор принципиально "неустойчивый" в том смысле, как было подробно описано ранее. Если сменить начальную точку, то положения и цвет "кирпичей" поменяются и там, зуб даю, как говорится.

В АД, если не применять описанный обход проблемы фиксацией начальной точки (хотя бы временной - на один или несколько рабочих дней), начальная точка счета меняется:
- на каждом следующем баре при работе в реальном времени;
- при листании графика взад-вперед; в этом случае, правда, не при каждом перелистывании, а после перелистывания нескольких (2-3) экранов.

Вы скажете: ну вот же я вижу, тут все идет одинаково, а вот тут вдруг результаты разные. На самом деле НЕодинаково, уровни разные, пусть это и незаметно для глаза. Достаточно разницы уровня в одну миллионную, чтобы цена закрытия оказалась в одном терминале внутри, а в другом - за пределами "кирпича", что во втором случае приведет к скачку (перевороту направления), после чего результаты уже наглядно разойдутся. А "одинаково" (но на самом деле все равно не до конца, т.к. уровни все равно хоть немного, но различаются) они ведут себя в моменты резких скачков, когда даже при некоторой разности в положении и толщине предыдущего кирпича, индикатор начинает откладывать следующие кирпичи в направлении этого скачка.

Принципиальным решением было бы избавление от зависимости от начальной точки, но как это сделать - большой вопрос.

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

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

Re: Renko Levels

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

Сделал код как в tradingview .

Пофиг, всё равно пляшет.

Написал в суппорт

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

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

// AddParameter("DEMAperiod", 1);
 AddParameter("ATRperiod", 14);
// AddParameter("Sens", 1.0);

 AddSeries("RenkoBuySell", DrawAs.Custom, Color.Black, AxisType.ZeroBased);
 AddSeries("RenkoUp", DrawAs.Custom, Color.LightGray, true, Axes.Parent);
 AddSeries("RenkoDn", DrawAs.Custom, Color.LightGray, true, Axes.Parent);

 AddGlobalVariable("Global_ATR", Types.Double);
 AddGlobalVariable("Global_UP", Types.Double);
 AddGlobalVariable("Global_DN", Types.Double);
 AddGlobalVariable("Global_COLOR", Types.Int);

 
}

function Evaluate()
{
 double ATR;
 double UP;
 double DN;
 double H;
 int bs;
 var TR = 0.0;
 Color c = Color.LightGray; ;
 int Change;
 
 
  if (CurrentIndex < 1)
     ATR = Input.High[0]-Input.Low[0];
  else
  { 
     TR = ( Math.Max(Input.High[0] , Input.Close[-1]) - Math.Min(Input.Low[0], Input.Close[-1]));
      ATR = ((ATRperiod-1.0) * Global_ATR + TR)/ATRperiod;
  }
 
 
Global_ATR=ATR;

if (CurrentIndex == 0)
{

  UP = ((Input.High[0]+Input.Low[0])/2.0) + (ATR/2.0);
  DN = ((Input.High[0]+Input.Low[0])/2.0) - (ATR/2.0);
 
  H = UP - DN ;
 
  bs=0;
 }
 else
 {

  UP = RenkoUp[-1];
  DN = RenkoDn[-1];
  H= UP - DN ;
 
  bs=(int)RenkoBuySell[-1];
 }

Change = 0;

if ( (Change < 1 ) && (Input.Close[0] >= UP+H*3) )
{
    Change = 1;
    Global_COLOR = 1;
    Global_UP = UP+Global_ATR*3;
    Global_DN = UP+Global_ATR*2;
    c = Color.LightGreen;
}

if ( (Change < 1) && (Input.Close[0] <= DN-H*3) )
{
// ShowMessage("минус 3  " + (UP  + H *3) );

    Change = 1;
    Global_COLOR = 0;
    Global_DN = DN-Global_ATR*3;
    Global_UP = DN-Global_ATR*2;
    c = Color.LightCoral;
}


if ( (Change < 1) & (Input.Close[0] >= UP+H*2) )
{
// ShowMessage("плюс 2  " + (UP  + H *2) );

    Change = 1;
    Global_COLOR = 1;
    Global_UP = UP+Global_ATR*2;
    Global_DN = UP+Global_ATR;
    c = Color.LightGreen;
}

if ( (Change < 1) && (Input.Close[0] <= DN-H*2) )
{
// ShowMessage("минус 2  " + (UP  + H *2) );

    Change = 1;
    Global_COLOR = 0;
    Global_DN = DN-Global_ATR*2;
    Global_UP = DN-Global_ATR;
    c = Color.LightCoral;
}


if ( (Change < 1) && (Input.Close[0] >= UP+H) )
{
// ShowMessage("плюс 0  " + (UP  + H) );

    Change = 1;
    Global_COLOR = 1;
    Global_UP = UP+Global_ATR;
    Global_DN = UP;
    c = Color.LightGreen;
}


if ( (Change < 1) && (Input.Close[0] <= DN-H) )
{
// ShowMessage("минус 0  " + (UP  + H) );

    Change = 1;
    Global_COLOR = 0;
    Global_DN = DN-Global_ATR;
    Global_UP = DN;
    c = Color.LightCoral;
}

if (Change < 1)
{
if (Global_COLOR == 1)
{
c = Color.LightGreen;
}
else
{
c = Color.LightCoral;
}
}


//ShowMessage("усё");
// int Up, Dn;
// 
//  Up=(int)((Input.Close[0]-UP)/H); if(Up>3) Up=3;
//  Dn=(int)((DN-Input.Close[0])/H); if(Dn>3) Dn=3;
//   
//ShowMessage("UP  " + UP );
//ShowMessage("DN  " + DN );
// if(Up>0)
// {
//  UP+=Global_ATR*Up;   
//  DN=UP-Global_ATR;
// }
// if(Dn>0)
// {
//  DN-=Global_ATR*Dn;
//  UP=DN+Global_ATR;
// }
//

RenkoUp[0]=Global_UP;
RenkoDn[0]=Global_DN;
//RenkoBuySell[0]=bs;

RenkoDn.DrawChannel(RenkoUp, c, 50);
}



RenkoLevels_US.script
(3.3 КБ) 74 скачивания

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

Re: Renko Levels

Непрочитанное сообщение K_R_L » 27 дек 2021, 07:57

Допиленный вариант с ограничением выборки по параметру ATRperiod

Вопрос - а как можно сюда

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

 AddInput("Input", Inputs.Candle);


добавить другой таймфрейм.
например на графике 15 мин, делать расчет по часовому.

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

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

 AddParameter("ATRperiod", 60);
 
 AddSeries("RenkoUp", DrawAs.Custom, Color.LightGray, true, Axes.Parent);
 AddSeries("RenkoDn", DrawAs.Custom, Color.LightGray, true, Axes.Parent);

 AddGlobalVariable("Global_ATR", Types.Double);
 AddGlobalVariable("Global_UP", Types.Double);
 AddGlobalVariable("Global_DN", Types.Double);
 AddGlobalVariable("Global_COLOR", Types.Int);

 
}

function Evaluate()
{
 double ATR;
 double UP=0.00;
 double DN=0.00;
 double H=0.00;
 double ATR_Period;
 double TR = 0.0;
 Color c = Color.LightGray; ;
 int Change;
 
 
 ATR_Period = ATRperiod;
 
  if (CurrentIndex == 0)
     ATR = Input.High[0]-Input.Low[0];
  else
  { 
     TR = ( Math.Max(Input.High[0] , Input.Close[-1]) - Math.Min(Input.Low[0], Input.Close[-1]));
      ATR = ((ATR_Period-1.0) * Global_ATR + TR)/ATR_Period;
  }
 
 
Global_ATR=ATR;

if (CurrentIndex == 0)
{

 UP=(double)((Input.High[0]+Input.Low[0])/2.00) + (ATR/2.00);
 DN=(double)((Input.High[0]+Input.Low[0])/2.00) - (ATR/2.00);
 
  H = UP - DN ;
 
 }

if (CurrentIndex > ATR_Period)
 
 {

 UP=(double)(RenkoUp[-1]);
 DN=(double)(RenkoDn[-1]);
 
  H = UP - DN ;

 }
 
 
 
  if ( (CurrentIndex == 0) || (CurrentIndex > ATR_Period) )

{
 
Change = 0;

if ( (Change < 1 ) && (Input.Close[0] >= UP+H*3.00) )
{
    Change = 1;
    Global_COLOR = 1;
    Global_UP = (double) UP+Global_ATR*3.00;
    Global_DN = (double) UP+Global_ATR*2.00;
    c = Color.LightGreen;
}

if ( (Change < 1) && (Input.Close[0] <= DN-H*3.00) )
{
    Change = 1;
    Global_COLOR = 0;
    Global_DN = (double) DN-Global_ATR*3.00;
    Global_UP = (double) DN-Global_ATR*2.00;
    c = Color.LightCoral;
}


if ( (Change < 1) & (Input.Close[0] >= UP+H*2.00) )
{

    Change = 1;
    Global_COLOR = 1;
    Global_UP = (double) UP+Global_ATR*2.00;
    Global_DN = (double) UP+Global_ATR;
    c = Color.LightGreen;
}

if ( (Change < 1) && (Input.Close[0] <= DN-H*2.00) )
{
    Change = 1;
    Global_COLOR = 0;
    Global_DN = (double) DN-Global_ATR*2.00;
    Global_UP = (double) DN-Global_ATR;
    c = Color.LightCoral;
}


if ( (Change < 1) && (Input.Close[0] >= UP+H) )
{
    Change = 1;
    Global_COLOR = 1;
    Global_UP = (double) UP+Global_ATR;
    Global_DN = (double) UP;
    c = Color.LightGreen;
}


if ( (Change < 1) && (Input.Close[0] <= DN-H) )
{
    Change = 1;
    Global_COLOR = 0;
    Global_DN = (double) DN-Global_ATR;
    Global_UP = (double) DN;
    c = Color.LightCoral;
}

if (Change < 1)
{
if (Global_COLOR == 1)
{
c = Color.LightGreen;
}
else
{
c = Color.LightCoral;
}
}


RenkoUp[0]=Global_UP;
RenkoDn[0]=Global_DN;

RenkoDn.DrawChannel(RenkoUp, c, 50);
}
 }



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

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

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