📝

Draft article

This draft is visible to admins and superusers only. Sign in with an authorized account.

← Makalelere geri dön
July 24, 2026
5 dakikalık okuma

Dilimin içinde: zamanlayıcınız ile borsa arasındaki alt emir taktikleri

Dilimin içinde: zamanlayıcınız ile borsa arasındaki alt emir taktikleri
#execution
#child orders
#order tactics
#queue position
#maker-taker
#iceberg orders
#microstructure
#python

Bir Almgren-Chriss yörüngesi size bir sayı verir: önümüzdeki beş dakikada 4,2 BTC sat. Bir VWAP zamanlaması size farklı bir gerekçeyle aynı türden bir sayı verir. İkisi de bundan sonra ne olacağı hakkında hiçbir şey söylemez — bu 4,2 BTC'nin tek bir marketable emir olarak deftere mi çarpacağı, maker ücreti toplayarak touch'ta mı bekleyeceği, 0,3 BTC'lik bir görünür miktarın arkasına mı saklanacağı, yoksa kayan bir kotayı kovalarken on bir kez mi yeniden fiyatlanacağı. Bu ikinci karar katmanı taktik katmanıdır ve ücretlerin baskın olduğu kripto defterlerinde, üstündeki zamanlayıcı seçiminden dilim başına genellikle daha fazla PnL hareket ettirir. Zamanlayıcının aralık bütçeleri, TWAP ile iyi ayarlanmış bir Almgren-Chriss arasında, tüm ana emir boyunca birkaç baz puanlık etki farkı yaratır; yapabileceğiniz dilimlerde taker ücreti ödemek veya dikkatsiz yeniden fiyatlama yoluyla kuyruk pozisyonunu kanatmak ise saatte bu kadar maliyete mal olur. Bu yazı herkesin çalıştırdığı ama neredeyse kimsenin yazıya dökmediği katman hakkında: her alt emrin deftere nasıl dokunacağına karar veren durum makinesi.

İki katman, tek dar arayüz

Lehalle ve Laruelle'in Market Microstructure in Practice (2. baskı, 2018) eseri, her icra masasının vardığı ortak noktayı formalleştirir: miktarı zaman içinde tahsis eden bir stratejik katman (zamanlayıcı) ve her tahsisi canlı defter üzerinde işleyen bir taktik katman (mikro-trader). Bu ayrım estetik değildir — iki katman farklı saatlerde ve farklı verilerle yaşar. Zamanlayıcı dakikalar cinsinden düşünür, oynaklık ve hacim tahminlerini tüketir ve bir varyasyonel problemi çözer. Taktik katmanı milisaniyeden saniyeye cinsinden düşünür, L2 delta'larını ve kuyruk tahminlerini tüketir ve küçük durdurma problemlerinden oluşan bir dizi çözer.

İki katmanlı icra mimarisi: zamanlayıcı dilim bütçesi ve aciliyeti aşağı iletir, taktik katmanı doluşları ve shortfall'u yukarı döndürür

