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.