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

Merhaba,

BuyLimit işlemlerinde Partial fill'ler algo robotlarının işlem yapması için ciddi sorun oluşturuyor. Zira siz 100 tane al diyorsunuz ve bundan sonraki işlemlerinizde (örneğin sat) bu miktar üzerinden olacak ama kısmi doldurma gerçekleşirse sistem hata veriyor.

İki şey sormak istiyorum birincisi. AlgoTrade eğitim PDF'inde SendLimitOrder fonksiyonu aşağıdaki şekilde geçiyor;

SendLimitOrder(Symbol, 100, (OrderSide.Buy), 11.88m, TimeInForce.GoodTillCancel, ChartIcon.Buy)

Ancak Gerçekte TimeInForce.GoodTillCancel yok. Bu çıkartıldı mı (ya da overloaded başka versiyonu var mı)?

İkincisi ise eğer halen kullanabiliyorsak hangisini seçmeliyiz FillorKill mi yoksa GoodTillCancel mı?

Zira FillorKill emri doldurursa sistem güzel ve sorunsuz çalışır. Ama dolduramazsa hiç bir şey olmaz.

GoodTillCancel ise en azınan kısmi alış sağlar ve hiç yoktan iyidir sonucu verir lakin şöyle bir sorun var eğer bu seçilirse bu emir doluncaya kadar bekleyeceğinden bu sırada satmayı gerektirecek bir fiyat değişimi olursa bu emir hali hazırda geçerli olduğundan sat emri devreye girmeyebilir.

 ( SendOrderSequential(true) kullanmak istediğim için GoodTillCancel beni endişelendiriyor )

Kısacası aşağıdaki senaryo için nasıl bir yol takip etmeliyim?

100 tane hisse al. Ama alamadın 50 oldu sorun değil aynı fiyattan başka alabiliyorsan devam et. Diyelim 10 tane daha aldı ve 60 oldu ama bu sırada fiyat değişti ve sat durumu oluştu bu durumda al emrini iptal et ve 60 taneyi satarak al sat döngüsünü bitir.

Algoritmik Trading kategorisinde (81 puan) tarafından
tarafından düzenlendi | 459 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme

Merhaba TimeInForce cikartilmadi ama tanitilmasi gerekiyor, su sekilde yazabilirsiniz: 

SendLimitOrder(Symbol, 100, (OrderSide.Buy), 11.88m, new TimeInForce(TimeInForce.GoodTillCancel));

Calistiginiz kurumun ve borsa bu emir tiplerini destekledigi surece istediginiz sonuca ulasabilirsiniz. FillorKill dediginiz gibi cozum olur, en azindan tam fill alamiyorsa emir iptal edilir. GoodTillCancel ise cozum olmaz, bu daha cok emrin "tarihe kadar gecerli" kismini etkiler, gun sonunda emrin iptal olmamasini saglar.

Sizin bahsettiginiz soruna cozum icin OnOrderUpdate icerisinden miktar takibi yapmaniz gerekir. OnOrderUpdate fonksiyonu emirler her gerceklestiginde tetiklenen cok kullanisli bir fonksiyondur. 

public override void OnOrderUpdate(IOrder order)
{
	//Gercek zamanli pozisyon takibi
	if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
	{
		var positionChange = order.OrderQty; //BURADA EMRIN NE KADARININ GERCEKLESTIGINI GOREBILIRIZ
		realposition += (int) positionChange;
		Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
		if (realposition == 0)
		{
			SystemPosition = 0;
			Debug("Kar AL / Zarar Durdur tetiklendi");
		}
	}
	if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
	{
		var positionChange = order.OrderQty;
		realposition -= (int) positionChange;
		Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
		if (realposition == 0)
		{
			SystemPosition = 0;
			Debug("Kar AL / Zarar Durdur tetiklendi");
		}
	}
}

var positionChange = order.OrderQty; satirinda emrin ne kadari gerceklesti gorebilir, bu gerceklesme durumunu strateji icerisinde kullanabiliriz. Ornegin alis yaptik, sizin dediginiz gibi 100 quantity'nin sadece 60'i alindi, bu durumda sat'a gecilirse sat emrini onceden belirlenmis bir rakam ile degil, yazdigim OnOrderUpdate fonksiyonu icerisinden gelen canli miktar ile degistirirsek pozisyonu duruma gore ayarlayabilirsiniz.

(8,035 puan) tarafından
8,639 soru
8,593 cevap
4,826 yorum
19,848 kullanıcı