1 beğenilme 0 beğenilmeme
1,036 kez görüntülendi
Merhaba

ichimoku indikatörü içerisinde yer alan tenkansen, kijunsen, chikouspan, senkounspan A ve senkouspan B çizgilerinin anlık değerlerini value olarak (örneğin ichimoku.SenkaSenBValue) alabiliyorum. Fakat ref() ya da crossabove() gibi komutlara value olarak giremeyeceğim için bu komutları sözkonusu çizgiler ile çalıştıramıyorum.

örneğin

- if (CrossAbove(ichimoku.SenkouSpanA, ichimoku.SenkouSpanB))

şeklinde girdiğim bir komut çalışmıyor. Burada "ichimoku.SenkouSpanA"  yerine yazmam gereken sey nedir?

iyi calismalar.
Algoritmik Trading kategorisinde (38 puan) tarafından | 1,036 kez görüntülendi
1 0

merhaba, konuyla ilgili belki yardımım dokunabilir.

öncelikli olarak belirtmem gerekir ki ben yazılımcı vs değilim. Kod bilgim çok zayıf, ben de yeni öğreniyorum buradaki çoğu kişi gibi. o yüzden tam olarak istediğiniz şey olmayabilir. en azından fikir verir. 

Span A,B değerlerinin 1 barlık Hareketli ortalamasını alın. yani bu değerleri MOV indikatörüne gömün. 1 barlık herhangi bir hareketli ortalama yöntemi kendi değerini verir zaten. Cross Ref fonksiyonları indikatör değeri vs istiyor. Bizim Kullanmak istediğimiz Span A,B değerlerini MOV içine gömmüştük zaten. olay tamam yani, şimdi Cross ve Ref fonksiyonlarının kafasına vurup al ulen sana indikatör diyebilirsiniz :))) 

indikatörü eklerken adını dstk1 yapın yoksa hata verir

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;
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("dstk1", IndicatorDrawingArea.NewWindow)]
	//Indikatörün çizgilerinin isimleri
	[IndicatorLineInformationAttribute(new []
		{
			"dstk1(0)"
		})]

	public class dstk1 : 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(5)]
			public int Period
		{
			get; set;
		}
		public decimal res
		{
			get; set;
		}
		MOV mov;

		MOV mov2;

		IchiMoku ichiMoku;

		public sealed override void OnInit()
		{
			mov = new MOV(1, MovMethod.Simple);

			mov2 = new MOV(1, MovMethod.Simple);

			ichiMoku = IchiMokuIndicator(Symbol, SymbolPeriod, 9, 26, 26, 52, 26);

		}

		/// <summary>
		/// Seçilen sembolün bardata'ları güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="currentBar">Güncellenen bardata'nın indexteki sırası</param>
		/// <param name="inputValue">Seçilen OHLC tipine göre gelen bardata'nın o anki değeri</param>
		/// <param name="barDateTime">Bardata'ya gelen güncelleme zamanı</param>
		public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
		{
			SetLine(currentBar, 0);

			decimal k = ichiMoku.SenkouSpanAValue;
			decimal l = ichiMoku.SenkouSpanBValue;
			mov.Update(k, currentBar, barDateTime);
			mov2.Update(l, currentBar, barDateTime);
			if (currentBar < Period)
			{
				return ;
			}

			if (Input.Count >= Period)
			{
				if (CrossAbove(mov, mov2)) // kullandığın periyoda göre Span A,B için Ref() ayarlarsın
				{                         // Ref(mov,-1) Ref(mov2,-1) yapıp Span A,B 1 önceki değeri alabilirsin
					res = 1;

				}
				else res = 0;
				SetLine(currentBar, res);

			}


		}
	}
}

 

0 0
İşe yaradı, şuan hata vermiyor. Çok teşekkür ederim.

1 cevap

1 beğenilme 0 beğenilmeme
En İyi Cevap

Iyi aksamlar, cross fonksiyonunun icerisine Intellisense ile baktigimizda asagidaki gibi indicator ile indicator, ya da diger belirtilen degerlerle yazilmasi gerektigi gozukuyor. (yukari asagi oklarina tiklayarak alabilecegi degerleri gorebilirsiniz)

Bu yuzden dediginiz gibi CrossAbove(ichimoku.SenkaSenAValue, ichimoku.SenkaSenBValue) yapamiyoruz, cunku bunlar decimal degerler veriyor ve 2 sabit degerin birbirini cross edip etmedigini bilemeyiz. Bunun icin seri degerlere ihtiyacimiz var.

Yani Ichimoku indikatoru icerisinde bu degerler seri olarak saklansaydi dediginiz gibi yapabilirdik. Fakat bu degerler mevcut degil / erisim yok.

Bu yuzden if (ichiMoku.SenkouSpanAValue > ichiMoku.SenkouSpanBValue) seklinde bir yol izlemeniz uygun olacaktir. Bu cross gibi calismayacak ama orn. bir pozisyon flag'i koyarak ayni sonuca rahatlikla ulasabilirsiniz.

Cross degil de relational operatorlerle (<, >...) islem yapan stratejilere ornek olarak Kademeli_Bitmex ve KaliciGeciciSinyal stratejilerine bakabilirsiniz.

if (barData.IsNewBar == true || startflag == 0)
{
	startflag = 1;
	Debug("***");
}

if (mov.CurrentValue < close && startflag == 1)
{
	Debug("Close @ " + close + " is ABOVE move @ " + mov.CurrentValue);
	if (counter < BuyCounter)
	{
		SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
		counter++;
		Debug(Symbol + ", Alış Emri Gönderildi");
		Debug("*******************");
	}
	if (counter >= BuyCounter)
	{
		Debug(Symbol + " Hissesi için Belirlenen üst alım limitine ulaşıldı. Alış Emri GÖNDERİLMEDİ");
		Debug("*******************");
	}
}

if (mov.CurrentValue > close && startflag == 1)
{
	Debug("Counter = " + counter);
	if (counter > SellCounter)
	{
		SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
		counter--;
		Debug(Symbol + ", Satış Emri Gönderildi");
		Debug("*******************");
	}
	if (counter <= SellCounter)
	{
		Debug(Symbol + " Hissesi için Belirlenen üst satım limitine ulaşıldı. Satış Emri GÖNDERİLMEDİ");
		Debug("*******************");
	}
}
(8,035 puan) tarafından
tarafından seçilmiş
0 0
Peki, Ichimoku indikatoru icerisinde bu degerleri seri olarak saklaya bilecek şekilde; indikatörde, bir takım değişiklikler yapılabilir mi? indikatör tekrar yazılabilir ya da kodlarına bir kaç dokunuş ile uygun şekilde değiştirilebilir mi?
1 0
Eger relational operator kullanmak istemiyorsaniz, ref ve cross kullanmak istiyorsaniz, o zaman dediginiz gibi seriye aktarmaniz gerekiyor. Bunun icin yukarida kullanicimizin onerisini uygulayabilirsiniz. Bu cevapta cozum ayri bir indikator ile yapilmis. Ayri bir indikator yazmadan direkt strateji icinde de degerleri seriye ekleyebilirsiniz (mov.update ile). Bu arada gomulu olan Ichimoku indikatoru icin de degerleri acabilir miyiz bakiyorum. Yalniz bunun icin sonraki versiyonu beklemeniz gerekecek.
0 0

Ichimoku için değerleri açarken bir sonraki versiyonda "Cloud(Senkospan A-B) ve Chikospan" için de offset veya displacement değerlerini de değiştirilebilir (optimize edilebilir) hale getirebilirseniz çok memnun olurum. Bunun dışında renkoyu da hem Matriks IQ hem de Matriks Prime için kullanılabilir olmasını en kısa sürede rica ediyorum. İyi çalışmalar...

veya bu düşünce ile ben de ichimoku için bir kod yazmayı denedim ancak çalıştıramadım. Hatamı da bulamıyorum. Yardımcı olursanız çok memnun olurum. 

 

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;
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("TKCSS", IndicatorDrawingArea.OnDataSeries)]
	//Indikatörün çizgilerinin isimleri
	[IndicatorLineInformationAttribute(new []
		{
			"TKCSS(0)"
		})]

	public class TKCSS : 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(9)]
			public int PeriodFast
		{
			get; set;
		}

		[DefaultValue(26)]
			public int PeriodMedium
		{
			get; set;
		}

		[DefaultValue(26)]
			public int DisplacementChiko
		{
			get; set;
		}

		[DefaultValue(52)]
			public int PeriodSlow
		{
			get; set;
		}

		[DefaultValue(26)]
			public int DisplacementCloud
		{
			get; set;
		}

		[Output]
			public delegate SenkouSpanA
		{
			get; set;
		}
		[Output]
			public delegate SenkouSpanB
		{
			get; set;
		}
		[Output]
			public delegate Chikospan
		{
			get; set;
		}
		[Output]
			public delegate Tenkansen
		{
			get; set;
		}
		[Output]
			public delegate Kijunsen
		{
			get; set;
		}

		double maxfast, minfast, maxmedium, minmedium, maxslow, minslow, chikoval;




		/// <summary>
		/// Seçilen sembolün bardata'ları güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="currentBar">Güncellenen bardata'nın indexteki sırası</param>
		/// <param name="inputValue">Seçilen OHLC tipine göre gelen bardata'nın o anki değeri</param>
		/// <param name="barDateTime">Bardata'ya gelen güncelleme zamanı</param>

		public override void Calculate(int index)
		{
			if ((index>PeriodSlow) || (index<PeriodFast))
			{
				return ;
			}

			chikoval = barData.BarData.Close[index];
			maxfast = barData.BarData.High[index];
			minfast = barData.BarData.Low[index];
			maxmedium = barData.BarData.High[index];
			minmedium = barData.BarData.Low[index];
			maxslow = barData.BarData.High[index];
			minslow = barData.BarData.Low[index];

			for (int i = 0; i<PeriodFast; i++)
			{
				if (maxfast<barData.BarData.High[index - i])
				{
					maxfast = barData.BarData.High[index - i];
				}
				if (minfast<barData.BarData.Low[index - i])
				{
					minfast = barData.BarData.Low[index - i];
				}
			}

			for (int i = 0; i<PeriodMedium; i++)
			{
				if (maxmedium<barData.BarData.High[index - i])
				{
					maxmedium = barData.BarData.High[index - i];
				}
				if (minmedium<barData.BarData.Low[index - i])
				{
					minmedium = barData.BarData.Low[index - i];
				}
			}

			for (int i = 0; i<PeriodSlow; i++)
			{
				if (maxslow<barData.BarData.High[index - i])
				{
					maxslow = barData.BarData.High[index - i];
				}
				if (minslow<barData.BarData.Low[index - i])
				{
					minslow = barData.BarData.Low[index - i];
				}
			}

			Tenkansen[index] = (maxfast + minfast) / 2;
			Kijunsen[index] = (maxmedium + minmedium) / 2;
			SenkouSpanA[index + DisplacementCloud] = (Tenkansen[index] + Kijunsen[index]) / 2;
			SenkouSpanA[index + DisplacementCloud] = (maxslow + minslow) / 2;
			Chikospan[index - DisplacementChiko] = chikoval;




		}
	}

 

Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.



8,636 soru
8,590 cevap
4,821 yorum
19,792 kullanıcı