Aralarındaki arayüz dar olmalıdır. Aşağı yönde, kk dilimi için:

  • bütçe qkq_k — bu aralıkta icra edilecek miktar (Almgren-Chriss'in nkn_k'si veya VWAP'ın hacim eğrisi artışı);
  • pencere τk\tau_k — dilim uzunluğu;
  • aciliyet — Almgren-Chriss için doğal aday, risk iştahını, oynaklığı ve likiditeyi tek bir oranda sıkıştıran κ=λσ2/η\kappa = \sqrt{\lambda\sigma^2/\eta}'dır; bir VWAP zamanlayıcısı için bu genellikle bir bant mesafesidir ("hedef eğrinin %1,8 gerisindeyiz").

Yukarı yönde: zaman damgalı ve ücretli doluşlar, doldurulmamış kalan miktar ve aralık geliş orta fiyatına göre ölçülen dilim düzeyinde icra shortfall'u. Sonuncusu önemlidir: zamanlayıcının etki parametresi η\eta zaten qk/τkq_k/\tau_k oranında likidite talep etmenin ne kadara mal olması gerektiğini fiyatlamıştır. Taktik katmanının tüm iş tanımı tek cümledir: ana emrin varlığını sızdırmadan, η\eta'nın ima ettiği maliyetten daha iyi doluşlar gerçekleştirmek. Ölçtüğünüz dilim shortfall'u modelin maliyetini tutarlı biçimde geçiyorsa, kalibre edilmiş η\eta'nız düşebilir, zamanlayıcı hızlanır ve tüm sistem iyileşir. Dilim shortfall'unu zamanlama maliyetinden ayrı ölçemiyorsanız, iki katmanı da ayarlayamazsınız — elinizde bulanık tek bir sayı ve iki kadran vardır.

Kalan miktar politikası da sözleşmenin bir parçasıdır. Bir dilim doldurulmamış miktarla sona erdiğinde, taktik katmanı ya zorla tamamlar (kalanı cross eder — deadline aciliyeti altında varsayılan davranış) ya da kalan dilimler üzerinde yeniden amortize edilmek üzere zamanlayıcıya geri döndürür (düşük κ\kappa'lı bir zamanlamanın erken aşamalarında kabul edilebilir, ancak yeniden amortizasyonun sessizce devasa bir son dilime dönüştüğü deadline yakınında zehirleyicidir).

Eskalasyon merdiveni: önce pasif, deadline'a göre agresif

Bu alandaki en eski sonuç Harris'in (1998) "Optimal dynamic order submission strategies in some stylized trading problems" (Financial Markets, Institutions & Instruments 7(2)) makalesidir: bir deadline'a kadar işlemi tamamlaması gereken bir likidite trader'ı için optimal strateji dinamiktir — zaman ucuzken deftere limit emirlerle girin, deadline yaklaştıkça piyasaya doğru yeniden fiyatlayın ve sonunda cross edin. Her production taktik motoru bu şeklin bir türevidir: touch'ta post et, zamanla eskit, eskalasyon uygula, cross et. Modern ücret tarifelerinin ve kuyruk dinamiklerinin eklediği şey, her geçişin tam olarak ne zaman tetikleneceğinin aritmetiğidir.

Cross etmenin başabaş noktası

Bir alım için, mevcut orta fiyata göreli, birim başına işlem. Şimdi cross etmek yarım spread artı taker ücretine mal olur:

ctake=s2+ft.c_{\text{take}} = \frac{s}{2} + f_t.

τ\tau penceresinde bid'de post etmek pp olasılıkla dolar; bir doluş yarım spread'i kazandırır ve maker ücreti fmf_m'yi öder (rebate ise negatiftir). Doluş olmazsa, fiyat ortalama olarak δ(τ)=E[ters yo¨nlu¨ orta fiyat hareketidolus¸ yok]>0\delta(\tau) = E[\,\text{ters yönlü orta fiyat hareketi} \mid \text{doluş yok}\,] > 0 kadar aleyhinize hareket ettikten sonra pencere sonunda cross edersiniz — kesinlikle pozitiftir, çünkü doluş olmaması ile ters yönlü sürüklenme aynı olaydır: piyasa uzaklaştığında bid'iniz vurulmaz. Beklenen post etme maliyeti:

cpost=p(s2+fm)+(1p)(s2+ft+δ).c_{\text{post}} = p\left(-\frac{s}{2} + f_m\right) + (1-p)\left(\frac{s}{2} + f_t + \delta\right).

Post etmek, ancak ve ancak şu koşulda cross etmeyi geçer:

  p  >  p\*=δΠ+δ,Π=s+ftfm  \boxed{\; p \;>\; p^\* = \frac{\delta}{\Pi + \delta}, \qquad \Pi = s + f_t - f_m \;}

burada Π\Pi ödüldür — take etmek yerine make ederek elde ettiğiniz tam gidiş-dönüş: spread artı ücret farkı. Bu, icranın tüm maker-taker ekonomisini yöneten, tek bir dilime sıkıştırılmış aynı başabaş noktasıdır.

Sayılarla, BTCUSDT perp: orta fiyat 100.000 ,spreadbirtick, spread bir tick s = 0,10$,VIP0benzeriu¨cretlermaker2bps/taker5bps,yani, VIP0 benzeri ücretler maker 2 bps / taker 5 bps, yani f_m = 20$,, f_t = 50$BTCbas\cına.O¨du¨lBTC başına. Ödül\Pi = 0,10 + 50 - 20 = 30,10$ \approx 3bpsspreadinesasenhic\cbirkatkısıolmadıg˘ınadikkatedin;sıkıkriptomajo¨rlerindeo¨du¨ltamolaraku¨cretfarkıdır. bps — spread'in esasen hiçbir katkısı olmadığına dikkat edin; sıkı kripto majörlerinde ödül *tam olarak* ücret farkıdır. %3 günlük oynaklık alalım (\sigma_{\text{gün}} = 3.000$)ve) ve \delta(\tau) \approx 0,6,\sigma_{\text{gün}}\sqrt{\tau/86400}$ (0,6 katsayısı güvenmeniz değil kalibre etmeniz gereken bir adverse-selection kesintisidir):

  • τ=10\tau = 10 s: \delta \approx 19\$$, yani p^* = 19/49 \approx 0,39$. Yalnızca 10 saniye içinde en az %39 doluş bekliyorsanız post edin.
  • τ=60\tau = 60 s: \delta \approx 47\$$, yani p^* = 47/77 \approx 0,61$.
  • %2 ücret yerine 1 bp maker rebate ile (f_m = -10\$$): \Pi = 60,10$,ve10saniyelikes\cik, ve 10 saniyelik eşik p^* \approx 0,24$'e düşer.

Buradan iki yapısal gerçek çıkar. Birincisi, δ\delta τ\sqrt{\tau} gibi büyürken Π\Pi sabittir, dolayısıyla p\*(τ)1p^\*(\tau) \to 1: sabrın sert bir vade sonu vardır ve age-out zamanlayıcısı bir sezgisel değil, iki eğrinin kesişme noktasıdır — tahmin ettiğiniz p(τ)p(\tau) (önünüzdeki kuyruk boşaldıkça doyan, konkav) ile p\*(τ)p^\*(\tau) (yükselen). İkincisi, üzerinde işlem yaptığınız ücret kademesi merdiveni fiziksel olarak hareket ettirir. Taker ücretlerini kesen bir kademe yükseltmesi optimal taktiklerinizi daha agresif yapar — çoğu kişinin ancak bir VIP kademe değişikliğinden sonra doluş istatistikleri değiştiğinde keşfettiği bir bağlantı.

Cont ve Kukanov'un "Optimal order placement in limit order markets" (Quantitative Finance 17(1), 2017; arXiv 2012) makalesi bunu tek dönemde titiz hale getirir: piyasa ve limit emirler arasında bölünmüş (tek veya birden fazla venue üzerinde) SS birimin icrasının beklenen maliyetini, shortfall için bir ceza ile minimize edin. Tek-venue çözümü açıktır ve bir newsvendor yapısına sahiptir: optimal limit emir boyutu, kuyruk çıkışının dağılımı tarafından yönlendirilir — öndeki kuyruk beklenen çıkışa göre küçükken agresif boyutla post edin ve kuyruk riskini market emirleriyle karşılayın. Çok-venue uzantıları stokastik yaklaşımla çözülür ve her akıllı emir yönlendiricisinin pasif tahsis mantığının entelektüel özüdür. Bir taktik motoru için pratik okuma şudur: yukarıdaki başabaş noktasındaki pp sabit değildir — kuyruk pozisyonunun ve boşalma oranının bir fonksiyonudur, bu yüzden taktik katmanı kuyruk pozisyonu tahmincisini birinci sınıf bir girdi olarak tüketmelidir.

Dilim zaman çizelgesi: touch'ta pasif post'tan yeniden fiyatlamaya, deadline'da kalanı cross etmeye kadar eskalasyonu gösterir

Aciliyet parametresi bu merdivenin tamamını sıkıştırır. Zamanlayıcıdan gelen yüksek κ\kappa, karakteristik süre θ=1/κ\theta = 1/\kappa'nın kısa olduğu anlamına gelir: pencereler daralır, p\*p^\* yükselir ve motor doğrudan cross etmeye geçer — doğru bir şekilde, çünkü zamanlayıcı envanter riskinin ücret tasarrufuna baskın olduğunu zaten ilan etmiştir. Düşük κ\kappa pasif fazı uzatır. Taktik katmanı, aciliyeti kendi piyasa görüşünden asla yeniden türetmemelidir; bu zamanlayıcının işidir ve bunu tekrarlamak birbiriyle çelişen iki kontrolör yaratır.

Kuyruk pozisyonunuzu yakmadan yeniden fiyatlama

Bir kez post edildikten sonra, kota kayar. Onu saf biçimde kovalamak — iptal et, yeni touch'ta yeniden post et, tekrarla — taktik motorlarının, post etmeyi haklı çıkaran doluş olasılığını sessizce yok etmesinin yoludur. Kuyruk pozisyonu, ölçülebilir dolar değeri olan bir varlıktır (Moallemi ve Yuan, 2016, buna bir fiyat biçer: likit FIFO defterlerinde kuyruğun önündeki pozisyonlar spread'in anlamlı bir kesrine değerdedir) ve her yeniden fiyatlama kararı bir işlemdir: mevcut kuyruk pozisyonunuzu satın, farklı bir fiyat seviyesinin arkasında yenisini alın. Bu işlem, yalnızca yeni seviyenin değeri eskisinin değerini artı mesajlaşma maliyetlerini aştığında yapmaya değer. Bu da her venue'nün amend işleminin sıranızdaki yerinize gerçekte ne yaptığını bilmeyi gerektirir — ve cevap son derece heterojendir.

CME Globex en temiz semantiği belgeler: emir miktarını azaltmak zaman önceliğini korur; miktarı artırmak veya fiyatı değiştirmek sizi kuyruğun sonuna gönderir. Bu referans modeldir — miktar-azaltma bedavadır, geri kalan her şey yeniden kuyruğa girmedir.

Binance spot tarihsel olarak yalnızca POST /api/v3/order/cancelReplace sunuyordu — atomik görünen ama açıkça işlemsel olmayan bir iptal-artı-yeni işlemi. İki mod: STOP_ON_FAILURE (varsayılan — iptal başarısız olursa yeni emir açılmaz) ve ALLOW_FAILURE (iptal başarısız olsa bile yeni emri aç — merhaba, kazara çift pozisyon). İşlem kısmen başarılı olabilir, bu HTTP 409 ile sinyallenir, dolayısıyla OMS'iniz her iki bacağı da bağımsız olarak uzlaştırmalıdır; ve yeni emir her zaman taze bir kuyruk hayatına başlar. Sonra 2025'te Binance Order Amend Keep Priority'yi (PUT /api/v3/order/amend/keepPriority) yayına aldı: miktarı yerinde azalt, zaman önceliğini koru, doldurulmamış emir sayısı maliyeti sıfır. CME semantiği, on beş yıl sonra — ve yalnızca miktar-azaltma yarısı.

Binance USDT-M vadeli işlemleri, gerçek bir modify endpoint'ine sahiptir (PUT /fapi/v1/order), ama küçük yazıyı okuyun: yalnızca LIMIT emirler, hem price hem quantity gönderilmelidir ve "değiştirilen emirler eşleştirme kuyruğunda yeniden sıralanacaktır" — dokümantasyon, saf miktar azaltmaları için bile öncelik korunmasını vaat etmez. Her futures modify işlemini, size tek bir mesaj tasarrufu sağlayıp emir ID'sini koruyan bir kuyruk sıfırlaması olarak ele alın. Bilinmesi gereken keskin bir kenar: bir GTX (post-only) emrini cross edecek bir fiyata değiştirmek emri iptal ettirir, reddedip-korumak değil — bunu kontrol etmeyen bir peg implementasyonu zaman zaman kendini var olmaktan çıkaracak şekilde amend edecektir.

OKX, POST /api/v5/trade/amend-order'ı sunar (newPx, newSz, amend başarısız olursa otomatik iptal için cxlOnFail ile). Tek bir mesajdır, emir ID'sini korur ve asenkron olarak onaylanır — sCode = 0, "istek kabul edildi" anlamına gelir ve gerçek sonuç orders kanalında amendResult olarak gelir. Genel dokümantasyonun belirgin biçimde belirtmediği şey kuyruk-önceliği davranışıdır. Bu dokümantasyon boşluğunu iyimserlikle doldurmayın. Ölçün: sakin bir seviyede iki işaretleme emri post edin, birinin boyutunu aşağı doğru amend edin ve birkaç yüz denemede hangisinin önce dolduğunu izleyin. Bu veriye sahip olana kadar, muhafazakar varsayım — herhangi bir fiyat değişikliği her yerde sizi yeniden kuyruğa sokar, miktar-azaltma yalnızca açıkça belgelenen yerlerde önceliği korur — tek savunulabilir olanıdır.

Venue'lere karşı amend işlemleri matrisi: hangi işlemlerin kuyruk önceliğini koruduğunu, hangilerinin sıfırladığını gösterir

Politika sonuçları:

  1. Pegging değil, histerezis. Yalnızca touch, dinlenme fiyatınızdan bb tick'ten fazla kaydığında yeniden fiyatlayın. Bant içinde, kayma gürültüdür ve kuyruk pozisyonunuz bir tick'lik fiyat iyileşmesinden daha değerlidir. Makul bir başlangıç bandı, kısa vadeli oynaklıkla ölçeklenen 1-3 tick'tir; doğru bant, marjinal yeniden fiyatlamayı EV-nötr yapar: VyeniVmevcut=cmsgV_{\text{yeni}} - V_{\text{mevcut}} = c_{\text{msg}}, burada VV Moallemi-Yuan tarzı kuyruk değeri ve cmsgc_{\text{msg}} oran-limiti gölge fiyatınızdır. Amend/cancel-replace işlemleri her iki Binance venue'sünde emir-oranı bütçesi tüketir; her tick'i pegleyen bir taktik motoru sisteminizin geri kalanını mesaj kapasitesinden yoksun bırakır.
  2. Aşağı amend edin, aşağı cancel-repost asla. Zamanlayıcı bir dilim bütçesini uçuş sırasında kestiğinde (hacmin kuruduğunu gören bir POV zamanlayıcısı, kısmi doluşlardan sonra yeniden çözülen bir Almgren-Chriss), önceliği koruyan yolu, mevcut olduğu yerde kullanın. Bu, tüm katmandaki tek bedava öğle yemeğidir.
  3. Yeniden fiyatlamada asimetrik aciliyet. Piyasaya doğru yeniden fiyatlamak (kovalamak) kuyruğunuzu daha kötü bir fiyatta sıfırlar — bu yalnızca eskalasyon mantığından, kendi zamanlayıcısında tetiklenmelidir. Uzağa yeniden fiyatlamak (piyasa size geldi) bir hediyedir; onu yalnızca pasif bant üzerinden alın, çünkü mevcut seviyeniz zaten dolmak üzeredir.

Iceberg'ler, görünür boyut ve niyetinizi neyin sızdırdığı

Görünür boyut üçüncü karardır ve bu bedava bir gizlilik düğmesi değil, gerçek anlamda iki taraflı bir işlemdir. Ampirik kayıt:

  • Frey ve Sandås ("The Impact of Iceberg Orders in Limit Order Books", 2009 çalışma makalesi; Quarterly Journal of Finance, 2017), Xetra verisi üzerinde: iceberg emirleri gönderilen hacmin %9,3'ünü ve icra edilen hacmin %15,9'unu taşıdı, sıradan limit emirlerin 12-20 katı büyüklükte çalıştı ve — asıl nokta — diğer katılımcılar bir iceberg'i tespit ettiğinde, eşleşen market emirleriyle yanıt veriyorlar. Gizli boyut, bir kez çıkarsandığında, akış çekiyor: gizli likidite arayışı iki yönde de çalışıyor.
  • Bessembinder, Panayides ve Venkataraman ("Hidden liquidity: an analysis of order exposure strategies in electronic stock markets", JFE 94(3), 2009), örnek hacminin %44'ünün gizli emirler olduğu Euronext Paris üzerinde: gizlemek icra shortfall'unu düşürür ama aynı zamanda tam icra olasılığını da düşürür ve tamamlanma süresini uzatır. Açığa çıkarma doluş satın alır ve bunun bedelini etkiyle öder; opsiyon tam olarak teorinin öngördüğü gibi kullanılır — agresif emirler karşı tarafları çekmek için açığa çıkar, sabırlı boyut ise gizlenir.
  • Esser ve Mönch ("The navigation of an iceberg", Finance Research Letters 4(2), 2007) tepe boyutunu bir optimizasyon olarak ele alır: daha büyük görünür boyut daha hızlı doldurur, daha küçük görünür boyut daha az sızdırır ve optimum içseldir.

Önce mekanikler, çünkü optimizasyonu bağlarlar: yerel iceberg'leri destekleyen hemen her venue'de (Binance spot icebergQty üzerinden, OKX iceberg algo emirleri üzerinden), görünür tepenin her yeniden doluşu o fiyatta kuyruğun sonuna girer. Bir iceberg bu nedenle "gizli boyutlu tek bir emir" değildir — otomatik olarak tetiklenen, her biri tam kuyruk-beklemesini ödeyen küçük emirlerin bir dizisidir. Yukarıdaki ücret başabaş noktasında bu önemlidir: tepe başına etkin pp, orijinal pozisyonunuzunki değil, kuyruğun-sonu doluş olasılığıdır. Derin kuyruklar küçük tepeleri iki kez cezalandırır — daha yavaş doluşlar ve daha fazla yeniden doluşun getirdiği adverse selection.

Sonra sinyalleme problemi. Frey ve Sandås'ın kendi tespit yöntemi uyarıcı bir hikayedir: sıklıkçı dedektörleri en yaygın iki implementasyon tembelliği kalıbını hedefler — sabit tepe boyutu ve icra eden işlemle aynı zaman damgasına sahip yeniden doluşlar. O dedektörü çalıştıran herhangi bir katılımcı (ve kripto venue'lerinde bunu yapan çok kişi var — borsanın kendi eşleştirme meta verisi, konumlandırılmış akış için bunu daha da kolaylaştırıyor) gizli boyutunuzu birkaç yeniden doluşta yeniden inşa eder. Sızıntı vektörleri, sahada ne sıklıkta gördüğüme göre sıralanmış:

  1. Sabit veya yuvarlak görünür boyutlar (her seferinde 0,5 BTC).
  2. Tam-tepe icrasından sonra anlık, deterministik yeniden doluş — aynı-zaman-damgası imzası.
  3. Deterministik eskalasyon zamanlayıcıları: her dilimde tam olarak 30. saniyede cross etmek ve tape bir metronom gösteriyor.
  4. Sabit yeniden fiyatlama gecikmesi ve bant — amend kadansınız, emir boyutlarınız kadar tanımlayıcı bir parmak izidir, ki bu dijital parmak izleri ve trader tanımlama konusunun içeriğidir.

Tespit edilmenin maliyeti varsayımsal değildir. Van Kervel ve Menkveld ("High-frequency trading around large institutional orders", Journal of Finance 74(3), 2019) HFT'lerin başlangıçta kurumsal meta-emirlere karşı eğildiğini gösterir — pasif taktiklerinizin tükettiği likiditeyi sağlarlar — sonra emrin kalıcılığı bilgi ortaya çıkardığında emirle birlikte işlem yapmaya döner, kalanı back-run ederek ana emrin maliyetini önemli ölçüde artırır. Kurumları buna yanıt olarak spekülatif kârı tespit riskine karşı tartılar. Taktik katmanınız tam olarak bu ödünleşimin uygulandığı yerdir: görünür boyutu rastgeleleştirin (oynaklıkla ölçeklenen bir taban değerin %30-70'i arasında uniform dağılım işe yarar), her zamanlayıcıyı ±%20-30 titretin, ara sıra bir yeniden doluşun beklemesine izin verin ve iki alt emrin bir boyutu, zamanlayıcı fazını ve gecikme profilini asla paylaşmasına izin vermeyin. Bunların hiçbiri ölçülebilir doluş kalitesine mal olmaz; hepsi akışınıza dedektör oturtmaya çalışan herkes için gürültü tabanını yükseltir.

Minimal bir taktik motoru

Yukarıdaki tüm katman, dilim başına küçük bir durum makinesine sıkışır: IDLE → POSTED → (yeniden fiyatlama döngüsü) → CROSSING → DONE, girişte başabaş kapısı, post edilirken bir histerezis bandı ve deadline eskalasyonu ile. Aşağıdaki sürüm bilinçli olarak minimaldir — venue adaptörü yok, iceberg yönetimi yok — ama olay güdümlü ve yan etkisizdir, dolayısıyla doğrudan doluş-simülasyon merdiveninin 4. basamağındaki kuyruk-farkında simülatöre girer: simülatör on_tick/on_fill'i çağırır ve eylemleri şu şekilde yorumlar: post → GTX/post-only, cross → IOC, cancel_replace/amend_down → yukarıdaki matristeki venue'nün semantiği.

import math
from dataclasses import dataclass
from enum import Enum, auto

class State(Enum):
    IDLE = auto(); POSTED = auto(); CROSSING = auto(); DONE = auto()

@dataclass
class Fees:
    maker: float          # $ per unit; negative = rebate
    taker: float          # $ per unit

@dataclass
class Cfg:
    tick: float
    sigma_1s: float       # $ per sqrt(second), from your live vol estimator
    adverse_frac: float = 0.6   # E[adverse move | no fill] ~ 0.6 * sigma; calibrate
    reprice_band: float = 2.0   # ticks of touch drift tolerated before repricing
    escalate_frac: float = 0.7  # cross the remainder at this fraction of the window

class SliceTactic:
    """One instance per scheduler slice. Drive it from a fill simulator or OMS."""

    def __init__(self, side: str, qty: float, window: float, fees: Fees, cfg: Cfg):
        self.side, self.qty, self.window = side, qty, window
        self.fees, self.cfg = fees, cfg
        self.filled, self.state, self.px, self.t0 = 0.0, State.IDLE, None, None

    def p_star(self, spread: float, tau: float) -> float:
        """Break-even fill probability for posting over a window tau."""
        delta = self.cfg.adverse_frac * self.cfg.sigma_1s * math.sqrt(tau)
        prize = spread + self.fees.taker - self.fees.maker
        return delta / (prize + delta)

    def p_fill(self, queue_ahead: float, drain: float, tau: float) -> float:
        """Crude queue-drain estimate; swap in your calibrated fill model."""
        if drain <= 0: return 0.0
        return min(1.0, drain * tau / max(queue_ahead + self.qty, 1e-9))

    def on_tick(self, t, bid, ask, queue_ahead, drain):
        if self.state == State.DONE: return []
        if self.t0 is None: self.t0 = t
        left = self.qty - self.filled
        elapsed, remain = t - self.t0, self.window - (t - self.t0)
        touch = bid if self.side == "buy" else ask

        if elapsed >= self.cfg.escalate_frac * self.window and left > 0:
            self.state = State.CROSSING          # deadline: pay up, finish
            return [("cross", left)]

        if self.state == State.IDLE:
            if self.p_fill(queue_ahead, drain, remain) >= self.p_star(ask - bid, remain):
                self.state, self.px = State.POSTED, touch
                return [("post", touch, left)]    # GTX / post-only
            self.state = State.CROSSING           # posting is -EV here
            return [("cross", left)]

        if self.state == State.POSTED:
            if abs(touch - self.px) / self.cfg.tick > self.cfg.reprice_band:
                self.px = touch                   # hysteresis breached:
                return [("cancel_replace", touch)]  # accept the queue reset
        return []

    def on_fill(self, t, fill_qty):
        self.filled += fill_qty
        if self.filled >= self.qty - 1e-9:
            self.state = State.DONE
            return [("slice_done", self.filled)]
        return []

    def on_budget_cut(self, new_qty):
        """Scheduler revised the slice down: amend-down keeps queue priority
        where documented (CME, Binance spot amend/keepPriority)."""
        self.qty = new_qty
        left = new_qty - self.filled
        return [("amend_down", left)] if left > 0 else [("cancel",)]

