Пользовательские индикаторы > Volatility Stop (VStop) - определение тренда через волатильность

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение evge » 02 мар 2018, 13:44

Volatility Stop (VStop) - трендовый индикатор. Определяет смену направления тренда через волатильность.

Параметры

length - период для ATR
mult - коэф. для определения смены направления

Пример работы

VStop-02.png
VStop-02.png (32.28 КБ) 28327 просмотров

VStop-01.png
VStop-01.png (31.92 КБ) 28344 просмотра


Исходный код

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

function Initialize()
{
IndicatorName = "VStop";   
PriceStudy = true;   
AddInput("I", Inputs.Candle);
AddSeries("vstop", DrawAs.Line, Color.Red, false);   
AddSeries("Up", DrawAs.Custom, Color.Green);   
AddSeries("Dn", DrawAs.Custom, Color.Red);

AddParameter("length", 20);
AddParameter("mult", 2);

AddGlobalVariable("is_uptrend", Types.Boolean, false);
AddGlobalVariable("is_uptrend_prev", Types.Boolean, false);
AddGlobalVariable("max_", Types.Double, 0.0);
AddGlobalVariable("min_", Types.Double, 0.0);
AddGlobalVariable("c", Types.Int, 0);
}

function Evaluate()
{

// evge 02.03.2018 http://alfadirect4.ru

var atr_ = ATR(I, length);

double max1 = Math.Max(max_, I.Close[0]);
double min1 = Math.Min(min_, I.Close[0]);

is_uptrend_prev = is_uptrend;

double stop = is_uptrend_prev ? max1 - mult * atr_[0] : min1 + mult * atr_[0];
double vstop_prev = CurrentIndex > length ? vstop[1] : 0.0;
double vstop1 = is_uptrend_prev ? Math.Max(vstop_prev, stop) : Math.Min(vstop_prev, stop);
is_uptrend = (I.Close[0] - vstop1) >= 0;
bool is_trend_changed = is_uptrend != is_uptrend_prev;
max_ = is_trend_changed ? I.Close[0] : max1;
min_ = is_trend_changed ? I.Close[0] : min1;
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1;

c += is_uptrend != is_uptrend_prev ? -c : 1;

if (is_uptrend)
   { Up[0] = vstop[0]; if (c > 0) Up.DrawLine(); }
   else
   { Dn[0] = vstop[0]; if (c > 0) Dn.DrawLine(); }

}


Скачать индикатор

VStop.zip
(61.55 КБ) 1301 скачивание
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение evge » 02 мар 2018, 16:14

Исправил немного код, будет выводится как на первой картинке, вторая картинка это от старого варианта.
Причина в рисовании на 1 бар задним числом, что не очень хорошо, если кто-то захочет использовать индикатор в стратегии.
никогда такого не было и вот опять

Ivan
Сообщения: 5
Зарегистрирован: 27 фев 2018, 13:13
Благодарил (а): 1 раз

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение Ivan » 02 мар 2018, 22:39

Искренне благодарю. Я так понял, что отсчет идет по закрытию свечи. Если Вас не затруднит, нельзя ли внести модификацию в отображаемых настройках индикатора по отсчету O or H, or L or C. Еще раз спасибо.

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение evge » 03 мар 2018, 08:44

Внесу, если пойму вашу идею. Можно поподробнее?
никогда такого не было и вот опять

Ivan
Сообщения: 5
Зарегистрирован: 27 фев 2018, 13:13
Благодарил (а): 1 раз

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение Ivan » 03 мар 2018, 09:15

Индикатор отсчитывает по закрытию свечи. Суть изменений в том, чтобы индикатор брал в качестве исходных данных не только закрытие, но и/или Хай,Лоу и Открытие.При этом, чтобы была возможность выбирать в настройках не только период АТР и коэф. для определения смены направления, как сейчас,но и источник, то есть свеча по закрытию, по открытию, по хайю, по лоу,.То есть, источник данных вариативен и вместо КэндлКлоуз есть выбор). Это, в принципе, минимальный и достаточный вариант улучшения.
Последний раз редактировалось Ivan 04 мар 2018, 12:45, всего редактировалось 1 раз.

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение evge » 03 мар 2018, 10:28

Вывел в настройки OHLC, можете задать сами какие интересуют данные бара

их среднее ариф. значение будет взято в расчеты.

Параметры O, H, L, C задаются как 0, либо любое другое значение (например 1).

0 - не использовать в расчете
1 или др. число - использовать в расчете


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

function Initialize()
{
IndicatorName = "VStop";   
PriceStudy = true;   
AddInput("I", Inputs.Candle);
AddSeries("vstop", DrawAs.Line, Color.Red, false);   
AddSeries("Up", DrawAs.Custom, Color.Green);   
AddSeries("Dn", DrawAs.Custom, Color.Red);

AddParameter("length", 20);
AddParameter("mult", 2);
AddParameter("O", 0); // 0 - off, 1 - on
AddParameter("H", 0); // 0 - off, 1 - on
AddParameter("L", 0); // 0 - off, 1 - on
AddParameter("C", 1); // 0 - off, 1 - on

AddGlobalVariable("is_uptrend", Types.Boolean, false);
AddGlobalVariable("is_uptrend_prev", Types.Boolean, false);
AddGlobalVariable("max_", Types.Double, 0.0);
AddGlobalVariable("min_", Types.Double, 0.0);
AddGlobalVariable("c", Types.Int, 0);
}

