İçeriğe geç

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

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

Önce şunu oku: Emir Defteri — 900 Lotluk Alış Neden Ekrandaki Fiyattan Pahalıya Geldi?

30 saniyede özet

Bir emir borsada birçok hâlden geçer: kabul, kısmi gerçekleşme, tam gerçekleşme ya da iptal. İptal bir istektir, sonuç değildir; yolda bir gerçekleşmeyle kesişebilir. Emrin hâlini OMS'in tahmini değil, borsanın mesajları belirler.

Akşam yemek siparişi verdin, sonra vazgeçip lokantayı aradın. Telefonu açan “bakalım” dedi. O sırada kapı çaldı: kurye yemeğinle kapıdaydı.

  1. Bayt: 1.000 lotluk alış emrinin 300 lotu doldu. Fiyat kaçtı, kalanını iptal ediyorum!

  2. Sen: İptal gönderildi, ekranda Canceled. Pozisyon: 300 lot.

  3. Bayt: Gün sonu raporu 1.000 lot diyor! 700 lot nereden çıktı?

  4. Bayt: İptal gönderdik diye emri kapattık. Borsanın ne dediğini hiç dinlemedik.

Emir bir yolculuktur

Emirleri borsaya gönderen ve takip eden sisteme OMSOrder Management System: emirleri oluşturan, borsaya gönderen ve her emrin hâlini borsadan gelen raporlarla takip eden sistem.Sözlükte gör → denir. Gönderilen emir önce kabul bekler, sonra kabul edilir; ardından parça parça dolar ya da iptal edilir.

Her adımda borsa bir gerçekleşme raporuBorsanın bir emir için gönderdiği mesaj: kabul, kısmi ya da tam gerçekleşme, iptal, red. FIX'te ExecutionReport adını taşır.Sözlükte gör → gönderir: kabul edildi, 300 lot doldu, iptal edildi. OMS emrin hâlini bu raporlarla değiştirir.

Kafam karıştı, daha basit anlat

Emir hâlden hâle geçer: kabul, kısmi dolum, tam dolum ya da iptal. Her geçişi borsanın raporu getirir.

Hızlı kontrolBaşlangıç

OMS ne yapar?

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

Emrin hâlini (kabul, kısmi dolum, iptal) ne değiştirir?

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

İptal bir istektir

Emrin 300 lotu doldu. Sen iptal gönderdin; iptal yoldayken borsa kalan 700 lotu doldurdu. Borsa iptal isteğine ne cevap verir? Cevabı göster

İptali reddeder: çok geç. Emirde iptal edilecek kalan miktar yok; hepsi dolmuştur. Emir Filled olarak kapanır.

İptal bir istektir; cevabı bekle.
Adım adım oku
  1. Yemek siparişi verdin.
  2. Vazgeçtin, iptal için aradın.
  3. Kurye kapıda: çok geç.
  4. İptal bir istektir; cevabı bekle.

Bu yüzden iptal gönderilen emir iptal olmaz; iptal bekler hâline geçer. Borsa iki cevaptan birini verir: iptal edildi ya da bir iptal reddiBorsanın iptal isteğine verdiği olumsuz cevap. Çoğu zaman emir zaten dolmuştur: iptal için çok geç.Sözlükte gör →.

İptal beklerken gelen gerçekleşme gerçektir. Onu işlemeyen OMS, borsada var olan pozisyonu göremez.

Kafam karıştı, daha basit anlat

İptal gönderince emri kapatma. Borsanın cevabını bekle, bu arada gelen gerçekleşmeleri işle.

Hızlı kontrolOrta

OMS bir emre iptal gönderdi. Emrin hâli şimdi ne olmalı?

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

İptal yoldayken borsa emrin kalanını doldurdu. Borsa iptal isteğine ne der?

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

Gerçek borsadadır

OMS’in tuttuğu hâl, borsada olanın bir kopyasıdır. Kopya, yalnızca borsadan gelen mesajlarla güncellenirse doğru kalır.

