İçeriğe geç

FIX Oturumu ve Sıra Numarası — İki Gerçekleşme Nereye Kayboldu?

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Emrin Yaşam Döngüsü — İptal Ettim Sandım, Borsa Neden Doldurdu?

30 saniyede özet

FIX oturumunda her mesajın bir sıra numarası vardır. Numaradaki boşluk kaybolmuş bir mesajdır ve tekrar istenir. Tekrar gelen mesajlar zaten işlenmiş olabilir; yalnızca beklenen numara işlenir, küçük olanlar atlanır.

Bir sözleşme sana sayfa sayfa geliyor ve her sayfanın altında bir numara var. İkinci sayfadan sonra beşinci sayfa geldi. Numaraya bakan biri hemen anlar: iki sayfa yolda kaybolmuş.

  1. Bayt: Borsadan gerçekleşmeler akıyor, her biri 100 lot. Ağ bir an gidip geldi, sonra devam etti.

  2. Sen: Gün sonu: borsa 600 lot diyor, OMS 400 lot. Hiç hata kaydı yok.

  3. Bayt: Hata yoksa 200 lot nereye gitti? Bağlantı koptu ama geri geldi ki!

  4. Bayt: Mesajların numarasına hiç bakmamışız. Sayfa eksik mi, kimse saymamış.

Her mesajın bir numarası var

Aracı kurumlar ve borsalar emirleri çoğu zaman FIXFinancial Information eXchange: emir, gerçekleşme ve iptal mesajları için yaygın standart. Bir oturum katmanı ve iş mesajlarından oluşur.Sözlükte gör → ile konuşur. İki taraf bir oturum açar ve oturum boyunca gönderdikleri her mesajı numaralar.

Bu sıra numarasıFIX oturumunda her mesaja verilen, birer artan numara (MsgSeqNum, tag 34). Boşluk kayıp, küçük numara tekrar demektir.Sözlükte gör → 1’den başlar ve her mesajda bir artar. Alıcı bir sonraki numarayı bilir: 2’yi aldıysa 3’ü bekler.

Kafam karıştı, daha basit anlat

Her mesajın bir sıra numarası var. Alıcı hep bir sonrakini bekler.

Hızlı kontrolBaşlangıç

FIX nedir?

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

Alıcı 2 numaralı mesajı işledi. Hangi numarayı bekler?

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

Boşluk, kaybolmuş bir mesajdır

OMS 2 numaralı mesajı işledi ve 3'ü bekliyor. Gelen mesajın numarası 5. Bu ne demek ve OMS ne yapmalı? Cevabı göster

3 ve 4 numaralı mesajlar kaybolmuş. OMS boşluğu fark edip 3’ten itibaren mesajları tekrar istemeli. 5’i şimdi işlerse, 3 ve 4’ün eksik olduğunu unutabilir.

Her sayfa bir kez, sırayla dosyada.
Adım adım oku
  1. Sözleşme sayfa sayfa geliyor.
  2. 2'den sonra 5 geldi.
  3. 3'ten itibaren tekrar gönderin.
  4. Her sayfa bir kez, sırayla dosyada.

Eksik mesajlar bir ResendRequestFIX'te kaybolan mesajları belirli bir numaradan itibaren tekrar isteyen mesaj (MsgType 2). Tekrar gelenler PossDup işaretlidir.Sözlükte gör → ile istenir: “3’ten itibaren tekrar gönder”. Karşı taraf 3, 4, 5 ve 6’yı yeniden yollar.

Kafam karıştı, daha basit anlat

Beklenenden büyük numara gelirse, arada kaybolan var. Ondan itibaren tekrar iste.

Hızlı kontrolOrta

OMS 3'ü beklerken 5 numaralı mesaj geldi. Bu ne demek?

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

Boşluk görülünce OMS ne yapmalı?

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

Tekrar gelen, tekrar sayılmaz

Tekrar gönderilen mesajlar PossDup işaretiyle gelir: “bunu daha önce görmüş olabilirsin”. 5 ve 6 ilk seferde de gelmişti. İkisini yeniden işleyen OMS, 200 lotu iki kez sayar.

Kural basittir: yalnızca beklenen numarayı işle. Küçük numara zaten işlenmiştir, atla. Büyük numara bir boşluğun habercisidir, tekrar iste.

Kafam karıştı, daha basit anlat

Beklenen numarayı işle. Küçüğü atla, büyüğü görünce tekrar iste.

Hızlı kontrolOrta

Tekrar gönderilen ve numarası beklenenden küçük, PossDup işaretli bir mesaj geldi. Ne yapılır?

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

Kendin gör

FIX oturumunda iki mesaj kayboldu

Tohum 912185
  1. #1 ·
  2. #2 ·
  3. #3 ·
  4. #4 ·
  5. #5 ·
  6. #6 ·

Beklenen: #1 · tekrar isteği: — yok · atlanan: —

· OMS: 0 lot · borsa: 600 lot

Hız
Adım 0

Şu an ne oldu?

Beklenen numara: #1

Her mesajın bir sıra numarası var. Arada boşluk var mı?

Görevler0/3

  • İki gerçekleşme sessizce kaybolsunaçık

    İpucu

    Numaraya bakma.

  • Tekrar iste, ama pozisyon şişsinaçık

    İpucu

    Gelen her mesajı işle.

  • Pozisyon borsayla birebir tutsunaçık

    İpucu

    Yalnızca sıradakini işle.

Olay günlüğü (0)

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

  1. Varsayılanla oynat. 3 ve 4 kayboldu; OMS numaraya bakmadığı için fark etmedi. 400 lot.
  2. “Tekrar iste, geleni hep işle”yi seç. Boşluk fark edildi ama 5 ve 6 iki kez işlendi: 800 lot.
  3. “Yalnızca sıradakini işle”yi seç. İlk gelen 5 ve 6 atlandı, tekrar gelenler sırayla işlendi: 600 lot.
