0 beğenilme 0 beğenilmeme
564 kez görüntülendi
Merhaba, kolay gelsin

Matriks IQ ile çok yalın bir strateji oluşturmaya çalışıyorum fakat karşıma çıkan birkaç soruna burada değinmek istedim,

Oluşturmak istediğim strateji basitçe;

Herhangi bir Binance Futures paritesi için “20 periyot ve 3 std sapmalık Bollinger band” ve “34 EMA”eklendikten sonra (kod tamamlandığında bu indikatörlerin girdileri backtest optimizasyonuna tabi tutulacak, o konuya ayrıca değineceğim) 45 dakikalık grafikte o anki fiyat (kapanış değil) değerine göre long/short pozisyonlar tanımlamak istiyorum.

Fiyat Bollinger bandın lower limitine dokunduğunda market long girecek
    Bu long pozisyonu fiyat 34 ema dokunduğu an market kapatılacak
Fiyat BB upper limitine dokunduğunda market short girecek
    Bu short pozisyonu fiyat 34 ema dokunduğu an market kapatılacak

Aslında çok basit tanımlı olmasına rağmen bu stratejiyi oluştururken karşıma bazı problemler çıktı;

1. Öncelikle Matriks IQ’da grafik açtığımda 45 dakikalık periyot eklenebiliyor (9x5dk olarak ekliyor onu da) fakat stratejiler için 45 dakikalık periyotta çalışmak için ne yapılabilir?
    * Stratejiyi geçmiş bir dönemde backtest yapmak için (örneğin 2018-2019 yılı arasında 5000 barlık bir kesit dönemde) büyük bir data da manuel ekleme yapılabilir mi?
2. Stratejide fiyatın kapanış değeri yerine fiyatın o anki değerinin BB ya da EMA dokunduğu anda open/close yapılması için “kalıcı sinyalle çalış“ seçeceği kapatıldığında farklı başka bir problem doğmuş oluyor
    * “Kalıcı sinyalle çalış” kapatılması bu strateji için aynı bar içinde çok fazla pozisyon açılmasına sebebiyet verebileceği için önlem amaçlı “sıralı emir gönder” seçeneğine başvurmayı düşündüm. Fakat o zaman da örneğin fiyat aşağı BB’de long açıp EMA 34 dokunduğunda pozisyonu kapattığı zaman (sistem bu pozisyon kapamayı short olarak sayacaktır) bir sonraki trigger upper BB’den short tetiklediğinde oradan short girmeyecek (çünkü sıralı emir aktive durumda ve son pozisyon kapama emiri short sayıldı)
    * Bu probleme buradaki soru/cevaplarda değinildiğini gördüm fakat emin olamadım, stratejiyi 2 ayrı hesaba bölüp short/long olarak bölmek daha mı garanti olacaktır?
3. “Kalıcı sinyalle çalış” aktive etmenin doğurduğu başka bir problem de, backtest/backtest optimizasyonu yaparken pozisyona giriş/çıkış emirleri için yine de fiyatın BB/EMA dokunduğu yerlerden pozisyonu simule etmek yerine fiyat kapanış/düşük/yüksek gibi değerleri seçtirip bunlar üzerinden backtest yapıyor. Bu da değinilen strateji için BB veya EMA girdilerini optimize edebilmek için doğru sonuçlar doğurmuyor, çünkü stratejinin canlıda çalışacağı şekillerde pozisyona girmiyor. Bunu nasıl çözebilirim?
    * Geçmiş datayı fiyatın ve dolayısıyla indikatörlerin kapanış değerleriyle içeri yüklediğimiz için, o 45 dakikalık bar içinde fiyatın BB limitine dokunduğu an BB’nin değerinin kaç olduğunu simule edemeyebilir, ama en azından backtestte pozisyon emirlerini bar data kapanış/yüksek/düşük değerleri yerine kapanış BB limit değerlerinden kabul edebilirse daha doğru backtest sonuçları gözlemlenebilir. Bunu mümkün kılabilir miyiz?
4. Piyasadan emir girmek yerine limit order ile bu stratejiyi çalıştırmak nasıl mümkün olur?

Birden çok soru oldu farkındayım, fakat kendim biraz kurcalayıp biriken sorularımı tek seferde sunmanın daha uygun olacağını düşündüm
Aslında daha aklıma takılan birçok soru daha var ama birçoğu stratejiyi makjaylama üzerine olduğu için temel sorunları önceliklendirip onları çözüme ulaştırmak daha iyi olacaktır.

Şimdiden teşekkürler
Algoritmik Trading kategorisinde (17 puan) tarafından | 564 kez görüntülendi

1 cevap

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

Merhabalar,

Elimden geldiğince sorularınıza destek olmaya çalışacağım.

1. Öncelikle Matriks IQ’da grafik açtığımda 45 dakikalık periyot eklenebiliyor (9x5dk olarak ekliyor onu da) fakat stratejiler için 45 dakikalık periyotta çalışmak için ne yapılabilir?

Bu tarz bir yapı kullanabilmeniz için sistem üzerinde birkaç değişiklik yapmanız gerekmektedir. 

( Örnek olarak 45 dediğiniz için, 45 sayısını kullandım. )

X Dakikalık bir sistem için  PeriodType.Minute fonksiyonu ile kaç dakikada çalışmak istiyorsanız bunu belirtmeniz gerek. 

Daha sonra bu değişkeni indikatörlerinize entegre etmeniz lazım, yani aşağıda koyu olarak işaretlediğim yer gibi..

most = MOSTIndicator(Symbol, NBarPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);

Devamında ise AddSymbol kısmını da AddSymbol(Symbol, NBarPeriod); olarak değiştirirseniz artık sisteminiz sizin belirlediğiniz gibi 45 dakikada çalışır.

	public override void OnInit()
		{

			PeriodInfo NBarPeriod = new PeriodInfo(PeriodType.Minute, 45);
			most = MOSTIndicator(Symbol, NBarPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);
			AddSymbol(Symbol, NBarPeriod);

 * Stratejiyi geçmiş bir dönemde backtest yapmak için (örneğin 2018-2019 yılı arasında 5000 barlık bir kesit dönemde) büyük bir data da manuel ekleme yapılabilir mi?

Eğer backtestinizde test etmek istediğiniz aralığın verisi mevcut değilse teknik@matriksdata.com adresine mail atıp X enstrümanının geçmiş verilerini istiyorum derseniz arkadaşlar dosya halinde gönderirler. Bu dosyayı da aşağıdaki linkteki adımları takip ederek MatriksIQ'ya yükleyip test edebilirsiniz.

https://destek.matriksdata.com/?qa=8191/iqda-yeni-sembol-olu%C5%9Fturma&show=8191#q8191

    * “Kalıcı sinyalle çalış” kapatılması bu strateji için aynı bar içinde çok fazla pozisyon açılmasına sebebiyet verebileceği için önlem amaçlı “sıralı emir gönder” seçeneğine başvurmayı düşündüm. Fakat o zaman da örneğin fiyat aşağı BB’de long açıp EMA 34 dokunduğunda pozisyonu kapattığı zaman (sistem bu pozisyon kapamayı short olarak sayacaktır) bir sonraki trigger upper BB’den short tetiklediğinde oradan short girmeyecek (çünkü sıralı emir aktive durumda ve son pozisyon kapama emiri short sayıldı)

Böyle bir durumda aklıma gelen en pratik çözüm koşullarınızın içerisine pozisyon gibi bir değişken tanımlamak. Örnek veriyorum,

posizyon=0; gibi bir değişken tanımlarsınız ve al koşuluna pozisyon eğer 0'a eşitse gir gibi bir şart eklersiniz. Ve sistem aldıktan sonra da pozisyonu değiştirirsiniz. (Diyelim 1 yaptınız) Bir sonraki koşula da pozisyon 1'e eşitse girer değilse girmez gibi..

		int position = 0;

		public override void OnDataUpdate(BarDataEventArgs barData)
		{

            if (alış koşulu && position == 0 && LastOrderSide.Obj != Side.Buy)
			{
				SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false);
				position = 1;
				Debug("Alış emri gönderildi.");
			}

			
			if (satış koşulu && position == 1 && LastOrderSide.Obj != Side.Sell)
			{
				SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Sell, includeAfterSession:false);
				position = 2;
				Debug("Satış emri gönderildi.");
			}

   * Bu probleme buradaki soru/cevaplarda değinildiğini gördüm fakat emin olamadım, stratejiyi 2 ayrı hesaba bölüp short/long olarak bölmek daha mı garanti olacaktır?

Bu konuda bir yorum yapma hakkına maalesef sahip değiliz. Bu tarz yapıları tercih eden kullanıcılar var, dilerseniz bu şekilde test de edebilirsiniz.

3. “Kalıcı sinyalle çalış” aktive etmenin doğurduğu başka bir problem de, backtest/backtest optimizasyonu yaparken pozisyona giriş/çıkış emirleri için yine de fiyatın BB/EMA dokunduğu yerlerden pozisyonu simule etmek yerine fiyat kapanış/düşük/yüksek gibi değerleri seçtirip bunlar üzerinden backtest yapıyor. Bu da değinilen strateji için BB veya EMA girdilerini optimize edebilmek için doğru sonuçlar doğurmuyor, çünkü stratejinin canlıda çalışacağı şekillerde pozisyona girmiyor. Bunu nasıl çözebilirim?

Şöyle ki, backtestler geçmiş verilere dayandığı için her değer (yüksek/düşük/kapanış..) bellidir. Bu sebeple backtestlerde sadece o koşulun gerçekleştiği barın kapanışını alarak işlem yapar. Maalesef o tarihte kestiği/değdiği anın fiyatını alamazsınız.

    * Geçmiş datayı fiyatın ve dolayısıyla indikatörlerin kapanış değerleriyle içeri yüklediğimiz için, o 45 dakikalık bar içinde fiyatın BB limitine dokunduğu an BB’nin değerinin kaç olduğunu simule edemeyebilir, ama en azından backtestte pozisyon emirlerini bar data kapanış/yüksek/düşük değerleri yerine kapanış BB limit değerlerinden kabul edebilirse daha doğru backtest sonuçları gözlemlenebilir. Bunu mümkün kılabilir miyiz?

Aşağıdaki gibi seçenekleri işaretlerseniz gerçeğe en yakın sonuçları elde edersiniz. (Fakat bu test Kalıcı Sinyale göredir.)

Reelde geçici sinyalle çok daha farklı sonuçlar alabilirsiniz.

4. Piyasadan emir girmek yerine limit order ile bu stratejiyi çalıştırmak nasıl mümkün olur?

SendMarketOrder yerine SendLimitOrder diye bir alış satış emri bulunmaktadır. Bunu kullanabilirsiniz.

Umarım faydalı olmuştur.

Eğer aklınıza takılan bir durum olursa egitim@matriksdata.com adresine mail atabilirisniz.

İyi çalışmalar.

(11,069 puan) tarafından
tarafından seçilmiş
0 0
Sorun senin elindeki cihaza yada uygulama ya bağlı olabilir
7,503 soru
7,507 cevap
4,403 yorum
8,665 kullanıcı