function Evaluate()
{

// evge 03.03.2018 http://alfadirect4.ru

var atr_ = ATR(I, length);

double d = ((O != 0 ? 1 : 0) + (H != 0 ? 1 : 0) + (L != 0 ? 1 : 0) + (C != 0 ? 1 : 0));
double price = ((O != 0 ? I.Open[0] : 0) + (H != 0 ? I.High[0] : 0) + (L != 0 ? I.Low[0] : 0) + (C != 0 ? I.Close[0] : 0)) / (d == 0 ? 1 : d);

price = price == 0 ? I.Close[0] : price;
     
double max1 = Math.Max(max_, price);
double min1 = Math.Min(min_, price);

is_uptrend_prev = is_uptrend;

double stop = is_uptrend_prev ? max1 - mult * atr_[0] : min1 + mult * atr_[0];
double vstop_prev = CurrentIndex > length ? vstop[1] : 0.0;
double vstop1 = is_uptrend_prev ? Math.Max(vstop_prev, stop) : Math.Min(vstop_prev, stop);
is_uptrend = (price - vstop1) >= 0;
bool is_trend_changed = is_uptrend != is_uptrend_prev;
max_ = is_trend_changed ? price : max1;
min_ = is_trend_changed ? price : min1;
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1;

c += is_uptrend != is_uptrend_prev ? -c : 1;

if (is_uptrend)
   { Up[0] = vstop[0]; if (c > 0) Up.DrawLine(); }
   else
   { Dn[0] = vstop[0]; if (c > 0) Dn.DrawLine(); }

}


VStop-03-03-2018.zip
(61.66 КБ) 1087 скачиваний
никогда такого не было и вот опять

Ivan
Сообщения: 5
Зарегистрирован: 27 фев 2018, 13:13
Благодарил (а): 1 раз

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение Ivan » 03 мар 2018, 10:45

Респект. Отлично, даже лучше чем ожидалось. Спасибо. Успехов Вам.

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение evge » 07 мар 2018, 13:17

Добавлена возможность задать период для расчета среднего значения за N последних баров.

VStop-03.png
period = 10
VStop-03.png (31.64 КБ) 28175 просмотров


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

function Initialize()
{
IndicatorName = "VStop";   
PriceStudy = true;   
AddInput("I", Inputs.Candle);
AddSeries("vstop", DrawAs.Line, Color.Red, false);   
AddSeries("Up", DrawAs.Custom, Color.Green);   
AddSeries("Dn", DrawAs.Custom, Color.Red);

AddParameter("length", 20);    // atr
AddParameter("mult", 2);       // atr mult
AddParameter("period", 1);       // average sum bars
AddParameter("O", 0); // 0 - off, 1 - on
AddParameter("H", 0); // 0 - off, 1 - on
AddParameter("L", 0); // 0 - off, 1 - on
AddParameter("C", 1); // 0 - off, 1 - on

AddGlobalVariable("is_uptrend", Types.Boolean, false);
AddGlobalVariable("is_uptrend_prev", Types.Boolean, false);
AddGlobalVariable("max_", Types.Double, 0.0);
AddGlobalVariable("min_", Types.Double, 0.0);
AddGlobalVariable("c", Types.Int, 0);
AddGlobalVariable("sum", Types.DoubleList);
}

function Evaluate()
{

// evge 07.03.2018 http://alfadirect4.ru
// ver 1.2
//   добавлен период усреднения, кол-во баров

var atr_ = ATR(I, length);

double d = ((O != 0 ? 1 : 0) + (H != 0 ? 1 : 0) + (L != 0 ? 1 : 0) + (C != 0 ? 1 : 0));
double price = ((O != 0 ? I.Open[0] : 0) + (H != 0 ? I.High[0] : 0) + (L != 0 ? I.Low[0] : 0) + (C != 0 ? I.Close[0] : 0)) / (d == 0 ? 1 : d);

sum.Add(price);
if (sum.Count > period) sum.RemoveAt(0);

price = sum.Average(x=>x);

price = price == 0 ? I.Close[0] : price;
     
double max1 = Math.Max(max_, price);
double min1 = Math.Min(min_, price);

is_uptrend_prev = is_uptrend;

double stop = is_uptrend_prev ? max1 - mult * atr_[0] : min1 + mult * atr_[0];
double vstop_prev = CurrentIndex > length ? vstop[1] : 0.0;
double vstop1 = is_uptrend_prev ? Math.Max(vstop_prev, stop) : Math.Min(vstop_prev, stop);
is_uptrend = (price - vstop1) >= 0;
bool is_trend_changed = is_uptrend != is_uptrend_prev;
max_ = is_trend_changed ? price : max1;
min_ = is_trend_changed ? price : min1;
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1;

c += is_uptrend != is_uptrend_prev ? -c : 1;

if (is_uptrend)
   { Up[0] = vstop[0]; if (c > 0) Up.DrawLine(); }
   else
   { Dn[0] = vstop[0]; if (c > 0) Dn.DrawLine(); }

}


VStop-07-03-2018.zip
(31.93 КБ) 1157 скачиваний
никогда такого не было и вот опять

m4Dmitry
Сообщения: 72
Зарегистрирован: 21 май 2018, 22:04
Благодарил (а): 60 раз
Поблагодарили: 3 раза

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение m4Dmitry » 10 июл 2018, 23:13

evge

А можно простую стратегию для робота написать по такому индикатору?

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Volatility Stop (VStop) - определение тренда через волатильность

Непрочитанное сообщение evge » 11 июл 2018, 17:30

тогда надо описать простые условия для входа \ выхода по индикатору.

т.е. расшифровать слово "простая"

опишите, я помогу превратить это в код.
никогда такого не было и вот опять


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

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

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