0 beğenilme 0 beğenilmeme
437 kez görüntülendi
Merhaba;

Backtest optimizasyonu ile 1 saatlik periyotta elde ettiğim 2 adet TMOV (renk değiştiren) parametrelerim var. Bunları şu şekilde çalıştırmak istiyorum. Algoritma sihirbazı maalesef bu konuda yardımcı olamadı;

Günlük hareketli ortalama değeri bir önceki günden yüksek ise yani günlükte yükselen trendde ise 1. Tmov indikatörüm çalışsın.

Eğer günlük hareketli ortalama değeri bir önceki günden düşük ise yani günlükte düşen trendde ise 2. Tmov indikatörüm çalışsın.

yükselen trend yerini düşen trende bırakır bırakmaz 1. Tmov alış yada satışını kapatarak 2. Tmov indikatörü ile çalışsın. Düşen trend ise yerini yükselen trende bırakır bırakmaz aynı şekilde 2. Tmov görevini 1. Tmov indikatörüne bıraksın.

Bu şekilde bir işlem için yardımcı olabilir misiniz lütfen?
Algoritmik Trading kategorisinde (118 puan) tarafından | 437 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme

 Merhabalar,

Aşağıdaki gibi bir sistem uygulayabilirsiniz.

Lütfen inceleyiniz.

using System;
using System.Collections.Generic;
using System.Linq;
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
{
	public class tdemirhan : MatriksAlgo
	{
		// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
		// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.

		[SymbolParameter("GARAN")]
		public string Symbol;

		[Parameter(SymbolPeriod.Min60)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(1)]
		public int Quantity;

		[Parameter(3)]
		public int TillsonPeriod;

		[Parameter(0.7)]
		public decimal TillsonA;

		[Parameter(3)]
		public int TillsonPeriod2;

		[Parameter(1.1)]
		public decimal TillsonA2;


		[Parameter(5)]
			public int MovPeriod1;

		[Parameter(MovMethod.S)]
			public MovMethod MovMovMethod1;

		TMOV tmov;
		TMOV tmov2;
		MOV mov;

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			tmov = TMOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, TillsonPeriod, TillsonA);
			tmov2 = TMOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, TillsonPeriod2, TillsonA2);
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod1, MovMovMethod1);


			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			SendOrderSequential(true, Side.Buy);
			WorkWithPermanentSignal(true);
		}

		/// <summary>
		/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
		public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
		{
			var barData = GetBarData();
			var RefTilson1 = Ref(tmov, -1);
			var RefTilson2 = Ref(tmov, -2);

			var RefTilson1_ = Ref(tmov2, -1);
			var RefTilson2_ = Ref(tmov2, -2);

			if (mov.Value[0][mov.CurrentIndex] > mov.Value[0][mov.CurrentIndex - 1])
			{
				// Al - T3>REF(T3,-1) AND REF(T3,-1)<REF(T3,-2)
				if (tmov.CurrentValue>RefTilson1 && RefTilson1 <= RefTilson2)
				{
					SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
					Debug("Alis emri gonderildi");
				}

				// Sat - T3<REF(T3,-1) AND REF(T3,-1)>REF(T3,-2)
				if (tmov.CurrentValue<RefTilson1 && RefTilson1 >= RefTilson2)
				{
					SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
					Debug("Satis emri gonderildi");
				}
			}

			if (mov.Value[0][mov.CurrentIndex] < mov.Value[0][mov.CurrentIndex - 1])
			{
				// Al - T3>REF(T3,-1) AND REF(T3,-1)<REF(T3,-2)
				if (tmov2.CurrentValue>RefTilson1_ && RefTilson1_ <= RefTilson2_)
				{
					SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
					Debug("Alis emri gonderildi");
				}

				// Sat - T3<REF(T3,-1) AND REF(T3,-1)>REF(T3,-2)
				if (tmov2.CurrentValue<RefTilson1_ && RefTilson1_ >= RefTilson2_)
				{
					SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
					Debug("Satis emri gonderildi");
				}
			}



		}
	}
}

İyi çalışmalar.

(11,069 puan) tarafından
0 0
Teşekkür ederim. Her ne kadar Hareketli ortalama şartı olan if bloklarının içerisinde bir kontrol noktası olabilir mi diye düşünsem de yine de istediğim sonucu verdi.
0 0
Peki bunu Matriks Prime dilinde nasıl yazabilirim, ki bildiğim kadarı prime da hangi periyot seçilirse formüller o periyotta çalışıyor. Fakat istediğim de ise hareketli ortalama günlük, tmov lar saatlik. Bu mümkün mü?
1 0

Merhabalar,

Matriks Prime dilindeki yazımı için egitim@matriksdata.com adresine mail atabilirsiniz.

Fakat istediğim de ise hareketli ortalama günlük, tmov lar saatlik. Bu mümkün mü?

Aşağıdaki gibi bir değşiklik ile birden fazla periyot kullanabilirsiniz.

İyi çalışmalar.

0 0

İlgilendiğiniz için teşekkür ederim. 

ki bildiğim kadarı prime da hangi periyot seçilirse formüller o periyotta çalışıyor. Fakat istediğim de ise hareketli ortalama günlük, tmov lar saatlik. Bu mümkün mü?

Bu ifadenin tamamını Matriks Prime için belirtmiştim. smiley

1 0

Merhabalar,

Matriks Prime dilindeki yazımı için egitim@matriksdata.com adresine mail atabilirsiniz.

Detay belirtirseniz arkadaşlar yardımcı olacaktır.

İyi çalışmalar.

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.



7,506 soru
7,510 cevap
4,405 yorum
8,675 kullanıcı