Kendi isteğine göre hâl değiştiren OMS tahmin yürütür. Tahmin yolda kesişen bir mesajla bozulduğunda fark pozisyonda, yani parada ortaya çıkar.

Kafam karıştı, daha basit anlat

OMS borsanın kopyasıdır. Kopyayı yalnızca borsanın mesajları değiştirir.

Hızlı kontrolOrta

OMS kendi gönderdiği isteğe göre hâl değiştirirse ne olur?

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

Kendin gör

İptal isteği ile gerçekleşme yolda kesişiyor

Tohum 975986

OMS ne düşünüyor

PendingNew

gerçekleşen: 0/1000 lot

Borsa ne biliyor

PendingNew

gerçekleşen: 0/1000 lot

· mesaj 0/6

Hız
Adım 0

Şu an ne oldu?

OMS: PendingNew · borsa: PendingNew

Mesajlar yolda; iki taraf aynı şeyi mi düşünüyor?

Görevler0/3

  • OMS emri iptal sansın, borsa tamamen doldursunaçık

    İpucu

    İptal geç kalsın; OMS gönderince iptal saysın.

  • Geç kalan iptalde iki taraf aynı sonuca varsınaçık

    İpucu

    Borsanın cevabını bekle.

  • İptal zamanında gelsin, 300 lot pozisyonda kalsınaçık

    İpucu

    Zamanlamayı değiştir.

Olay günlüğü (0)

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

  1. Varsayılanla oynat. OMS iptali gönderince emri kapattı ve yolda kesişen 700 lotu yok saydı. Borsa 1.000 lot diyor, OMS 300.
  2. OMS’i “borsanın cevabını bekle” yap. İptal reddedildi, emir iki tarafta da Filled.
  3. Zamanlamayı “iptal zamanında” yap. İptal kalan kısmı kapattı; 300 lot pozisyonda kaldı.
Hızlı kontrolOrta

Simülatörde "gönderince iptal say" seçiliyken OMS neden 300 lot gösterdi?

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

Tuzaklar

Aynı raporu iki kez işlemek. Bağlantı koptuktan sonra borsa eski raporları yeniden gönderebilir. Her gerçekleşmenin bir kimliği vardır; aynı kimliği ikinci kez işleme.

Geri giden hâl. Filled olmuş bir emir, geç gelen eski bir rapor yüzünden PartiallyFilled’a dönmemeli. Hâl geçişlerini bir tabloyla sınırla.

Değiştirme de bir istektir. Fiyat ya da miktar değiştirme isteği de iptal gibi yolda kesişebilir ve reddedilebilir. Aynı kural geçerli: cevabı bekle.

Kafam karıştı, daha basit anlat

Her gerçekleşmeyi kimliğiyle bir kez işle. Hâli geri götürme. Değiştirme isteğinin de cevabını bekle.

Hızlı kontrolOrta

Bağlantı koptu ve borsa eski gerçekleşme raporlarını yeniden gönderdi. OMS ne yapmalı?

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

Aşağıda bir OMS’in emir sınıfı var: hâli yalnızca borsa raporları değiştirir, iptal yalnızca bir bekleme hâlidir.

Derinleş · OMS: emrin hâlini borsa raporları değiştirir 3 dosya · ~91 satır · ilk okumada atlayabilirsin
Proje dosyaları

oms/src/main/java/com/bank/oms/order/ OrderStatus.java OrderStatus: FIX'teki OrdStatus değerlerine benzer hâller; hangi hâlden hangisine geçilebileceği burada.

oms/src/main/java/com/bank/oms/order/OrderStatus.java
package com.bank.oms.order;
import java.util.EnumSet;
import java.util.Set;
public enum OrderStatus {
PENDING_NEW, NEW, PARTIALLY_FILLED, PENDING_CANCEL, FILLED, CANCELED, REJECTED;
public boolean isTerminal() {
return this == FILLED || this == CANCELED || this == REJECTED;
}
/** States a report may move this one to. A terminal state never moves again. */
public Set<OrderStatus> next() {
return switch (this) {
case PENDING_NEW -> EnumSet.of(NEW, REJECTED);
case NEW, PARTIALLY_FILLED -> EnumSet.of(PARTIALLY_FILLED, FILLED, PENDING_CANCEL, CANCELED);
case PENDING_CANCEL -> EnumSet.of(PENDING_CANCEL, PARTIALLY_FILLED, FILLED, CANCELED);
case FILLED, CANCELED, REJECTED -> EnumSet.noneOf(OrderStatus.class);
};
}
}

oms/src/main/java/com/bank/oms/order/ ExecutionReport.java ExecutionReport: borsadan gelen rapor; her gerçekleşmenin kendi kimliği var.

oms/src/main/java/com/bank/oms/order/ExecutionReport.java
package com.bank.oms.order;
public record ExecutionReport(String execId, String orderId, Type type, long lastQty, long lastPriceKurus) {
public enum Type { ACK, FILL, CANCELED, CANCEL_REJECT, REJECTED }
}

oms/src/main/java/com/bank/oms/order/ Order.java Order: iptal isteği emri PENDING_CANCEL yapar; gerçekleşmeler her hâlde işlenir, aynı kimlik ikinci kez sayılmaz.

oms/src/main/java/com/bank/oms/order/Order.java
package com.bank.oms.order;
import java.util.HashSet;
import java.util.Set;
public final class Order {
private final String id;
private final long quantity;
private long filled;
private OrderStatus status = OrderStatus.PENDING_NEW;
private final Set<String> seenExecIds = new HashSet<>();
public Order(String id, long quantity) {
this.id = id;
this.quantity = quantity;
}
/** Sending a cancel only asks. The exchange decides. */
public void cancelRequested() {
moveTo(OrderStatus.PENDING_CANCEL);
}
public void on(ExecutionReport report) {
if (!seenExecIds.add(report.execId())) {
return; // a resent report: already counted
}
switch (report.type()) {
case ACK -> moveTo(OrderStatus.NEW);
case FILL -> {
filled += report.lastQty();
if (filled == quantity) {
moveTo(OrderStatus.FILLED);
} else if (status != OrderStatus.PENDING_CANCEL) {
moveTo(OrderStatus.PARTIALLY_FILLED);
}
}
case CANCELED -> moveTo(OrderStatus.CANCELED);
case CANCEL_REJECT -> {
// Too late: the fills decide what the order is now.
if (status == OrderStatus.PENDING_CANCEL) {
status = filled == 0 ? OrderStatus.NEW : OrderStatus.PARTIALLY_FILLED;
}
}
case REJECTED -> moveTo(OrderStatus.REJECTED);
}
}
private void moveTo(OrderStatus target) {
if (!status.next().contains(target)) {
throw new IllegalStateException(id + ": " + status + " cannot become " + target);
}
status = target;
}
public OrderStatus status() {
return status;
}
public long filled() {
return filled;
}
}

Kendini sına

Şimşek turu1/4

İptal isteği gönderildiği anda emir iptal olmuş sayılır.

Soru 1/3İleri

Filled olmuş bir emre geç gelen eski bir "300 lot doldu" raporu geldi. Doğru davranış?

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

Aklında kalacak üç şey

  1. 1 Emrin hâlini borsanın mesajları değiştirir. OMS bir iptal gönderdiğinde emir iptal olmaz, iptal bekler hâline geçer.
  2. 2 İptal isteği yoldayken borsa emri doldurabilir. Bu yüzden iptal bekleyen bir emre gelen gerçekleşme her zaman işlenir.
  3. 3 Aynı gerçekleşme mesajı iki kez gelebilir. Her gerçekleşme kendi kimliğiyle bir kez işlenir; yoksa pozisyon iki kez sayılır.
Sonraki kapı Ağ bir saniye gidip geldi. Borsa 600 lot doldurdu diyor, OMS 400 lot biliyor. Aradaki 200 lot nerede? FIX Oturumu ve Sıra Numarası — İki Gerçekleşme Nereye Kayboldu? · 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.