True Strength Index (TSI), -100 ve +100 sınırları arasında değişen ve 0 taban değerine sahip bir momentum osilatörüdür.
Osilatör pozitif olduğunda momentum pozitiftir (ayı piyasası önyargılarına işaret etmektedir) ve tersi. de geçerlidir.
William Blau tarafından geliştirilmiştir ve 2 çizgiden oluşur.
Analistler aşırı alım, aşırı satım, merkez çizgisi kesişmesi, ayrışma ve sinyal çizgisi kesişmesi gibi 5 durumdan birini ararlar.
Gösterge genellikle diğer sinyallerle birlikte kullanılır.
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using Matriks.Data.Identifiers;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
/*
TSI - True Strength Index - Gerçek Güç Endeksi
True Strength Index (TSI), -100 ve +100 sınırları arasında değişen ve 0 taban değerine sahip bir momentum osilatörüdür.
Osilatör pozitif olduğunda momentum pozitiftir (ayı piyasası önyargılarına işaret etmektedir) ve tersi. de geçerlidir.
William Blau tarafından geliştirilmiştir ve 2 çizgiden oluşur.
Analistler aşırı alım, aşırı satım, merkez çizgisi kesişmesi, ayrışma ve sinyal çizgisi kesişmesi gibi 5 durumdan birini ararlar.
Gösterge genellikle diğer sinyallerle birlikte kullanılır.
Formül
MP:=INPUT("Momentum P",1,100,1);
FSP:=INPUT("1st Smoothing P",1,100,25);
SSP:=INPUT("2nd Smoothing P",1,100,13);
SGLP:=INPUT("Signal Line P",1,100,7);
PC:=(C-REF(C,-MP));
FSPC:=MOV(PC,FSP,E);
SSPC:=MOV(FSPC,SSP,E);
APC:=ABS(C-REF(C,-MP));
AFSPC:=MOV(APC,FSP,E);
ASSPC:=MOV(AFSPC,SSP,E);
TSI:=100*(SSPC/ASSPC);
SGL:=MOV(TSI,SGLP,E);
TSI;
SGL;
0
*/
namespace Matriks.Lean.Algotrader
{
//Ilk parametre indikatörün adı, sınıfın adıyla aynı olmalıdır.
//Ikinci parametre indikatörün Dataserisinin üzerine mi yeni pencereye mi ekleneceğini belirtir. Yeni pencere için ->IndicatorDrawingArea.NewWindow , Data Serisi için IndicatorDrawingArea.OnDataSeries
[IndicatorInformationAttribute("TSIKripex", IndicatorDrawingArea.NewWindow)]
//Indikatörün çizgilerinin isimleri
[IndicatorLineInformationAttribute(new []
{
"TSI (0,1,2,4)", "Signal (3,4)"
})]
public class TSIKripex : MatriksIndicator
{
//Indicator opsiyon panelinde değerleri değiştirebildiğimiz parametreler. Int, Bool, Decimal ve Enum değerleri alabilir.Tüm değişken tiplerini DefaultValue ile tanımlarız.
[DefaultValue(1)]
public int MomPeriod
{
get; set;
}
[DefaultValue(25)]
public int UzunPeriod
{
get; set;
}
[DefaultValue(13)]
public int KisaPeriod
{
get; set;
}
[DefaultValue(7)]
public int SignalPeriod
{
get; set;
}
[DefaultValue(MovMethod.Exponential)]
public MovMethod MovMethod
{
get; set;
}
MOV movUzun, movKisa, movUzunABS, movKisaABS, movSignal;
public sealed override void OnInit()
{
movUzun = new MOV(UzunPeriod, MovMethod);
movKisa = new MOV(KisaPeriod, MovMethod);
movUzunABS = new MOV(UzunPeriod, MovMethod);
movKisaABS = new MOV(KisaPeriod, MovMethod);
movSignal = new MOV(SignalPeriod, MovMethod);
DrawHorizantal(0);
}
public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
{
/*
PC:=(C-REF(C,-MP));
FSPC:=MOV(PC,FSP,E);
SSPC:=MOV(FSPC,SSP,E);
*/
var close = Instrument.SymbolBarData.Close[currentBar];
var prevClose = Instrument.SymbolBarData.Close.ContainsKey(currentBar - MomPeriod) ? Instrument.SymbolBarData.Close[currentBar - MomPeriod] :0;
var PC = close - prevClose;
movUzun.Update(PC, currentBar, barDateTime);
movKisa.Update(movUzun.CurrentValue, currentBar, barDateTime);
/*
APC:=ABS(C-REF(C,-MP));
AFSPC:=MOV(APC,FSP,E);
ASSPC:=MOV(AFSPC,SSP,E);
*/
var PCABS = Math.Abs(PC);
movUzunABS.Update(PCABS, currentBar, barDateTime);
movKisaABS.Update(movUzunABS.CurrentValue, currentBar, barDateTime);
if (currentBar < UzunPeriod)
{
SetLine(0, currentBar, 0);
SetLine(1, currentBar, 0);
return ;
}
/*
TSI:=100*(SSPC/ASSPC);
SGL:=MOV(TSI,SGLP,E);
*/
var TSI = movKisaABS.CurrentValue != 0? (100 * (movKisa.CurrentValue / movKisaABS.CurrentValue)) :0;
movSignal.Update(TSI, currentBar, barDateTime);
SetLine(0, currentBar, TSI);
SetLine(1, currentBar, movSignal.CurrentValue);
}
}
}