Üç dürüst uyarı. Buradaki p_fill, bir yer tutucu orandır — production'da, doluş-simülasyon yazısındaki gruplandırılmış, canlı kalibre edilmiş model olmalıdır, çünkü tüm post/cross kapısı yalnızca bu tahmin kadar iyidir. adverse_frac, yazının en zor niceliğini gizler (δ\delta rejime bağımlıdır ve tam olarak post etmenin en cazip olduğu anda sıçrar); bunu kendi doluşsuz sonuçlarınızdan, oynaklık rejimine göre gruplandırarak tahmin edin. Ve yukarıdaki motor, koşulsuz olarak cancel-replace üzerinden yeniden fiyatlar — venue-farkında bir sürüm, miktar-azaltma değişikliklerini önceliği koruyan yola yönlendirmeli ve her eylemi bir mesaj bütçesine karşı ücretlendirmelidir.

Herhangi bir parametreye inanmadan önce onu bir replay tape'e karşı simülatör içinde çalıştırın. Önemli olan deney şudur: zamanlayıcıyı sabitleyin, escalate_frac ve reprice_band'i tarayın ve dilim shortfall'unu η\eta'nın ima ettiği model maliyetine karşı çizin. Yüzeyde bir plato vardır — neredeyse optimal parametrelerin geniş bantları — ve iki uçurum: çok geç eskalasyon (momentuma cross eden doldurulmamış kalanlar) ve çok istekli yeniden fiyatlama (tüm kuyruk değerinin yakılması). Uçurumlarınızın nerede olduğunu, production sizin için bulmadan önce bilmek istersiniz.

