Страница 1 из 1

Процентное отклонение от SMA

Добавлено: 04 ноя 2020, 16:02
BugsDigger
Простой график отклонения последнего значения данных от бегущей средней по тем же данным в процентах.

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

function Initialize()
{
 IndicatorName = "Percent";
 PriceStudy=false;
 AddInput("Input", Inputs.Price);
 AddSeries("Percent", DrawAs.Line, Color.Black, AxisType.ZeroBased);
 AddParameter("Period", 10);
 AddLevel(0.0, Color.Black, "Percent");
}

function Evaluate()
{
 if(CurrentIndex<=Period) return;
 double t=SMA(Input, Period)[-1];
 Percent[0]=(t!=0.0 ? (Input[0]-t)/Math.Abs(t)*100.0 : 0.0);
}

В представленном варианте сравниваем со SMA[-1], т.е. SMA без учета последней (текущей) точки данных.
Конечно, вместо SMA можно вписать и любой другой фильтр, однако SMA, призванный дать "консервативное" базовое значение для счета отклонения от него, как мне кажется, весьма подходит на эту роль.

Безымянный.png

На скриншоте - Percent(90) и для наглядности SMA с тем же периодом.

Что м.б. полезно:
- визуальная оценка волатильности, на основе которой можно прикинуть отступ для стопа;
- получить оценку того, втягивается ли индикатор в область цен. Бич простых сглаживающих индикаторов - длинный тренд, когда цена колеблется вокруг монотонно движущегося в одном направлении индикатора, давая много пересечений и, соответственно, ложных пробоев. Можно попробовать задаться порогом отклонения цены от индикатора: если отклонение становится больше порога - пробой, иначе следует ориентироваться на знак производной индикатора (т.е. растет или падает сам индикатор).
- можно применить к графику объема, чтобы выделить вступление "большого игрока" или просто возрастание активности торгов после "мертвого сезона", когда цены бессистемно колеблются на малых объемах.

Update: подправил для правильного счета процентов при отрицательных значениях среднего и при нулевом среднем.
Update: стоит иметь в виду, что если входной ряд знакопеременный, то в какие-то моменты он переходит через 0 или близкое к нулю значение, так что это малое значение появляется при расчете процента в знаменателе; это дает большой (и чаще всего нерелевантный) пик на выходе.

Re: Процентное отклонение от SMA

Добавлено: 29 ноя 2020, 22:22
G.O.D.
ДОбрый день.
помогите пожалуйста, записать индекатор процентного отклонения ADX

Re: Процентное отклонение от SMA

Добавлено: 30 ноя 2020, 15:04
BugsDigger
В каком смысле? Применить этот индикатор к ADX ?

Для этого ничего писать не надо. Выбираете ADX к нужному инструменту, потом добавляете этот индикатор (Percent), в качестве входного ряда к нему в выпадающем списке выбираете ряд ADX.ADX, настраиваете период. Будет вычисляться отклонение в процентах ряда ADX.ADX от ряда SMA(ADX.ADX). Всё как всегда.

Или вы что-то другое имели в виду?

Re: Процентное отклонение от SMA

Добавлено: 04 дек 2020, 23:17
G.O.D.
когда включен индикатор, в нем можно вбирать не только цену закрытия и тд. если еще открыть в графике индикатор АДХ, то можно и выбрать АДХ и он показывает интересную картину.вот именно этот индикатор я и спрашивал, как можно сделать, чтобы он показывал отклонения АДХ, как это показано на рисунке.
adx.gif

Re: Процентное отклонение от SMA

Добавлено: 05 дек 2020, 08:35
BugsDigger
Ну да, это ровно то, что я описал в ответе: получится процентное отклонение ряда ADX.ADX от простой бегущей средней от него же, т.е. от SMA(ADX.ADX).

ОК?

Re: Процентное отклонение от SMA

Добавлено: 12 дек 2020, 15:50
G.O.D.
Да, можно выбрать в окне ADX и визуально это будет уже доступно, но, данную функцию планировалось использовать в создании робота. а при создании стратегии функцию отклонения ADX от SMA выбрать не удалось, так как, как я подозреваю, это не предусматривалось при написании индикатора.
Или это возможно в текущей версии индикатора?

Re: Процентное отклонение от SMA

Добавлено: 13 дек 2020, 10:49
BugsDigger
Чтобы в коде стратегии вызвать индикатор от другого индикатора, пишем (см. "Вызов индикатора от индикатора" в документе "Скрипты индикаторов и стратегий"):

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

 var IndADX=ADX(Input, 240).GetValue("ADX"); // счет ADX, затем из него берем только ряд ADX (там есть еще 2 других ряда)
 var IndPrc=MY.Percent(IndADX, 240);
 double p=IndPrc[0]; // используем значение

Если бы в ADX был бы только один выходной ряд, то GetValue был бы ненужен.

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