İçeriğe geç

Piyasa Verisi — Ekranda Görünen Satış Neden Gerçekte Yoktu?

İleri 9 dk Sık karşılaşılır

Önce şunu oku: FIX Oturumu ve Sıra Numarası — İki Gerçekleşme Nereye Kayboldu?

30 saniyede özet

Borsa piyasa verisini numaralı değişiklikler olarak gönderir: ekle, sil, işlem gördü. Tek bir mesaj kaybolursa yerel defter sessizce yanlış kalır; boşlukta durup eksiği istemek ve sırayla uygulamak gerekir.

Bir maçı radyodan dinliyor, skoru kendi tahtana yazıyorsun. Spiker skoru söylemiyor, yalnızca “ev sahibi bir gol attı” diyor. Bir anonsu kaçırırsan tahtan maçın sonuna kadar yanlış kalır.

  1. Bayt: Arbitraj stratejisi en iyi satışı görünce alıyor. Ekranda 100,10'dan 200 lot var, al!

  2. Sen: Emir gitti ama eşleşmedi. Borsanın defterinde 100,10'da kimse yokmuş.

  3. Bayt: Ama bizim defterimizde duruyor! Ekranı kim yalan söyletiyor?

  4. Bayt: Defteri borsadan gelen değişikliklerle biz kuruyoruz. Bir değişikliği kaçırmış olabilir miyiz?

Borsa defteri değil, değişikliği gönderir

Borsalar piyasa verisini çoğu zaman bir değişiklik akışıDefterin kendisi yerine numaralı değişiklikleri (emir eklendi, silindi, işlem gördü) yayan piyasa verisi. ITCH buna bir örnektir.Sözlükte gör → olarak yayar. Her mesaj küçük bir değişikliktir: şu emir eklendi, şu emir silindi, şu emir 100 lot işlem gördü. ITCH bu tür akışlara bir örnektir.

Alıcı kendi yerel defterAlıcının değişiklik akışını sırayla uygulayarak kendi belleğinde kurduğu emir defteri kopyası.Sözlükte gör → bu mesajları sırayla uygulayarak kurar. Defter doğruysa, sebebi gelen her mesajın uygulanmış olmasıdır.

Kafam karıştı, daha basit anlat

Borsa değişiklikleri gönderir. Defteri sen, onları sırayla uygulayarak kurarsın.

Hızlı kontrolBaşlangıç

Değişiklik akışında (ITCH gibi) borsa ne gönderir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Yerel defter nasıl kurulur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tek bir kayıp, sessiz bir hata

B emri 100,10'dan satışta. Borsa 'B silindi' mesajını gönderdi ama mesaj yolda kayboldu. Sonraki mesajlar sorunsuz geliyor. Yerel defterde ne olur? Cevabı göster

B, yerel defterde sonsuza kadar kalır. Silme mesajı hiç gelmediği için defter B’yi silmez. Sonraki mesajlar B’den söz etmez; hiçbir şey hata vermez.

Numara atlanırsa dur, eksik anonsu iste.
Adım adım oku
  1. Skor anonslarla güncelleniyor.
  2. Bir anons cızırtıda kayboldu.
  3. Tahta yanlış, kimse fark etmedi.
  4. Numara atlanırsa dur, eksik anonsu iste.

Kaybı yakalayan, yine sıra numarasıdır. Piyasa verisi mesajları da numaralıdır; beklenen numara atlanırsa defter bayat sayılır.

Bayat defter işlem için kullanılmaz. Eksik mesajlar tekrar istenir ya da borsadan defterin bir anlık görüntüDefterin belirli bir sıra numarasındaki tam hâli. Geç başlayan ya da boşluk yaşayan alıcı onu alıp o numaradan itibaren akışı uygular.Sözlükte gör → alınır. Boşluktan sonra gelen mesajlar bu arada bekletilir ve sonra sırayla uygulanır.

Kafam karıştı, daha basit anlat

Numara atlanırsa defteri bayat say. Eksiği iste, bekletileni sırayla uygula.

Hızlı kontrolOrta

"B emri silindi" mesajı kayboldu, sonraki mesajlar geliyor. Yerel defterde ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Beklenen numara 3 iken 4 geldi. Doğru tepki?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Bayat defter, yanlış defterden iyidir

Boşlukta duran sistem bir süre işlem yapamaz. Bu bir kayıptır, ama sınırlı ve görünür bir kayıptır.

Boşluğu fark etmeyen sistem ise var olmayan fiyatlara emir gönderir. Arbitraj gibi iki defteri karşılaştıran bir stratejide hayalet bir fiyat, hayalet bir fırsat gibi görünür.

Kafam karıştı, daha basit anlat

Durmak görünür bir kayıptır. Yanlış defterle işlem, görünmez bir kayıptır.

Hızlı kontrolOrta

Neden bayat defterle işlem yapmamak, yanlış defterle işlem yapmaktan iyidir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Piyasa verisinde bir silme mesajı kayboldu

Tohum 206528
Alıcının kurduğu satış tarafı
· boş

Beklenen: #1 · bekletilen: —

· en iyi satış: —

Hız
Adım 0

Şu an ne oldu?

Beklenen mesaj: #1

Akış defterin kendisini değil, değişiklikleri gönderiyor.

Görevler0/3

  • Defterde silinmiş bir satış kalsınaçık

    İpucu

    Geleni uygula.

  • Boşluğu fark et ve bayat defteri kullanmaaçık

    İpucu

    Boşlukta dur.

  • Defter borsayla birebir tutsunaçık

    İpucu

    Eksik mesajı iste.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. 3 numaralı “sil B” kayboldu. Defterde en iyi satış B: borsada artık olmayan bir emir.
  2. “Boşlukta dur”u seç. 4 numara gelince defter bayat işaretlendi ve kullanılmadı.
  3. “Eksik mesajı iste”yi seç. 4, 5 ve 6 bekletildi; 3 gelince hepsi sırayla uygulandı. En iyi satış A, 200 lot.
