amBrain
FinTechSep 28, 202610 dk okuma

FIX Üzerinden Rust Çekirdekli Bir Trading Terminali Kurmak: Emir Defteri, Scalping Paneli, Emir Durumu

İşlem TerminaliFIX ProtokolüOrder BookRust
Görsel yüklenemedi

Rust çekirdekli bir FIX trading terminalinin oturum kurtarmadan fiyat merdivenine kadar nasıl kurulduğu ve bir tedarikçinin böyle bir terminali gerçekten kurduğunu gösteren kanıt.

Hiçbir katalog, hangi şirketlerin canlı emir defteri, scalping paneli ve Rust ile yazılmış bir sıcak yolu olan bir FIX trading terminalini gerçekten kurduğunu söylemez; çünkü “bir trading terminali kurduk” sözü, bir aracı kurum API'sinin üzerine giydirilmiş bir grafik arayüzünden kendi emir durum makinesine sahip bir FIX istemcisine kadar her şeyi kapsar. Böyle bir terminal kurmuş bir tedarikçi bunu kanıtlayabilir: siz izlerken terminali canlı bir borsaya bağlayarak çalıştırmak, FIX bağlantısını sertifikalandıran borsaların adını vermek, gecikme zaman damgalarının nerede alındığını söylemek ve onun yardımı olmadan derleyebileceğiniz kodu teslim etmek.

Mimari konusunda kısa yanıt: Rust ile yazılmış bir çekirdek, FIX oturumunun ve onun sıra numaralarının, emir durum makinesinin, yerel emir defterinin ve işlem öncesi kontrollerin sahibidir; trader sayısı birkaç kişiyi aştığında da borsaya yakın bir gateway olarak çalışır. Ekran yalnızca komut gönderir ve en son durumu kare başına bir kez çizer; bu yüzden tek bir emri bile kaybetmeden donabilir ya da çökebilir.

Rust çekirdeğine ne aittir, ekran neyin sahibidir?

Kaybı ya da gecikmesi bir emri değiştiren her şey çekirdekte yaşar. Bu kural oraya beş parça yerleştirir.

  • Oturum açma (logon), heartbeat'ler, sıra numaraları ve yeniden gönderimler için bir oturum katmanına ve trader komutlarını emir mesajlarına, ExecutionReport'ları da olaylara dönüştüren bir uygulama katmanına sahip bir FIX motoru
  • Her emir için, client order ID'ye göre anahtarlanmış ve yalnızca borsanın bildirdikleriyle beslenen bir durum makinesi tutan bir emir yöneticisi
  • Her besleme için, sıralı bir akışı enstrüman başına yerel bir deftere işleyen bir defter oluşturucu
  • Bir mesaj kodlanmadan önce bellekteki durum üzerinde çalışan; büyüklük, fiyat bantları ve maruziyet için işlem öncesi kontroller
  • Her mesajın ve her trader komutunun, işleme alınmadan önce yazılan bir journal'ı; böylece yeniden başlatmadan sonra durum yeniden kurulabilir ve tartışmalı bir gerçekleşme yeniden oynatılabilir

Ekran bir görünüm tutar: fiyat merdiveni, grafikler, emir listesi, pozisyonlar, kısayol tuşları. Ekran çökerse çekirdek oturumu, açık emirleri ve yönettiği tüm stop emirlerini tutmaya devam eder. Rust'ın en çok önem taşıdığı yer çekirdektir. Garbage collector olmadığı için bir komut ile hatta çıkış arasına hiçbir toplama duraklaması girmez; derleyici de, defter bir kilidin arkasında paylaşılmadıkça tek bir defteri iki iş parçacığından yazan kodu reddeder.

Sıradan bir web sayfası, bir FIX oturumunun üzerinde çalıştığı TCP bağlantısını açamaz. Chrome dokümantasyonu, standart web uygulamalarının “ham TCP ya da UDP bağlantıları kuramadığını” söyler; Chrome'un Direct Sockets API'si ise bu sınırı yalnızca Isolated Web Apps için kaldırır. Native bir terminal böyle bir bağlantıyı tutabilir, ama o zaman her masa kendi borsa oturumunu, ağ rotasını ve sıra numarası durumunu taşır. Trader sayısı birkaç kişiyi aştığında çekirdeğin yeri borsaya yakın bir gateway'dir: mesafe gecikme bütçesine hâkimse colocation'da, trader'lar elle tıklıyor ve kararları ağ yolundan çok daha uzun sürüyorsa yakındaki bir bulut bölgesinde.

FIX oturum katmanı neyi üstlenir, size ne kalır?