Çıkarılacak dersler

  1. İki katman, tek sözleşme. Zamanlayıcı ne kadar ve ne zamana kadar olduğuna karar verir; taktik nasıl olduğuna karar verir. Arayüz, aşağıda bütçe, pencere, aciliyettir; yukarıda doluşlar ve aralık geliş değerine göre dilim shortfall'udur. Shortfall'u bir katmana atfedemiyorsanız, ikisini de ayarlayamazsınız.
  2. Post/cross kapısı aritmetiktir, sezgi değil. Π=s+ftfm\Pi = s + f_t - f_m olmak üzere p>δ/(Π+δ)p > \delta/(\Pi + \delta) ise post edin. Sıkı kripto defterlerinde ödül ücret farkıdır, dolayısıyla ücret kademeniz taktiklerinizi belirler — her yeniden kademelendirmeden sonra merdiveni yeniden ayarlayın.
  3. Age-out zamanlayıcıları, iki eğrinin kesişim noktasıdır — doyan doluş olasılığına karşı τ\sqrt{\tau} ile büyüyen adverse selection — folklor sabitleri değil.
  4. Kuyruk pozisyonu bir varlıktır; harcamadan önce her venue'nün amend semantiğini bilin. CME: miktar-azaltma önceliği korur. Binance spot: cancelReplace her zaman yeniden kuyruğa sokar, 2025'in amend-keepPriority'si miktar kesintileri için bunu korur. Binance futures: her modify yeniden kuyruğa sokar. OKX: belgelenmemiş — ölçün ve bu arada en kötüsünü varsayın.
  5. Iceberg'ler kuyruk-sonu emirlerin bir dizisidir ve tembel olanları okunabilirdir. Sabit tepeler ve aynı-zaman-damgalı yeniden doluşlar, yayınlanmış bir tespit imzasıdır; boyutları ve zamanlayıcıları rastgeleleştirin veya back-run edilmeyi kabul edin.
  6. Durum makinesini önce doluş simülatörünüze taşıyın. Taktik katmanı, backtest ile production'ın en sert şekilde ayrıştığı yerdir — bu da tam olarak neden sonradan eklenmesi gereken değil, simülatörün içinde olması gereken şey olduğunun nedenidir.