Hızlı kontrolOrta

Simülatörde "eksik mesajı iste" seçilince neden en iyi satış A oldu?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Yavaş tüketici. Akış çok hızlıysa ve defteri güncelleyen kod yetişemiyorsa, işletim sisteminin tamponu taşar ve paketler düşer. Bu da bir boşluktur; tüketiciyi ölç ve hafif tut.

Bayatlığı göstermemek. Bayat defter ekranda normal görünüyorsa, insanlar ona göre karar verir. Bayat olduğunu ikon ve yazıyla göster.

Gün başını atlamak. Sistem gün ortasında başlarsa, o ana kadarki değişiklikleri bilmez. Önce anlık görüntüyü al, sonra akışı onun numarasından itibaren uygula.

Kafam karıştı, daha basit anlat

Tüketiciyi hafif tut, bayatlığı göster, geç başlayınca önce anlık görüntüyü al.

Hızlı kontrolİleri

Sistem gün ortasında başladı. Akışı hemen uygulamaya başlarsa ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aşağıda bir değişiklik akışından defter kuran sınıf var: boşlukta defteri bayat işaretler, sonraki mesajları bekletir ve eksik geldiğinde sırayla uygular.

Derinleş · Piyasa verisi: değişiklik akışından yerel defter 3 dosya · ~83 satır · ilk okumada atlayabilirsin
Proje dosyaları

marketdata/src/main/java/com/bank/marketdata/ FeedMessage.java FeedMessage: akıştan gelen numaralı değişiklik; ekle, sil ya da işlem gördü.

marketdata/src/main/java/com/bank/marketdata/FeedMessage.java
package com.bank.marketdata;
public sealed interface FeedMessage permits FeedMessage.Add, FeedMessage.Delete, FeedMessage.Executed {
long seq();
record Add(long seq, String orderId, long priceKurus, long qty) implements FeedMessage {}
record Delete(long seq, String orderId) implements FeedMessage {}
record Executed(long seq, String orderId, long qty) implements FeedMessage {}
}

marketdata/src/main/java/com/bank/marketdata/ RetransmitClient.java BookBuilder: beklenen numarayı uygular, boşlukta defteri bayat işaretler ve eksik mesajı ister; bekletilenleri sırayla uygular.

marketdata/src/main/java/com/bank/marketdata/RetransmitClient.java
package com.bank.marketdata;
public interface RetransmitClient {
/** Asks the exchange's retransmission service for [from, to]. Answers arrive on the feed. */
void request(long from, long to);
}

marketdata/src/main/java/com/bank/marketdata/ BookBuilder.java RetransmitClient: eksik numaraları borsanın tekrar gönderim servisinden ister.

marketdata/src/main/java/com/bank/marketdata/BookBuilder.java
package com.bank.marketdata;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public final class BookBuilder {
private final RetransmitClient retransmit;
private final Map<String, FeedMessage.Add> orders = new HashMap<>();
private final Map<String, Long> remaining = new HashMap<>();
private final TreeMap<Long, FeedMessage> buffered = new TreeMap<>();
private long expected = 1;
private boolean stale;
public BookBuilder(RetransmitClient retransmit) {
this.retransmit = retransmit;
}
public void on(FeedMessage message) {
long seq = message.seq();
if (seq < expected) {
return; // already applied: a retransmitted copy
}
if (seq > expected) {
if (!stale) {
stale = true; // do not trade on this book
retransmit.request(expected, seq - 1);
}
buffered.put(seq, message);
return;
}
apply(message);
while (!buffered.isEmpty() && buffered.firstKey() == expected) {
apply(buffered.pollFirstEntry().getValue());
}
stale = !buffered.isEmpty();
}
private void apply(FeedMessage message) {
switch (message) {
case FeedMessage.Add add -> {
orders.put(add.orderId(), add);
remaining.put(add.orderId(), add.qty());
}
case FeedMessage.Delete delete -> {
orders.remove(delete.orderId());
remaining.remove(delete.orderId());
}
case FeedMessage.Executed executed -> {
long left = remaining.merge(executed.orderId(), -executed.qty(), Long::sum);
if (left <= 0) {
orders.remove(executed.orderId());
remaining.remove(executed.orderId());
}
}
}
expected = message.seq() + 1;
}
public boolean isStale() {
return stale;
}
}

Kendini sına

Şimşek turu1/4

Değişiklik akışında her mesaj bütün defteri taşır.

Soru 1/3İleri

Akış hızlandığında defter kodu yetişemiyor ve boşluklar artıyor. Neden?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Değişiklik akışında yerel defter, gelen her mesajın sırayla uygulanmasıyla kurulur. Tek bir kayıp, defteri hiçbir hata vermeden yanlış bırakır.
  2. 2 Sıra numarasında boşluk görülünce defter bayat sayılır ve işlem için kullanılmaz. Yanlış defterle işlem yapmaktansa hiç yapmamak iyidir.
  3. 3 Eksik mesaj tekrar istenir ya da defterin bir anlık görüntüsü alınır; boşluktan sonra gelen mesajlar bekletilip sırayla uygulanır.
Sonraki kapı Biri 1.000 yazacakken 10.000 yazdı, sonra strateji aynı emri döngüde göndermeye başladı. İlk dakikada neyin durdurması gerekirdi? İşlem Öncesi Risk ve Kill Switch — Strateji Durmadan Emir Yağdırırsa? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı