Пользовательские индикаторы > Renko Levels
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Renko Levels
Нет, "может" в програмировании не действует.
Ларчик-то просто открывается: не следует ставить параметр Sens больше ... цен инструмента или многкратно больше ожидаемого ATR. Иначе "толщина" первого кирпича надолго или даже навсегда охватит все цены, и индикатор никогда не сдвинется с мертвой точки (цены никогда не выйдут из коридора). В этом случае цвет остается серым (раскраску серым я оставил в коде на всякий случай - и вот он реализовался).
В случае ВТБ приемлемый уровень Sens=0.0001. а не 1 рупь, который стоит по умолчанию (при цене бумаги в 5 копеек).
Насчет сравнения с исходной реализацией в другой системе. Если уж сравнивать, то в равных условиях, т.е. выключить дополнительные фичи сглаживания цен закрытия и порога чувствительности (сделать DEMA=0 и Sens=0). Иначе сравнение будет заведомо некорректным.
Ларчик-то просто открывается: не следует ставить параметр Sens больше ... цен инструмента или многкратно больше ожидаемого ATR. Иначе "толщина" первого кирпича надолго или даже навсегда охватит все цены, и индикатор никогда не сдвинется с мертвой точки (цены никогда не выйдут из коридора). В этом случае цвет остается серым (раскраску серым я оставил в коде на всякий случай - и вот он реализовался).
В случае ВТБ приемлемый уровень Sens=0.0001. а не 1 рупь, который стоит по умолчанию (при цене бумаги в 5 копеек).
Насчет сравнения с исходной реализацией в другой системе. Если уж сравнивать, то в равных условиях, т.е. выключить дополнительные фичи сглаживания цен закрытия и порога чувствительности (сделать DEMA=0 и Sens=0). Иначе сравнение будет заведомо некорректным.
Re: Renko Levels
DEMA<2 вроде Как обрабатываться не должно.
Sens - без него посмотрю, вечером.
Спросил про double- для большей точности со знаком после запятой, для втб с его нулями актуально, да и для интер рао с системой тоже. Там шаг примерно 0,045 и 0,25 соответсвенно в классическом ренко для текущих цен.
Sens - без него посмотрю, вечером.
Спросил про double- для большей точности со знаком после запятой, для втб с его нулями актуально, да и для интер рао с системой тоже. Там шаг примерно 0,045 и 0,25 соответсвенно в классическом ренко для текущих цен.
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Renko Levels
Сравнение оригинального индикатора и парированного без учета Sens и DEMA
оригинал
портированный на весь экран
портированный в окне поменьше
портированный в окне поменьше с небольшим сдвигом
результат стремноватый прям скажем.
За оригиналом смотрю, его так не колбасит.
Не понятно, это проблема AD ?
оригинал
портированный на весь экран
портированный в окне поменьше
портированный в окне поменьше с небольшим сдвигом
результат стремноватый прям скажем.
За оригиналом смотрю, его так не колбасит.
Не понятно, это проблема AD ?
Последний раз редактировалось K_R_L 01 янв 2022, 10:20, всего редактировалось 2 раза.
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Renko Levels
Я уже объяснял причину и возможный обход проблемы (не блестящий с принципиальной точки зрения, но пригодный практически), почитайте внимательнее.
viewtopic.php?f=4&t=1161&start=10#p6436
viewtopic.php?f=4&t=1161&start=10#p6436
Re: Renko Levels
BugsDigger писал(а):Я уже объяснял причину и возможный обход проблемы (не блестящий с принципиальной точки зрения, но пригодный практически), почитайте внимательнее.
viewtopic.php?f=4&t=1161&start=10#p6436
я с tradingview сравниваю.
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Renko Levels
Я не знаю, как там устроены вычисления. Например, начальная точка счета м.б. зафиксирована, дальше данные только досчитываются. В этом случае существует иллюзия стабильных результатов; именно иллюзия, поскольку индикатор принципиально "неустойчивый" в том смысле, как было подробно описано ранее. Если сменить начальную точку, то положения и цвет "кирпичей" поменяются и там, зуб даю, как говорится.
В АД, если не применять описанный обход проблемы фиксацией начальной точки (хотя бы временной - на один или несколько рабочих дней), начальная точка счета меняется:
- на каждом следующем баре при работе в реальном времени;
- при листании графика взад-вперед; в этом случае, правда, не при каждом перелистывании, а после перелистывания нескольких (2-3) экранов.
Вы скажете: ну вот же я вижу, тут все идет одинаково, а вот тут вдруг результаты разные. На самом деле НЕодинаково, уровни разные, пусть это и незаметно для глаза. Достаточно разницы уровня в одну миллионную, чтобы цена закрытия оказалась в одном терминале внутри, а в другом - за пределами "кирпича", что во втором случае приведет к скачку (перевороту направления), после чего результаты уже наглядно разойдутся. А "одинаково" (но на самом деле все равно не до конца, т.к. уровни все равно хоть немного, но различаются) они ведут себя в моменты резких скачков, когда даже при некоторой разности в положении и толщине предыдущего кирпича, индикатор начинает откладывать следующие кирпичи в направлении этого скачка.
Принципиальным решением было бы избавление от зависимости от начальной точки, но как это сделать - большой вопрос.
Также можно было бы попросить разработчиков (уже сделано) дать пользователю в руки возможность управления пресловутой начальной точкой. Но вероятность того, что это будет реализовано, стремится к нулю, поскольку вопрос этот не имеет универсального хорошего решения.
В АД, если не применять описанный обход проблемы фиксацией начальной точки (хотя бы временной - на один или несколько рабочих дней), начальная точка счета меняется:
- на каждом следующем баре при работе в реальном времени;
- при листании графика взад-вперед; в этом случае, правда, не при каждом перелистывании, а после перелистывания нескольких (2-3) экранов.
Вы скажете: ну вот же я вижу, тут все идет одинаково, а вот тут вдруг результаты разные. На самом деле НЕодинаково, уровни разные, пусть это и незаметно для глаза. Достаточно разницы уровня в одну миллионную, чтобы цена закрытия оказалась в одном терминале внутри, а в другом - за пределами "кирпича", что во втором случае приведет к скачку (перевороту направления), после чего результаты уже наглядно разойдутся. А "одинаково" (но на самом деле все равно не до конца, т.к. уровни все равно хоть немного, но различаются) они ведут себя в моменты резких скачков, когда даже при некоторой разности в положении и толщине предыдущего кирпича, индикатор начинает откладывать следующие кирпичи в направлении этого скачка.
Принципиальным решением было бы избавление от зависимости от начальной точки, но как это сделать - большой вопрос.
Также можно было бы попросить разработчиков (уже сделано) дать пользователю в руки возможность управления пресловутой начальной точкой. Но вероятность того, что это будет реализовано, стремится к нулю, поскольку вопрос этот не имеет универсального хорошего решения.
Re: Renko Levels
Сделал код как в 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);
}
Re: Renko Levels
Допиленный вариант с ограничением выборки по параметру ATRperiod
Вопрос - а как можно сюда
добавить другой таймфрейм.
например на графике 15 мин, делать расчет по часовому.
Вопрос - а как можно сюда
Код: Выделить всё
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);
}
}
Вернуться в «Пользовательские индикаторы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей