0 beğenilme 0 beğenilmeme
975 kez görüntülendi
Selamlar; 60-15 ve 1 dakikalık verileri kullanan ve 1 dakikalık barlara göre işlem açıp kapatan bir stratejim var. 60 dakikalıktan çektiğim Hareketli Ortalama, canlıda çalışırken paint yapıyor sanırım. Bu yüzden bir önceki barı dikkate almasını istiyorum.

HO.Value[0][HO.CurrentIndex-1]  gibi bir yapı kullandığımda, veriyi saatlikten çektiği için 1 saat önceki HO'nın pozisyonunu alıyor. Halbuki ben 1 dakika önceki pozisyonunu dikkate almasını istiyorum. Bunu nasıl bir formül ile sağlayabilirim?
Algoritmik Trading kategorisinde (271 puan) tarafından | 975 kez görüntülendi

1 cevap

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

Merhaba,

öncelikler çoklu sembol ve çoklu periyotta çalışıldığında istenmeyen sinyaller oluşmaması için sembolID ve periyot kontrolü yapılması gerekir.

Evet HO.Value[0][HO.CurrentIndex-1] ile bir önceki 60DK'lık hareketli ortalamanın değerini verir.

şöyle bir şey yapılabilir. 1DK için ondataupdate methodu tetiklendiğinde o anki 60DK hareketli ortalama değeri bir dictonary eklenebilir. Daha sonra bir önceki değer çağrılabilir. aşağıdaki gibi bir yapı kurulabilir.

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

		[Parameter(SymbolPeriod.Min)]
		public SymbolPeriod GrafikPeriod;

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

		[Parameter(5)]
		public int MovPeriod;

		[Parameter(22)]
		public int MovPeriod2;

		// indikator tanımları.
		MOV mov;
		MOV mov2;

		MOV mov60DK;

		public override void OnInit()
		{
			mov60DK = MOVIndicator(Symbol, SymbolPeriod.Min60, OHLCType.Close, 5, MovMethod.Simple);

			AddSymbol(Symbol, GrafikPeriod);
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);
			mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Exponential);

			SendOrderSequential(true);
			WorkWithPermanentSignal(true);
		}
		
		Dictionary<int,decimal> liste =new Dictionary<int,decimal>();

		public override void OnDataUpdate(BarDataEventArgs barData)
		{			
			if (barData.PeriodInfo == GrafikPeriod.ToPeriodInfo())
			{
				var index=barData.BarDataIndex;				
				liste[index]=mov60DK.CurrentValue;				
				Debug("önceki 60DK'lık hareketli ortalama: "+liste[index-1]);		
				
				// yapılacak işlemler
			}
		}

Periyot kontrolü:

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;

namespace Matriks.Lean.Algotrader
{
	public class CokluPeriyot : MatriksAlgo
	{
		[SymbolParameter("GARAN")]
		public string Symbol;

		[Parameter(SymbolPeriod.Min)]
		public SymbolPeriod GrafikPeriod;

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

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;

		[Parameter(5)]
		public int MovPeriod;

		[Parameter(22)]
		public int MovPeriod2;

		// indikator tanımları.
		MOV mov;
		MOV mov2;

		public override void OnInit()
		{
			AddSymbol(Symbol, GrafikPeriod);
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);
			mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Exponential);

			SendOrderSequential(true);
			WorkWithPermanentSignal(true);
		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			Debug(barData.PeriodInfo + " - " + GrafikPeriod.ToPeriodInfo());

			if (barData.PeriodInfo == GrafikPeriod.ToPeriodInfo())
			{
				if (CrossAbove(mov, mov2))
				{
					SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
					Debug("Alış Emri Gönderildi");
				}

				if (CrossBelow(mov, mov2))
				{
					SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
					Debug("Satış Emri Gönderildi");
				}
			}
		}
	}
}

 

(15,892 puan) tarafından
tarafından seçilmiş
0 0
Selamlar tekrardan; öncelikle formül için teşekkür ediyorum. 2 gündür Live Test'teyim; ancak Backt Test yaptığımda, evet, eskisine nazaran çok daha iyi durumdayız fakat yine de sonuçlar birbiriyle tutmuyor. Logları incelediğimde BackTest ile LiveTest arasında değerlerin verildiği zamanların farklı olduğunu fark ettim. Live'da bir period ileriden geliyor. Önce saat farkı gibi bir şey var zannettim ancak 5 dakikalıkta da aynı durum var.

Yani saatlikte, BackTest'te 14:00' da değer almış Ema, ancak Live'da aynı değeri 15:00'da almış. Yine 5 dakikalıkta, BackTest'te 14:05'te atanan değer, Live'da 14:10'da atanmış.

Bunun sebebi nedir? Kurtulmanın bir yolu var mıdır? İkinci verdiğiniz formülden bahsediyorum.
0 0

Merhabalar,

Bahsettiğiniz durum kalıcı sinyal ile çalışmanızdan kaynaklıdır.

Backtestte karşılaştığınız alış veya satışlar live testte bir bar sonra ( 5Dk.lık periyotta işlem yapıyorsanız 5Dk., 60 Dk.lıkta işlem yapıyorsanız 60 Dk sonra gibi..) gerçekleşir. 

Geçici sinyal ile çalışabilmeniz mümkündür fakat geçici sinyal ile de bir takım riskler söz konusudur.

Dilerseniz aşağıda paylaşılan linki inceleyebilirsiniz.

https://destek.matriksdata.com/?qa=6696/ge%C3%A7ici-sinyal-nedir-ne-de%C4%9Fildir&show=6696#q6696

İyi çalışmalar.

 

0 0
son düzeltilmiş halini strateji olarak ekler misiniz?

teşekkürler.
1 0
WorkWithPermanentSignal(true);

Buradaki "true" değerini, "false" olarak değiştirmek yeterli olacak ozturkc...
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,801 kullanıcı