Sıralı Emir Gönderimi #
MatriksIQ’da stratejiden gönderilen emirlerin yönlerini isteğe bağlı olarak sıralı veya sırasız olarak ayarlayabilirsiniz.
Emirlerin sıralı gönderimi istenirse kod içerisinde kurulacak yapı ile istenirse de emirlerin sırasını koruyan fonksiyon ile sağlanabilir. Sırasız gönderilmesi isteniyorsa koda herhangi bir ekleme yapmaya gerek olmaz.
SendOrderSequantial #
SendOrderSequential fonksiyonu kullanılarak strateji içerisinde emir sırası kontrol edilebilir. Burada emir sırasından kastımız aynı yönde yani arka arkaya alış emirleri veya satış emirlerinin gönderilmemesidir. Eğer ki aynı yönde emir stratejide oluşursa bu fonksiyon kullanıldığında emir kuruma iletilmeden silinecektir.
public void SendOrderSequantial(bool isSequantial, Side side)
Parametreler #
bool isSequantial
Emirlerin sıralı gönderilmesini sağlayan parametredir. İki değer alabilir; true geçilirse emirler sıralı, false geçilirse sırasız gönderilecektir.
Side side
Stratejiden gönderilecek ilk emrin yönünü belirleyen parametredir. Bu parametre için 3 seçenek vardır.
- Side.All yazılırsa ilk emrin yönü önemsenmez. Hangi yönde gelirse sonraki emirler ona göre sıralı şekilde ilerler.
- Side.Buy yazılırsa ilk emir yönü Alış olmak zorundadır. Alış emri gönderildikten sonra emirler sırayla gönderilmeye devam eder.
- Side.Sell yazılırsa ilk emir yönü Satış olmak zorundadır. Satış emri gönderildikten sonra emirler sırayla gönderilmeye devam eder.
Ek Notlar #
Emirlerin sıralı gönderildiği stratejilerde kod içerisinde son emrin yönü takip edilmek isteniyorsa, bu işlem için LastOrderSide alanı kullanılabilir.
if(LastOrderSide.Obj == Side.Buy) Debug("Son emir yönü AL");
Örnek #
Hazır stratejilerdeki KurumTakip stratejisinden alınan aşağıdaki kod parçasında görüleceği üzere emir gönderimi sıralı seçilmiş. İlk emir yönü ise bir değişkene atanarak parametrik seçilebilmesi sağlanmış.
namespace Matriks.Lean.Algotrader { public class BrokerageFirmTracking : MatriksAlgo { [SymbolParameter("GARAN")] public string Symbol; [Parameter(SymbolPeriod.Min)] public SymbolPeriod SymbolPeriod; [Parameter(365)]//Yatırım Finansman public int KurumID; [Parameter(BakilacakAlan.Adet)] public BakilacakAlan _BakilacakAlan; [Parameter(1000)] public int Kriter; [Parameter(Side.All)] public Side IlkEmirYon; [Parameter(100)] public decimal BuyQuantity; [Parameter(100)] public decimal SellQuantity; public enum BakilacakAlan { Adet, Hacim } /// <summary> /// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri, /// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır. /// </summary> public override void OnInit() { AddSymbol(Symbol, SymbolPeriod); //Sembole ait gerçekleşen işlemler stratejide kullanılmak isteniyorsa alltaki fonksiyon kullanılmalıdır //Bu fonksiyon ile sembolde gerçekleşen her işlemin detaylarını stratejiye çekilebilir //Herhangi kısıtlama olmaksızın strateji çalıştırılmaya başlatılmasıyla sembolde her işlem olduğunda OnTickDataRecieved metodunu tetikler AddSymbolTickData(Symbol); //Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. //Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. SendOrderSequential(true, IlkEmirYon); // Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur. // true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir. WorkWithPermanentSignal(true); } /// <summary> /// Eklenen sembollerde işlem gerçekleştikçe bu fonksiyon tetiklenir. /// </summary> /// <param name="tickData">Gerçekleşen işleme dair bilgiler bulundurur</param> public override void OnTickDataReceived(AlgoTickData tickData) { if (tickData.Buyer.Id == KurumID && LastOrderSide.Obj != Side.Buy) { if ((_BakilacakAlan == BakilacakAlan.Adet && tickData.Transaction.TransactionSize >= Kriter) || (_BakilacakAlan == BakilacakAlan.Hacim && tickData.Transaction.TransactionVolume >= Kriter)) { SendMarketOrder(Symbol, BuyQuantity, OrderSide.Buy); Debug("Alış Koşulu Gerçekleşti."); Debug($"{tickData.Transaction.TransactionDate.ToLongTimeString()} | {tickData.Transaction.TransactionPrice} | {tickData.Transaction.TransactionSize} | " + $"{tickData.Transaction.TransactionVolume} | {tickData.Buyer.Name} | {tickData.Seller.Name}"); } } if (tickData.Seller.Id == KurumID && LastOrderSide.Obj != Side.Sell) { if ((_BakilacakAlan == BakilacakAlan.Adet && tickData.Transaction.TransactionSize >= Kriter) || (_BakilacakAlan == BakilacakAlan.Hacim && tickData.Transaction.TransactionVolume >= Kriter)) { SendMarketOrder(Symbol, SellQuantity, OrderSide.Sell); Debug("Satış Koşulu Gerçekleşti."); Debug($"{tickData.Transaction.TransactionDate.ToLongTimeString()} | {tickData.Transaction.TransactionPrice} | {tickData.Transaction.TransactionSize} | " + $"{tickData.Transaction.TransactionVolume} | {tickData.Buyer.Name} | {tickData.Seller.Name}"); } } } } }
SendOrderSequentialForShort #
SendOrderSequential fonksiyonundan farkı hisse senetlerine özel açığa satış ve açığa satış kapatma emirlerinin sırasının korunmasını sağlamasıdır. Diğer türde emirlerden etkilenmeyecektir.
Parametre olarak SendOrderSequential fonksiyonuyla aynı tipte parametreleri almaktadır.
Ek Notlar #
Emirlerin sıralı gönderildiği açığa satış işlemleri yapılan stratejilerde kod içerisinde son emrin yönü takip edilmek isteniyorsa, bu işlem için LastOrderSideForShort alanı kullanılabilir.
if(LastOrderSideForShort.Obj == Side.Sell) Debug("Son emir yönü AÇIĞA SATIŞ");