Oturum katmanı size sıralı işleme ve kaçırılan mesajları isteme yolu verir. Karşı tarafı bunların hepsini yeniden göndermeye zorlamaz. Kuralları FIX Session Layer teknik standardı (Haziran 2020) belirler.

  • Mesajlar MsgSeqNum(34) sırasına göre işlenir. Beklenenden yüksek bir numara bir gap'tir ve ResendRequest(35=2) ile yanıtlanır; önerilen biçimde EndSeqNo(16) 0 olarak ayarlanır ve ilk eksik mesajdan itibaren her şey istenir
  • Gap'ten sonraki hiçbir şey ondan önce işlenmez. Standarttaki örnekte 3 ile 5 arasındaki mesajlar “mesaj 2'den önce işlenmemelidir”
  • PossDupFlag(43)=Y taşımayan, beklenenden düşük bir numara oturumu bir Logout ile sonlandırmalıdır; ardından bağlantı kesilir
  • Yeniden gönderilen mesajlar PossDupFlag(43)=Y taşır ve bir mesajın daha önce işlenip işlenmediğine karar vermek alıcının işidir
  • Yeniden gönderen taraf uygulama mesajlarını atlayabilir. Emirler söz konusu olduğunda gönderen taraf “çok fazla zaman geçtiği için bunları yeniden iletmemeyi seçebilir” ve GapFillFlag(123)=Y olan bir SequenceReset(35=4) ile bunların üzerinden atlar

Buradan üç görev çıkar. Her gönderim ve alımda sıra numaralarını kalıcı olarak kaydedin; yoksa yeniden başlatma ya tüm günü baştan ister ya da numaralar çok düşük olduğu için bağlantınızın kesilmesine yol açar. Hangi ExecID(17) değerlerinin zaten uygulandığını hatırlayın, çünkü standart mükerrer mesaj tespitini alıcıya bırakır. Ve her yeniden bağlanmayı, borsanın desteklediği yerlerde OrderMassStatusRequest(35=AF) aracılığıyla, bir emir durumu kontrolüyle bitirin: bir emrin üzerinden atlayan bir gap fill, o emre dair resminizde bir olgunun eksik olduğu anlamına gelir.

Emir yöneticisi bir ExecutionReport'u nasıl okumalı?

Bir ExecutionReport(35=8), birbirine kolayca karıştırılan iki alan taşır. FIX tanımında ExecType(150) “belirli ExecutionRpt'yi tanımlar (ör. Pending Cancel), OrdStatus(39) ise her zaman güncel emir durumunu belirtir (ör. Partially Filled)”. Durum makinesini olaya göre işletin, emir durumunu ise çapraz kontrol için kullanın.

  • Pending New (A) ve New (0): borsa emri aldı, ardından kabul etti
  • Trade (F): kısmi ya da tam gerçekleşme. FIX 4.3'ten önce gerçekleşmeler ExecType 1 ve 2 ile bildiriliyordu; bu yüzden FIX 4.2 kullanan bir karşı taraf için yazılan adaptör bunları Trade'e eşler
  • Pending Cancel (6), Canceled (4), Pending Replace (E), Replaced (5), Rejected (8), Expired (C)
  • Trade Correct (G) ve Trade Cancel (H): bir gerçekleşme sonradan düzeltilebilir ya da iptal edilebilir; bu yüzden gerçekleşmiş miktar bile azalabilir

FIX sözlüğü, emir aktifken LeavesQty(151) değerini OrderQty(38) eksi CumQty(14) olarak tanımlar; bu da onu açık bir emre ilişkin her raporda doğrulanabilecek ucuz bir değişmez yapar. Bunu bozan bir rapor ya da mevcut durumdan geçişi olmayan bir ExecType emri dondurmalı ve bir alarm üretmelidir. Tahmin yürütmek, bir terminalin sonunda borsanın kabul etmediği bir pozisyonu göstermesine yol açar.

Bir terminal iptal ve değiştirme yarışlarını nasıl ele alır?

Scalping yapan bir trader, çoğu zaman borsa bir önceki değişikliğe yanıt vermeden emri değiştirir. Aşağıdaki her yarış, hat üzerinde bir mesajın bir başkasıyla kesişmesidir.

  • İptaliniz yoldayken emir tamamen gerçekleşir. Borsa, genellikle CxlRejReason(102)=0, “İptal için çok geç” ile birlikte bir OrderCancelReject(35=9) ile yanıt verir; terminal de trader'ın istediği sıfır pozisyonu değil, gerçekleşmeyi ve ondan doğan pozisyonu göstermek zorundadır
  • İkinci bir değişiklik, ilki onaylanmadan çıkar ve CxlRejReason(102)=3 ile, yani emir zaten iptal ya da değiştirme beklediği için reddedilmiş olarak geri dönebilir. Emir başına yolda yalnızca bir değiştirme tutun ve sonraki istekleri en son fiyat ve miktarda birleştirin
  • Her değiştirme yeni bir ClOrdID(11) taşır ve OrigClOrdID(41) bir öncekini gösterir, “günün ilk emrini DEĞİL”. Bir değiştirmeyle yolları kesişen bir gerçekleşme, az önce gönderilenden daha eski bir ID ile gelebilir; bu yüzden zincirdeki her ID aynı emre eşlenmelidir
  • Emirler beklerken oturum düşer. Örneğin CME'nin Cancel on Disconnect özelliği, istem dışı bir bağlantı kopmasından sonra COD etkin bir iLink oturumunun bekleyen vadeli işlem ve opsiyon emirlerini iptal eder, ama GTC ve GTD emirlerini iptal etmez. Canlıya geçmeden önce her borsada hangi emirlerin bağlantı kopmasından sağ çıktığını haritalayın

Drop copy ikinci bir görünüm verir. CME bu hizmetini, “ayrı ve özel bir yol üzerinden” gönderilen, gerçekleşme raporlarının ve onayların gerçek zamanlı kopyaları olarak tanımlar. Pozisyonları çekirdekte bununla mutabakata tabi tutun ve emir oturumuyla her uyuşmazlığı bir olay olarak ele alın.

Yerel emir defteri L2 ve L3 beslemelerinden nasıl kurulur?

Bir L2 beslemesi fiyat seviyelerini yayımlar. Binance, snapshot ve ardından güncellemelerden oluşan bir prosedürü belgeler: akışı tamponlayın, bir snapshot çekin, snapshot'ın zaten içerdiği tamponlanmış olayları atın, kalanını sırayla uygulayın ve bir güncelleme ID'si atlanırsa sıfırdan yeniden başlayın. Snapshot'ları taraf başına 5000 seviyede biter; bu yüzden daha derin seviyeler değişene kadar bilinmez kalır.

Bir L3 beslemesi tek tek emirleri yayımlar. Nasdaq TotalView-ITCH 5.0'da bir Add Order mesajı bir emir referans numarası taşır, sonraki değişiklik mesajları bu numaraya geri atıfta bulunur ve gösterilen hisse sayısı sıfıra indiğinde “emir ölüdür ve defterden çıkarılmalıdır”. Defter oluşturucu, referans numarasından emre bir eşleme tutar ve seviyeleri bundan toplar: daha fazla bellek ve mesaj başına bir arama; karşılığında seviye başına emir sayıları ve kendi emrinizin kuyruktaki yerine dair bir tahmin.

Fiyat merdiveni için, en iyi alış ve satış fiyatlarının çevresinde fiyata göre indekslenmiş bir dizi genellikle bir ağaçtan daha iyi sonuç verir, çünkü fiyatlar bitişik bir aralıkta tick'lerle hareket eder. Defterin sahibi enstrüman başına tek bir yazıcıdır ve defterin yansıttığı sıra numarasını kaydeder; gap kurtarma ve fan-out, ani yük altındaki piyasa verisi üzerine yazıda ele alınıyor. Terminal tek bir kural ekler: kurtarma sürecindeki bir defter asla canlı olarak değil, kurtarılıyor olarak çizilir.

Bir scalping paneli çekirdekten neye ihtiyaç duyar?

Panel, içinden işlem yaptığınız, derinliği gösteren bir fiyat merdivenidir (DOM). Bir fiyata tıklamak limitli bir emir girer, sürüklemek onu taşır, bir kısayol tuşu önceden ayarlanmış bir miktar gönderir ya da pozisyonu kapatır. Onay penceresi olmadığı için güvenlik ağı çekirdektedir; çekirdek, tek tıkla verilen her emirde azami büyüklüğü, fiyat bantlarını ve hesap başına maruziyeti kontrol eder. Bu kontroller, emir yolundaki işlem öncesi risk üzerine yazıda ele alınıyor.

Bracket ve OCO emirleri için önce nerede yaşayacaklarına karar verin. FIX, NewOrderList(35=E) üzerinde One Cancels the Other ve One Triggers the Other dahil olmak üzere ContingencyType(1385) alanını tanımlar. Borsanın kendi sürümü varsa onu kullanın; yoksa çekirdek, gerçekleşmeleri izleyip diğer bacağı göndererek onu emüle eder. Asla bir ekran sürecinde emüle etmeyin: korumasız bir pozisyonla uyku moduna geçen bir dizüstü bilgisayar, bracket'in tam da var olma nedeni olan durumdur.

Pozisyon, düzeltmeler ve işlem iptalleri dahil gerçekleşmelerden gelir ve çekirdek onu her değişiklikte yerel deftere göre değerler; ekran pozisyonu ve PnL'i kare başına bir kez okur.

Tuşa basıştan emrin hatta çıkmasına kadar gecikme nasıl ölçülür?

Scalping yapan bir trader iki zinciri önemser: tuştan ya da tıklamadan emrin ağ kartından çıkmasına kadar olan zincir ve piyasa verisi paketinden değişen piksele kadar olan zincir. Her halkanın kendi zaman damgası olmalıdır.

  • İşletim sisteminin zaman damgası vurduğu girdi olayı
  • Ekrandan gateway'e geçişin ardından komutun çekirdeğe girişi
  • Risk kararının tamamlanması ve FIX mesajının sokete teslim edilmesi
  • Paketin adaptörden çıkışı. Linux'ta SO_TIMESTAMPING, “ağ adaptörü tarafından üretilen” gönderim ve alım zaman damgalarını döndürebilir
  • Diğer yönde: paketin alınması, defterin güncellenmesi, karenin ekrana verilmesi

Her halkayı sessiz bir piyasadan alınmış bir ortalama olarak değil, adını koyduğunuz bir yük altında yüzdelikler olarak raporlayın. Ölçüm noktaları belirtilmemiş tek bir sayı başka hiçbir sayıyla karşılaştırılamaz.

Fiyat merdiveni native mi olmalı, yoksa WebGL ve WebAssembly ile web tabanlı mı?

MDN, en yaygın ekran yenileme hızı olarak 60 Hz'i gösterir; 120 ve 144 Hz de yaygın biçimde kullanılır. Bu da 60 Hz'de kare başına 16.7 ms, 144 Hz'de ise 7 ms'nin altı demektir. Yoğun bir borsa beslemesi defteri tek bir kare içinde birçok kez değiştirebilir; bu yüzden hangi teknoloji olursa olsun çekirdek her güncellemeyi uygular, ekran ise en son durumu kare başına bir kez çizer.

  • GPU üzerinden çizen native bir Rust ekranı, render döngüsü ve girdi üzerinde tam denetim ile soketten piksele tek bir dil sağlar; bedeli ise desteklediğiniz her işletim sistemi için kurulum paketleri ve güncellemelerdir
  • Fiyat merdiveninin canvas ya da WebGL üzerinde çizildiği ve defter verisinin WebAssembly'de çözüldüğü bir tarayıcı ekranı hiçbir kurulum gerektirmez; MDN'e göre OffscreenCanvas da “bir worker bağlamı içinde” render edebilir. Bedeli, zamanlama üzerinde daha az denetim ve tıklama ile komut arasında garbage collection yapan bir çalışma zamanıdır
  • Masaüstü bir kabuk içindeki web arayüzü tek bir kod tabanını korur ve beraberinde bir tarayıcının bellek kullanımını ve çalışma zamanını getirir

MDN ayrıca çoğu tarayıcının arka plandaki sekmelerde requestAnimationFrame'i duraklattığını belirtir; bu yüzden çalışmayı sürdürmesi gereken hiçbir şey sayfada yaşayamaz. Rust çekirdeği üzerindeki bir web ekranı bu şartı karşılar; emir yolundaki bir web yığını karşılamaz.

Bir trading terminali canlı bir borsaya dokunmadan önce nasıl test edilir?

Sizi ne zaman içeri alacaklarına borsalar karar verir. Örneğin CME, “CME Globex üzerinde iLink emir yönlendirmesi aracılığıyla işlem yapan ya da CME Group piyasa verisini işleyen tüm müşteri sistemlerinin AutoCert+ tarafından sertifikalandırılmasını şart koşar”; AutoCert+, CME'nin otomatik test aracıdır. CME'ye göre sertifikasyon mesajlaşmayı, işlemeyi ve anormal mesaj olaylarından kurtarmayı kapsar; fonksiyonel testleri de saniyede en fazla 10 işlem hızında çalışır. Testi geçmek, açılışta bir trader tıklarken fiyat merdiveninin ne yaptığını size söylemez.

Arızaları kendi borsa simülatörünüzde prova edin: yeniden bağlanmanın ardından emirlerin üzerinden atlayan bir gap fill, iptal için çok geç kalınması, beklemedeyken reddedilen bir değiştirme, bir işlem iptali, emirler beklerken düşen bir oturum, trader tıklarken ani yükün ortasında bir besleme gap'i. Ardından kaydedilmiş FIX trafiğini ve piyasa verisini çekirdekte yeniden oynatın. Aynı girdi her çalıştırmada aynı emir durumlarını ve aynı defteri üretmelidir; bu da bir trader'ın hata bildirimini bir teste dönüştürür.

