Код: Выделить всё
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, призванный дать "консервативное" базовое значение для счета отклонения от него, как мне кажется, весьма подходит на эту роль.
На скриншоте - Percent(90) и для наглядности SMA с тем же периодом.
Что м.б. полезно:
- визуальная оценка волатильности, на основе которой можно прикинуть отступ для стопа;
- получить оценку того, втягивается ли индикатор в область цен. Бич простых сглаживающих индикаторов - длинный тренд, когда цена колеблется вокруг монотонно движущегося в одном направлении индикатора, давая много пересечений и, соответственно, ложных пробоев. Можно попробовать задаться порогом отклонения цены от индикатора: если отклонение становится больше порога - пробой, иначе следует ориентироваться на знак производной индикатора (т.е. растет или падает сам индикатор).
- можно применить к графику объема, чтобы выделить вступление "большого игрока" или просто возрастание активности торгов после "мертвого сезона", когда цены бессистемно колеблются на малых объемах.
Update: подправил для правильного счета процентов при отрицательных значениях среднего и при нулевом среднем.
Update: стоит иметь в виду, что если входной ряд знакопеременный, то в какие-то моменты он переходит через 0 или близкое к нулю значение, так что это малое значение появляется при расчете процента в знаменателе; это дает большой (и чаще всего нерелевантный) пик на выходе.