Hızlı kontrolOrta

Simülatörde "tekrar iste, geleni hep işle" neden 800 lot gösterdi?

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

Tuzaklar

Numarayı bellekte tutmak. Uygulama yeniden başlayınca numaralar sıfırlanırsa, karşı taraf “beklenenden küçük numara” görür ve oturumu kapatabilir. Sıra numaraları ve gönderilen mesajlar diske yazılmalı.

Gün başı sıfırlaması. Numaralar çoğu zaman her işlem günü başında 1’e döner. İki tarafın sıfırlama saati uyuşmazsa sabah ilk bağlantıda oturum açılmaz.

Sessiz bağlantı. Bir süre mesaj gelmemesi, bağlantının koptuğu anlamına gelebilir. FIX bunun için düzenli Heartbeat ve cevap bekleyen TestRequest mesajları kullanır.

Kafam karıştı, daha basit anlat

Numaraları diske yaz. Sıfırlama saatini karşı tarafla eşle. Sessizliği Heartbeat ile yokla.

Hızlı kontrolOrta

OMS yeniden başlayınca sıra numarasını 1'den başlatıyor. Ne olur?

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

Aşağıda bir QuickFIX/J oturum ayarı ve sıra numarası kuralını gösteren küçük bir sınıf var. Gerçek FIX motorları bu kuralı kendisi uygular; sınıf, motorun ne yaptığını görmek için.

Derinleş · Borsa bağlantısı: FIX oturumu ve sıra numarası 3 dosya · ~67 satır · ilk okumada atlayabilirsin
Proje dosyaları

oms/src/main/resources/ fix-session.cfg Oturum ayarı: numaralar ve mesajlar diske yazılıyor, yeniden bağlanınca sıfırlanmıyor, Heartbeat aralığı belirli.

oms/src/main/resources/fix-session.cfg
[default]
ConnectionType=initiator
BeginString=FIX.4.4
SenderCompID=BANKOMS
HeartBtInt=30
StartTime=08:30:00
EndTime=18:30:00
# Sequence numbers and sent messages survive a restart.
FileStorePath=/var/lib/oms/fix-store
PersistMessages=Y
ResetOnLogon=N
ResetOnDisconnect=N
[session]
TargetCompID=EXCHANGE
SocketConnectHost=fix.exchange.example
SocketConnectPort=9876

oms/src/main/java/com/bank/oms/fix/ SequenceGuard.java SequenceGuard: beklenen numarayı işle, küçüğü atla, büyüğü görünce tekrar iste; PossDup işareti olmayan küçük numara ciddi bir hatadır.

oms/src/main/java/com/bank/oms/fix/SequenceGuard.java
package com.bank.oms.fix;
/** What a FIX engine does with each incoming MsgSeqNum (tag 34). Illustration only. */
public final class SequenceGuard {
public enum Action { PROCESS, SKIP_DUPLICATE, REQUEST_RESEND, DISCONNECT }
private long expected = 1;
public Action onMessage(long seqNum, boolean possDup) {
if (seqNum == expected) {
expected++;
return Action.PROCESS;
}
if (seqNum > expected) {
// Messages expected..seqNum-1 were lost: ask from `expected` onwards.
return Action.REQUEST_RESEND;
}
// Lower than expected: fine if it is a resend, fatal if not.
return possDup ? Action.SKIP_DUPLICATE : Action.DISCONNECT;
}
public long expected() {
return expected;
}
}

oms/src/main/java/com/bank/oms/fix/ FillHandler.java FillHandler: oturum katmanından geçen gerçekleşme yine de ExecID ile bir kez işlenir.

oms/src/main/java/com/bank/oms/fix/FillHandler.java
package com.bank.oms.fix;
import com.bank.oms.order.ExecutionReport;
import com.bank.oms.order.OrderBookkeeper;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public final class FillHandler {
private final OrderBookkeeper bookkeeper;
/** Survives restarts in production: back it with a table keyed on ExecID. */
private final Set<String> seenExecIds = ConcurrentHashMap.newKeySet();
public FillHandler(OrderBookkeeper bookkeeper) {
this.bookkeeper = bookkeeper;
}
public void onExecutionReport(ExecutionReport report) {
if (!seenExecIds.add(report.execId())) {
return; // same fill seen before, perhaps over a previous connection
}
bookkeeper.apply(report);
}
}

Kendini sına

Şimşek turu1/4

FIX oturumunda her mesajın bir sıra numarası vardır.

Soru 1/3İleri

PossDup işareti olmadan, beklenenden küçük numaralı bir mesaj geldi. FIX bunu nasıl görür?

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

Aklında kalacak üç şey

  1. 1 FIX oturumunda iki taraf da gönderdiği her mesajı numaralar. Beklenenden büyük bir numara, arada kaybolmuş mesajlar olduğunu söyler.
  2. 2 Boşluk görülünce eksik mesajlar ResendRequest ile tekrar istenir. Tekrar gelenler PossDup işaretiyle gelir ve bir kısmı zaten işlenmiş olabilir.
  3. 3 Yalnızca beklenen numarayı işlemek iki hatayı birden önler: kaybolanı fark etmemek ve aynı gerçekleşmeyi iki kez saymak.
Sonraki kapı Ekranda 100,10'dan 200 lot satış vardı. Alış emrin eşleşmedi; o satış saniyeler önce silinmişti. Defterin neden haberi yoktu? Piyasa Verisi — Ekranda Görünen Satış Neden Gerçekte Yoktu? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı

Bu dersin üstüne kurulanlar

Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.