0 beğenilme 0 beğenilmeme
975 kez görüntülendi

60 dk da hareketli ortalama 5 in 10 'u yukarı kestikten sonra ki barları sayıyor, aşağı keserse sıfır değerini alıyor.  ENJSA 60 dk da İndikatör 5 in 10 u yukarı  kestiğinde 6 bar sayıyor ama bu intikatörü Explorer da kullandığımda ENJSA 60 dk  5 in 10'u yukarı kestikten sonra ki  bar sayısını 6529 gösteriyor.

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
	[IndicatorInformation("TestMovIndicator", IndicatorDrawingArea.OnDataSeries)]
	//Indikatörün çizgilerinin isimleri
	[IndicatorLineInformation(new []
		{
			"TestMovIndicator (0,1)", "TestMovIndicator 1 (0,1)"
		})]
		public class TestMovIndicator : 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 Period5
		{
			get; set;
		}

		[DefaultValue(10)]
		public int Period10
		{
			get; set;
		}

		public int Mov5OnMov10BarCount
		{
			get; set;
		}

		MOV mov5;
		MOV mov10;

		//Eklenmek istenen indikatorün imzasını burda belirtiyoruz.


		//Indicator değerleri hesaplanmadan önce yaratılacak indikatörler burda tanımlanıyor.
		public override void OnInit()
		{
			mov5 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period5, MovMethod.Exponential);
			mov10 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period10, MovMethod.Exponential);
			PointTitle.Add(0, new Dictionary<int, IIndicatorIcons>());
			Mov5OnMov10BarCount = 0;
		}

		/// <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(0, currentBar, mov5.CurrentValue);
			SetLine(1, currentBar, mov10.CurrentValue);

			if (mov5.CurrentValue>mov10.CurrentValue)
			{
				Mov5OnMov10BarCount++;
				SetPointTitle(0, currentBar, Mov5OnMov10BarCount.ToString(), IconLocation.BelowTheChart, inputValue, false, "WHITE");
			} else
			{
				Mov5OnMov10BarCount = 0;
			}

		}

	}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Indicators;

namespace Matriks.Lean.Algotrader
{
	public class TestMovExplorer : Explorer
	{
		TestMovIndicator testInd;


		public override void OnInit()
		{
			testInd = new TestMovIndicator();
			testInd.SetIndicatorParameters("Period5", 5);
			testInd.SetIndicatorParameters("Period10", 10);

			RegisterUserIndicator(testInd, Symbol, SymbolPeriod, OHLCType.Close, 5);

			AddColumns(2);
			SetColumnText(0, "Mov5");
			SetColumnText(1, "BarCount");
		}

		public override bool OnExplorer(List<BarDataEventArgs> bardatas)
		{
			SetColumn(0, testInd.CurrentValue);
			SetColumn(1, testInd.Mov5OnMov10BarCount);


			return true;
		}
	}
}

.

 

 

İndikator kategorisinde (229 puan) tarafından | 975 kez görüntülendi
0 0

currentBar farklı ise if'e gir  yaptım  ama bir şey değişmedi GARAN 60 dk 7939 geliyor  6 gelmesi gerekirken.

Bu ekranlar da Debug olmadığı için sebebi kolay bulunmuyor, belki de buraya isNewBar gibi bir şey lazım

	
int currentBar_old=0;
	public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
		{
			SetLine(0, currentBar, mov5.CurrentValue);
			SetLine(1, currentBar, mov10.CurrentValue);

			if (currentBar_old!=currentBar && mov5.CurrentValue>mov10.CurrentValue)
			{
				Mov5OnMov10BarCount++;
				SetPointTitle(0, currentBar, Mov5OnMov10BarCount.ToString(), IconLocation.BelowTheChart, inputValue, false, "WHITE");
			} else
			if (currentBar_old!=currentBar)
			{
				Mov5OnMov10BarCount = 0;
			}
			
			currentBar_old=currentBar;
		}

 

0 0
Sorunu buldum, Örnek: GARAN sembolü  sadece Indikatör çalıştırmada ve Eplorer taraması kullanımda 7939  bar işlem yapılıyor ama explorer taramasında farklı olarak son barın hareketli ortalama değeri alınıyor ve bu son hareketli ortalama 7939 bar boyunca değişmiyor.

Bu indikatörü stratejide de test yaptım doğru çalışıyor bir tek explorer taramasında sorun var.

Aşağıda ki hareketli ortalama değerleri Explorer taramasında 7939 bar boyunca değişmiyor

mov5:8.875822854765057915852936167, mov10:8.867996192163985938984181163
0 0
Bu sorun yeni versiyonla düzeltilecek mi

1 cevap

1 beğenilme 0 beğenilmeme
int index = bardatas.FirstOrDefault().BarDataIndex;
testInd.Value[0][index]

 

(725 puan) tarafından
0 0
Yanıt için teşekkür ederim ama bu çözüm değil sorun ilk bardan itibaren hareketli ortalamanın değişmemesi
0 0

Explorer içinde, OnExplorer bloğunda indikatörün önceki değerlerine ulaşmanız için bunu kullanmanız gerekiyor. İndikatör değeri "CurrentValue" ile çağırıldığında indikatörün son değeri gelir.

public override bool OnExplorer(List<BarDataEventArgs> bardatas)
{
	int index = bardatas.FirstOrDefault().BarDataIndex;
	SetColumn(0, testInd.Value[0][index]);
	SetColumn(1, testInd.Mov5OnMov10BarCount);
	return true;
}

Bu paylaştığım kod örneğinde "index" değişkeninin değerini azaltarak "TestMovIndicator"üne ait önceki barların değerlerine ulaşabilirsiniz.

public override bool OnExplorer(List<BarDataEventArgs> bardatas)
{
	int index = bardatas.FirstOrDefault().BarDataIndex - 2; // 2 bar önceki index.
	SetColumn(0, testInd.Value[0][index]); // 2 bar önceki indikatör değeri.
	SetColumn(1, testInd.Mov5OnMov10BarCount);
	return true;
}
0 0
Problem indikatörün önceki değerini almak değil.
1 0
Merhaba,

Sorunu saptadık.

Gerekli eylem alınıp, size bilgi verilecek.

Teşekkürler.
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,714 soru
8,661 cevap
4,853 yorum
20,348 kullanıcı