15.03.2022
0
4
0
80

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);

		}
	}
}

0 Yorum