Pozisyon limitleri, teminat, fat-finger sınırları ve bir kill switch, her emir gateway'den çıkmadan önce yanıt vermek zorundadır. Bu kontroller emir yolunun yanında değil içinde şöyle yaşar: bellekte hangi durum durur, ne artımlı olarak yeniden hesaplanır ve yeniden başlatmadan sonra ne olur. Önce kısıtlar gelir.
Bir emir gateway'e ulaşır. Borsaya çıkmadan önce, hesabın onu göndermeye izinli olup olmadığına bir şeyin karar vermesi gerekir. Bu karar, gayet yolunda olan ezici çoğunluk dahil her emirde çalışır; dolayısıyla maliyetini yalnızca reddedilenler değil, tüm normal trafik öder.
İlk adlandırılması gereken kısıt budur. Emir yoluna yerleştirilen bir risk kontrolü, emir girişine konan bir vergidir. Mühendislik sorusu, kontrolü nasıl akıllı yapacağımız değil; trader'ların hissetmeyeceği kadar küçük ve reddetmesi gerekenleri yine de reddedecek kadar dürüst nasıl yapacağımızdır.
Sıcak yol tam olarak tek bir soruyu yanıtlar: bu hesap hakkında şu an bildiklerimize göre bu emir hemen gönderilebilir mi. Bu soruyu yanıtlayan kontroller içeride kalır. Başka bir soruyu yanıtlayanlar dışarı çıkar.
Geri kalan her şey yolun yanında, aynı durum üzerinde ve emri tutmadan çalışır. Sıcak yolun uyguladığı limitleri besler, ama trader ile borsanın arasına girmez.
Ayrım çizgisi bir kategori değil, bir sorudur. Yolun içinde: bu emir çıkabilir mi. Yolun yanında: limitler ne olmalı. İkinci soruyu yanıtlayıp yine de emri bloklayan her şey, kontrol ne kadar önemli olursa olsun bir tasarım hatasıdır.
İşlem öncesi bir kontrolün ihtiyaç duyduğu durum - güncel pozisyonlar, açık emirler, kullanılan ve kullanılabilir teminat, limit yapılandırması - kararı veren sürecin belleğinde yaşar. Bir veritabanının önündeki önbellekte değil, bir ağ çağrısının ardında değil. Sürecin içinde.
Sebep yalnızca hız değil, gerçi bir sorgu yerel bir dizideki aramadan kat kat pahalıdır. Sebep doğruluktur. Veritabanı pozisyonu yazıldığı haliyle tutar. Risk kontrolünün ihtiyaç duyduğu pozisyon ise, az önce gönderilmiş ama henüz gerçekleşmemiş, onaylanmamış veya kalıcılaştırılmamış emirleri de içerir. Depolamadan okursanız, kendi akışınızın çoktan geride bıraktığı bir geçmişe karşı kontrol yaparsınız.
Pratikte bu, süreci herhangi bir düşük latency bileşeninin şekillendiği gibi şekillendirir:
Veritabanı, pozisyonun kaydedildiği yerdir. Pozisyonun bilindiği yer değildir.
Bir hesabın riskinin ve teminatının baştan hesaplanması, her pozisyonu ve her açık emri dolaşır. Bu maliyet defterin büyüklüğüyle birlikte artar; yani risk kontrolü tam da en çok işlem yapan müşteriler için yavaşlar. Bu yüzden sıcak yol yeniden hesaplamaz. Bir delta uygular.
Hesap, işleyen toplamlar taşır - enstrüman ve grup bazında net ve brüt risk, kullanılan teminat, yolda olan nominal tutar. Gelen bir emir bu toplamlarda küçük bir değişiklik üretir, değişen değerler limitlerle karşılaştırılır ve emir kabul ya da reddedilir. İş, portföyle değil emirle orantılıdır.
Tam yeniden hesaplama yine de yapılır - belirli aralıklarla, teminat parametreleri değiştiğinde ve artımlı sonuca karşı periyodik bir öz denetim olarak. Yolun dışında, bir kopya üzerinde çalışır ve sonucu ya yerine konur ya da bir tutarsızlık olarak bildirilir. Gerçek durumdan sessizce sapan artımlı bir durum, hiç kontrol olmamasından daha kötüdür; bu yüzden karşılaştırma isteğe bağlı değildir.
Kurduğumuz risk yolunda ölçüldüğünde, işlem öncesi kontrolün kendisi <1 ms içinde tamamlanır. Bu rakam, bellekteki durum üzerindeki kararı kapsar; bir emrin istemciden borsaya gidip geri dönen tüm yolculuğunu değil.
Bir kill switch tam da bir şeyler zaten ters gittiğinde kullanılır. Bu da onu, kendisi bozuk olabilecek mekanizmanın üzerine kurmayı dışlar. Kendi kuralları olan ayrı bir yoldur.
Yeni emirleri durdurmak kolay yarısıdır. Zor yarısı, switch'in borsada zaten bekleyen emirlere ne yaptığıdır: gönderim yolu kapalıyken kotasyonları çekmek ve açık emirleri iptal etmek mümkün olmalıdır. Bu iptal yolu kendi testlerini hak eder, çünkü normal bir günde değil en kötü günde çalıştırılır.
Bellekteki durum, kalıcı bir kaydın türetilmiş bir görünümüdür. Bir yeniden başlatmayı atlatılabilir kılan da budur. Risk durumunu değiştiren her olay - kabul edilen bir emir, serbest bırakılan bir rezervasyon, uygulanan bir gerçekleşme, değiştirilen bir limit, devreye alınan switch - aşağı akışta işlenmeden önce yerel makinedeki bir journal'a eklenir.
Kurtarma süresi o zaman defterin büyüklüğüne değil, journal uzunluğuna ve drop copy'nin erişilebilirliğine bağlıdır; her bilinmeyenin hata modu ise aynıdır: hesapta işlem yapmayı reddet.
Dürüst sınırları açıkça söylemeye değer, çünkü bu mimarinin size uyup uymadığını onlar belirler:
amBrain, brokerlar ve prop firmalar için bu tür işlem öncesi risk yolları kurar; sıcak yollar Rust ile yazılır. Ekip 2019'dan beri Erivan, Ermenistan'dan trading altyapısı üzerinde çalışıyor.
Mühendislik ekibimiz FinTech çözümlerinde uzmanlaşmıştır. Projenizi nasıl hayata geçirebileceğimizi konuşalım.