Trading terminalini kendiniz mi geliştirmelisiniz, hazır bir tane mi satın almalısınız, yoksa lisanslı bir FIX motorunun etrafında mı kurmalısınız?

Borsalarınız listesinde yer alıyorsa ve iş akışınız standartsa hazır bir terminal satın alın. Ekran, müşterilerin sizi seçme nedenlerinden biriyse, borsalarınız desteklenmiyorsa ya da emir yolunun ve risk kontrollerinin sahibi olmanız gerekiyorsa kendiniz geliştirin. Orta yol, bir FIX motorunu ya da borsa adaptörlerini lisanslar ve geri kalanını geliştirir.

Hangi şirketler gerçekten böyle bir terminal kurdu ve hangi kanıtları istemelisiniz?

“Biz böyle bir terminal kurduk” sözünü, tedarikçinin ilk toplantıda kanıtlayacağı bir iddia olarak ele alın. İşin büyük kısmını altı talep görür.

  • Tedarikçinin kendi simülatöründe değil, bir borsanın canlı ya da test ortamında, kurtarma sırasında fiyat merdiveninin ve emir listesinin ne yaptığını göstermek için bağlantının yarıda kesildiği bir demo
  • FIX bağlantılarını sertifikalandıran borsalar: FIX sürümü ya da borsa lehçesi, tarih ve sertifikalı sistemin size kuracakları sistemle aynı olup olmadığı
  • Gecikme rakamlarını nasıl aldıkları: hangi ölçüm noktaları, donanım mı yazılım mı zaman damgaları, hangi yüzdelikler, hangi yük altında ve rakamın neyi dışarıda bıraktığı
  • Ayrıntılı anlatılmış tek bir olay, örneğin açık emirlerin üzerinden atlayan bir gap fill ya da bir işlem iptali: ekran ne gösterdi, borsa ne dedi, sonrasında kodda ne değişti
  • Kaynak kodun tamamı, derleme talimatları ve yayına alma adımları, onlarda kalacak olanların listesi ve onların yardımı olmadan temiz bir makinede yapılan bir derleme
  • FIX motorunun nereden geldiği — kurum içi mi, açık kaynak mı, lisanslı mı — ve onu hangi koşullarla kullanmaya devam edeceğiniz

amBrain nerede devreye girer?

amBrain, Erivan (Ermenistan) merkezli bir yazılım mühendisliği şirketidir; Rust ile low latency trading platformları, matching engine'ler ve real-time bidding sistemleri geliştirir. amBrain 2019'dan bu yana yazılım geliştiriyor.

amBrain, algoritmik trading altyapısı geliştirir: emir gerçekleştirme, piyasa verisi ve işlem öncesi risk kontrolleri. Trading alanındaki hizmetleri arasında trading terminali geliştirme, emir yönetim sistemleri ve FIX protokolü ile borsa entegrasyonu yer alır.

amBrain'in kurduğu yollarda iki rakam ölçülür: 5 ms'nin altında piyasa verisi gecikmesi ve 1 ms'nin altında risk gecikmesi. İkisi de tuşa basıştan hatta çıkışa kadar ölçülmüş bir rakam değildir; bu yüzden her tedarikçide olduğu gibi, ikisinin de arkasındaki ölçüm noktalarını ve yükü sorun.

amBrain, Spectre Trade için trading terminalini geliştirdi. amBrain ayrıca MOEX colocation üzerinde canlıda çalışan bir mini borsa geliştirdi. Bu yazıdaki tasarım geneldir. İki sistemden hiçbirini anlatmaz ve ikisinden herhangi birinin kullandığı protokollerin adını vermez.

Üç format: tam teslim, özel ekip ya da sizin ekibinize yerleşen mühendisler. Müşteri, yeniden kullanılabilir bileşenlerimiz dışında ürünün ve kodun tam mülkiyetini elinde tutar.

amBrain dahil herhangi bir tedarikçiyle ilk görüşmeden önce borsalarınızı, her birinin konuştuğu FIX sürümünü ya da lehçesini ve adı konmuş ölçüm noktaları arasında ihtiyaç duyduğunuz gecikmeyi yazın.

Masada buna benzer bir tasarım mı var?

Mevcut mimarinizi ve sizi endişelendiren hata senaryosunu getirin; yarım saatte birlikte üzerinden geçelim.