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

Merhabalar;

if(Koşul)
{FX_Alis;}

else if (Koşul)
{FX_Satis;}

else if (Koşul)
{FX_AcigaSatis;}

else if (Koşul)
{FX_AcigaSatisKapama;}

şeklinde kurguladığım ve 1 Dakikalık barlarla çalıştırdığım bir stratejim var. SendOrderSequential - false; WorkWithPermanentSignal ise true durumda.

Burada temel olarak yapmak istediğim, her barda ifli koşulların sadece bir tanesinin tetiklenmesini ve dolayısıyla her barda tek bir FX'li fonksiyonun emir iletmesini sağlayabilmek. Çünkü hem FX fonksiyonlarının içinde hem de IOrderOrder altında, gönderilecek adet, işlem sonucu hesaplamaları ve stratejinin yönün tayin edecek başka kodlar var.

Sorun şu ki; canlı çalıştırdığım stratejinin debug'ını incelediğimde, koşulları birbirine else if ile bağlamış olsam da tek bir bar içerisinde 2 ayrı koşul için de emir gönderdiğini fark ettim: 

https://drive.google.com/file/d/1CJjeK0yAaJ_NXEQwMGfMxytXdodI5ouv/view?usp=sharing

Yukarıdaki linkte görebileceğiniz gibi 11:04'te tetiklenen stratejim Long 2. Bölge Alış emriyle girmiş olduğu Short İşlem'i kapatmış. Fakat else if ile bağladığım Short 3. Bölge Açığa Satış Kapama fonksiyonu da aynı bar içerisinde hemen ardından tetiklenmiş. Tetiklenme koşulları doğru ancak bu barı es geçip bir sonraki bar tetiklenmesi gerekiyordu. Zira o zaman Short Satış emri değil, Long Alış emri gönderecek ve adet hesaplarını ona göre yapacaktı.

Bu yapıda nasıl bir yanlışlık yapıyorum? Acaba, emirleri koşullardan sonra başka bir fonksiyonun içinden verdiğim için mi geri dönüp stratejiyi tekrar yukarıdan aşağıya okumaya başlıyor? Ya da stratejinin içine başka bir kod mu eklemeliyim, ne yapmalıyım çözemedim :)

Özet geçmem gerekirse; aynı anda 2 koşul oluştuğunda strateji içindeki akışın şu şekilde olmasını istiyorum:

Koşul1 ----> Emir Gönderimi -----> IOrderOrder -------> Koşul2 --------> Emir Gönderimi --------> IOrderOrder

Teşekkürler..

 

 

 

Algoritmik Trading kategorisinde (271 puan) tarafından | 852 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba,

if(Koşul)
{FX_Alis;}

else if (Koşul)
{FX_Satis;}

else if (Koşul)
{FX_AcigaSatis;}

else if (Koşul)
{FX_AcigaSatisKapama;}

yukarıdaki if else yapısında sadece bir koşulun içine girecektir ve öyle yapıyordur eğer siz çoklu periyot kullanıyorsanız ondataupdate aynı anda birden fazla kez tetiklenmesi durumunda birden fazla koşulun içine giriyormuş gibi algılanabilir.

tek periyot kullanıyorsanız kodun başka bir satırdan emir göndermediğini kontrol etmeniz gerekir çünkü bu if else yapısı C# ait ve herhangi bir hata olması söz konusu değil kodu iqdestek@matriksdata.com adresine gönderebilirseniz inceleyebiliriz.

(15,892 puan) tarafından
0 0
Sadece dakikalık periyod kullanıyorum ancak spot üzerinden vadeliye emir gönderdiğim için OnInit içinde hem spot hem de vadeli symbolü ekliyorum. Periyot için söylediğinizden yola çıkarak, zannediyorum ki sorunumun sebebi bu. Deneyeceğim, teşekkür ederim..
0 0
aynen birden fazla sembolde aynı periyot olsa dahi yine ondataupdate birden fazla kez tetiklenecektir.
0 0
Peki sadece istediğimiz sembole göre tetiklenmesini sağlamanın bir yolu var mı? Örneğin, iki tane ondataupdate açayım, birisi symbol ile diğeri ordersymbol ile tetiklensin ya da if yapısının içine tetiklenen sembol şuysa gibilerinden bir kod ekleyeyim?
1 0

iki tane ondataupdate() methodu eklenmez ancak if ile tetiklenen sembolün hangisi olduğu anlaşılabilir.

[SymbolParameter("BIMAS")]
public string SinyalOlusturanSembol;

[SymbolParameter("FBIMAS")]
public string IslemYapilacakSembol;


public override void OnInit()
{
	AddSymbol(IslemYapilacakSembol, SymbolPeriod);
	AddSymbol(SinyalOlusturanSembol, SymbolPeriod);

	most = MOSTIndicator(SinyalOlusturanSembol, SymbolPeriod, OHLCType.Close, MostPeriod, MostPercentage, MostMovMethod);

	SendOrderSequential(true, Side.Buy);
	WorkWithPermanentSignal(true);
}

public override void OnDataUpdate(BarDataEventArgs barData)
{
	if (barData.SymbolId == GetSymbolId(SinyalOlusturanSembol))
	{
		if (CrossAbove(most, most, 1, 0))
		{
			SendMarketOrder(IslemYapilacakSembol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:false);
			Debug("Alış emri gönderildi.");
		}
		if (CrossBelow(most, most, 1, 0))
		{
			SendMarketOrder(IslemYapilacakSembol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:false);
			Debug("Satış emri gönderildi.");
		}
	}
}

 

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,799 kullanıcı