Для построения необходим Momentum с периодом 1 и Momentum по модулю с периодом 1. т.е. разность между Close текущего и Close предыдущего бара и она же по модулю.
Формула
TSI = 100 * EMA(EMA(Momentum, First_R), Second_S) / EMA(EMA(|Momentum|, First_R), Second_S)
Параметры
First_R – период первого сглаживания EMA;
Second_S – интервал второго усреднения EMA.
Код индикатора можно собрать в 1 строку если бы был индикатор Momentum по модулю.
Поэтому для упрощения создано 2 индикатора. Недостающий Momentum по модулю и собственно сам индикатор TSI, основной код которого уместился в 1 строку.
Пример
Код: Выделить всё
function Initialize()
{
IndicatorName = "MomentumR";
AddInput("Input", Inputs.Price);
AddParameter("Period", 20, 1);
PriceStudy = false;
AddSeries("Momentum", DrawAs.Line, Color.Coral);
AddLevel(0, Color.Gray, "Momentum");
}
function Evaluate()
{
// evge 26.10.2017 http://alfadirect4.ru
if (CurrentIndex <= Period)
Momentum = 0.0;
else
Momentum = Math.Abs(Input[0] - Input[Period]);
}
Код: Выделить всё
function Initialize()
{
IndicatorName = "TSI";
PriceStudy = false;
AddInput("I", Inputs.Candle);
AddSeries("TSI", DrawAs.Line, Color.Red);
AddParameter("First_R", 20);
AddParameter("Second_S", 30);
}
function Evaluate()
{
// evge 26.10.2017 http://alfadirect4.ru
TSI[0] = 100 * EMA(EMA(MOMENTUM(I.Close, 1), First_R), Second_S)[0] / EMA(EMA(MY.MomentumR(I.Close, 1), First_R), Second_S);
}
Скачать исходный текст