Faydalı bağlantılar

  1. Harris, L. — Optimal Dynamic Order Submission Strategies in Some Stylized Trading Problems, Financial Markets, Institutions & Instruments 7(2), 1-76 (1998)
  2. Cont, R., Kukanov, A. — Optimal Order Placement in Limit Order Markets, Quantitative Finance 17(1), 21-39 (2017)
  3. Frey, S., Sandås, P. — The Impact of Iceberg Orders in Limit Order Books (2009)
  4. Bessembinder, H., Panayides, M., Venkataraman, K. — Hidden Liquidity: An Analysis of Order Exposure Strategies in Electronic Stock Markets, Journal of Financial Economics 94(3), 361-383 (2009)
  5. van Kervel, V., Menkveld, A. — High-Frequency Trading around Large Institutional Orders, Journal of Finance 74(3), 1091-1137 (2019)
  6. Moallemi, C., Yuan, K. — A Model for Queue Position Valuation in a Limit Order Book (2016)
  7. Lehalle, C.-A. — Market Microstructure Knowledge Needed for Controlling an Intra-Day Trading Process (2011)
  8. Binance Spot API — Order Amend Keep Priority
  9. Binance Spot API — Trading endpoints (cancelReplace semantics)
  10. Binance USDT-M Futures API — Modify Order
  11. OKX API v5 — Amend order
  12. CME Group — Order Functionalities (modification and time priority)

Alıntı

@article{soloviov2026childordertactics,
  author = {Soloviov, Eugen},
  title = {Inside the slice: child-order tactics between your scheduler and the exchange},
  year = {2026},
  url = {https://marketmaker.cc/blog/child-order-execution-tactics},
  description = {The tactics layer between execution schedulers and the exchange: passive-then-aggressive escalation with maker-taker break-even math, amend vs cancel-replace queue semantics across venues, iceberg anti-signaling, and a per-slice Python state machine for fill simulators.}
}
Sorumluluk Reddi: Bu makalede sağlanan bilgiler yalnızca eğitim ve bilgilendirme amaçlıdır ve finansal, yatırım veya ticaret tavsiyesi niteliği taşımaz. Kripto para ticareti önemli bir kayıp riski içerir.

Yazarlar

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Piyasanın Önünde Olun

Özel yapay zeka ticaret içgörüleri, piyasa analizi ve platform güncellemeleri için bültenimize abone olun.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.