📝

Draft article

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

← Kembali ke artikel
July 24, 2026
5 menit baca

Di dalam slice: taktik child order antara scheduler dan exchange

Di dalam slice: taktik child order antara scheduler dan exchange
#eksekusi
#child order
#taktik order
#posisi antrean
#maker-taker
#iceberg order
#mikrostruktur
#python

Sebuah trajektori Almgren-Chriss memberi Anda sebuah angka: jual 4.2 BTC dalam lima menit ke depan. Sebuah jadwal VWAP memberi angka serupa dengan justifikasi berbeda. Keduanya tidak mengatakan apa pun tentang apa yang terjadi selanjutnya — apakah 4.2 BTC itu masuk ke book sebagai satu order marketable, duduk di touch mengumpulkan fee maker, bersembunyi di balik display 0.3 BTC, atau di-reprice sebelas kali mengejar quote yang bergerak. Lapisan keputusan kedua itulah lapisan taktik, dan pada book kripto yang didominasi fee, lapisan ini secara rutin menggerakkan lebih banyak PnL per slice dibanding pilihan scheduler di atasnya. Budget interval scheduler berbeda antara TWAP dan Almgren-Chriss yang di-tuning dengan baik hanya beberapa bps impact selama seluruh parent order; membayar fee taker pada slice yang sebenarnya bisa Anda buat sebagai maker, atau kehilangan posisi antrean karena repricing yang ceroboh, menelan biaya sebesar itu per jam. Artikel ini membahas lapisan yang dijalankan semua orang dan hampir tidak pernah ditulis siapa pun: state machine yang menentukan bagaimana setiap child order menyentuh book.

Dua lapisan, satu antarmuka sempit

Lehalle dan Laruelle dalam Market Microstructure in Practice (edisi ke-2, 2018) memformalkan apa yang disepakati setiap execution desk: sebuah lapisan strategis (scheduler) yang mengalokasikan kuantitas sepanjang waktu, dan sebuah lapisan taktis (microtrader) yang mengeksekusi setiap alokasi terhadap book yang live. Pemisahan ini bukan sekadar estetika — kedua lapisan hidup pada jam dan data yang berbeda. Scheduler berpikir dalam hitungan menit, mengonsumsi perkiraan volatilitas dan volume, dan menyelesaikan masalah variasional. Lapisan taktik berpikir dalam hitungan milidetik hingga detik, mengonsumsi delta L2 dan estimasi antrean, dan menyelesaikan serangkaian masalah stopping kecil.

Arsitektur eksekusi dua lapisan: scheduler menurunkan budget slice dan urgensi, lapisan taktik mengembalikan fill dan shortfall ke atas

Antarmuka di antara keduanya harus sempit. Ke bawah, per slice kk:

  • budget qkq_k — kuantitas yang dieksekusi pada interval ini (nilai nkn_k dari Almgren-Chriss, atau increment volume-curve dari VWAP);
  • window τk\tau_k — panjang slice;
  • urgensi — untuk Almgren-Chriss, kandidat alaminya adalah κ=λσ2/η\kappa = \sqrt{\lambda\sigma^2/\eta}, yang sudah memadatkan risk aversion, volatilitas, dan likuiditas menjadi satu laju; untuk scheduler VWAP biasanya berupa jarak-band ("kita 1.8% di belakang kurva target").

Ke atas: fill dengan timestamp dan fee, sisa yang belum terisi, dan implementation shortfall level-slice yang diukur terhadap mid kedatangan interval. Yang terakhir ini penting: parameter impact η\eta milik scheduler sudah memberi harga berapa seharusnya biaya menuntut likuiditas pada laju qk/τkq_k/\tau_k. Deskripsi pekerjaan lapisan taktik seluruhnya adalah satu baris: merealisasikan fill dengan biaya lebih baik daripada yang diimplikasikan η\eta, tanpa membocorkan keberadaan parent order. Jika shortfall slice terukur Anda konsisten mengalahkan biaya model, η\eta terkalibrasi Anda bisa diturunkan, scheduler mempercepat, dan seluruh stack membaik. Jika Anda tidak bisa mengukur shortfall slice secara terpisah dari biaya jadwal, Anda tidak bisa men-tuning kedua lapisan — Anda hanya punya satu angka kabur dan dua tombol.

Kebijakan sisa juga bagian dari kontrak ini. Ketika sebuah slice berakhir dengan kuantitas belum terisi, entah lapisan taktik memaksa penyelesaian (cross sisanya — default di bawah urgensi deadline) atau mengembalikannya ke scheduler untuk diamortisasi ulang pada slice yang tersisa (dapat diterima di awal jadwal κ\kappa-rendah, beracun mendekati deadline di mana amortisasi ulang secara diam-diam menumpuk menjadi slice akhir yang masif).

Tangga eskalasi: pasif dahulu, agresif menjelang deadline

Hasil tertua dalam ranah ini adalah Harris (1998), "Optimal dynamic order submission strategies in some stylized trading problems" (Financial Markets, Institutions & Instruments 7(2)): bagi trader likuiditas yang harus menyelesaikan trade sebelum deadline, strategi optimal bersifat dinamis — berdiri di book dengan limit order selagi waktu masih murah, reprice mendekati market saat deadline mendekat, dan cross di akhir. Setiap mesin taktik produksi adalah keturunan dari bentuk ini: post di touch, age out, eskalasi, cross. Yang ditambahkan oleh jadwal fee modern dan dinamika antrean adalah aritmetika persis kapan setiap transisi terpicu.

Break-even untuk crossing

Kerjakan per unit, harga relatif terhadap mid saat ini, untuk pembelian (buy). Crossing sekarang berbiaya setengah spread ditambah fee taker:

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

Posting di bid selama window τ\tau terisi dengan probabilitas pp; sebuah fill memperoleh setengah-spread dan membayar fee maker fmf_m (negatif jika berupa rebate). Tidak terisi berarti crossing di akhir window setelah harga, rata-rata, bergerak melawan Anda sebesar δ(τ)=E[pergerakan mid merugikantidak terisi]>0\delta(\tau) = E[\,\text{pergerakan mid merugikan} \mid \text{tidak terisi}\,] > 0 — secara ketat positif, karena non-fill dan drift merugikan adalah peristiwa yang sama: bid Anda tidak ter-hit ketika market menjauh darinya. Biaya posting yang diharapkan:

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).

Posting mengalahkan crossing jika dan hanya jika

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

di mana Π\Pi adalah hadiahnya — round-trip penuh yang Anda dapatkan dengan menjadi maker alih-alih taker: spread ditambah selisih fee. Ini adalah break-even yang sama yang mengatur seluruh ekonomi maker-taker dalam eksekusi, yang dipadatkan menjadi satu slice.

Angka-angka, BTCUSDT perp: mid $100,000, spread satu tick s = \0.10,feealaVIP0maker2bps/taker5bps,sehingga, fee ala VIP0 maker 2 bps / taker 5 bps, sehingga f_m = $20,, f_t = $50perBTC.Hadiahper BTC. Hadiah\Pi = 0.10 + 50 - 20 = $30.10 \approx 3bpsperhatikanbahwaspreadberkontribusihampirnol;padamayorkriptoyangketat,hadiahnyaadalahselisihfee.Ambilvolharian3 bps — perhatikan bahwa spread berkontribusi hampir nol; pada mayor kripto yang ketat, hadiahnya *adalah* selisih fee. Ambil vol harian 3% (\sigma_{\text{day}} = $3{,}000)dan) dan \delta(\tau) \approx 0.6,\sigma_{\text{day}}\sqrt{\tau/86400}$ (angka 0.6 adalah haircut adverse-selection yang harus Anda kalibrasi, bukan dipercaya begitu saja):

  • τ=10\tau = 10 detik: \delta \approx \19,sehingga, sehingga p^* = 19/49 \approx 0.39$. Post hanya jika Anda memperkirakan fill setidaknya 39% dalam 10 detik.
  • τ=60\tau = 60 detik: \delta \approx \47,sehingga, sehingga p^* = 47/77 \approx 0.61$.
  • Dengan rebate maker 1 bp alih-alih fee 2 bp (f_m = -\10):): \Pi = $60.10,danambang10detikturunmenjadi, dan ambang 10 detik turun menjadi p^* \approx 0.24$.

Dua fakta struktural muncul dari sini. Pertama, δ\delta tumbuh seperti τ\sqrt{\tau} sementara Π\Pi konstan, sehingga p\*(τ)1p^\*(\tau) \to 1: kesabaran punya masa berlaku yang keras, dan timer age-out bukan heuristik melainkan titik potong dua kurva — p(τ)p(\tau) perkiraan Anda (cekung, jenuh seiring antrean di depan Anda terkuras) versus p\*(τ)p^\*(\tau) (naik). Kedua, tier fee tempat Anda bertransaksi secara fisik menggerakkan tangga ini. Kenaikan tier yang memangkas fee taker membuat taktik optimal Anda lebih agresif — sebuah keterkaitan yang kebanyakan orang temukan hanya saat statistik fill mereka berubah setelah re-tier VIP.

Cont dan Kukanov, "Optimal order placement in limit order markets" (Quantitative Finance 17(1), 2017; arXiv 2012), membuat ini rigorous dalam satu periode: meminimalkan biaya eksekusi yang diharapkan untuk SS unit yang dibagi antara market order dan limit order (di satu atau beberapa venue), dengan penalti untuk shortfall. Solusi single-venue eksplisit dan memiliki struktur newsvendor: ukuran limit order optimal didorong oleh distribusi outflow antrean — post ukuran secara agresif ketika antrean di depan kecil relatif terhadap outflow yang diharapkan, dan tutupi risiko ekor dengan market order. Ekstensi multi-venue mereka diselesaikan dengan stochastic approximation dan menjadi inti intelektual dari logika alokasi pasif setiap smart order router. Pembacaan praktis untuk mesin taktik: pp dalam break-even di atas bukan konstanta — ia adalah fungsi dari posisi antrean dan laju drain, sebab itulah lapisan taktik harus mengonsumsi estimator posisi antrean sebagai input kelas satu.

Timeline slice yang menunjukkan eskalasi dari post pasif di touch melalui repricing hingga crossing sisa di deadline

Parameter urgensi memadatkan seluruh tangga ini. κ\kappa tinggi dari scheduler berarti waktu karakteristik θ=1/κ\theta = 1/\kappa pendek: window menyusut, p\*p^\* naik, dan mesin langsung melompat ke crossing — dengan benar, karena scheduler sudah menyatakan bahwa risiko inventory mendominasi penghematan fee. κ\kappa rendah memperpanjang fase pasif. Lapisan taktik tidak boleh menurunkan ulang urgensi dari pandangannya sendiri terhadap market; itu tugas scheduler, dan menduplikasinya menciptakan dua kontroler yang saling bertentangan.

Repricing tanpa membakar posisi antrean Anda

Setelah di-post, quote bergeser. Mengejarnya secara naif — cancel, post ulang di touch baru, ulangi — adalah cara mesin taktik diam-diam menghancurkan probabilitas fill yang tadinya menjustifikasi posting. Posisi antrean adalah aset dengan nilai dolar yang terukur (Moallemi dan Yuan, 2016, memberi harga padanya: posisi front-of-queue di book FIFO yang likuid bernilai sebagian signifikan dari spread), dan setiap keputusan reprice adalah sebuah trade: jual posisi antrean Anda saat ini, beli satu di belakang level harga yang berbeda. Trade ini hanya layak dilakukan ketika nilai level baru melebihi nilai lama ditambah biaya messaging. Itu membutuhkan pengetahuan tentang apa yang sebenarnya dilakukan amend setiap venue terhadap posisi Anda dalam antrean — dan jawabannya sangat tidak seragam.

CME Globex mendokumentasikan semantik paling bersih: mengurangi kuantitas order mempertahankan prioritas waktu; menambah kuantitas atau mengubah harga mengirim Anda ke belakang antrean. Ini model rujukan — quantity-down gratis, selain itu semuanya re-queue.

Binance spot secara historis hanya menawarkan POST /api/v3/order/cancelReplace — sebuah cancel-plus-new yang terlihat atomik namun secara eksplisit non-transaksional. Dua mode: STOP_ON_FAILURE (default — jika cancel gagal, tidak ada order baru) dan ALLOW_FAILURE (tetap tempatkan order baru meski cancel gagal — halo, eksposur ganda yang tidak disengaja). Operasi ini bisa berhasil sebagian, ditandai dengan HTTP 409, sehingga OMS Anda harus merekonsiliasi kedua kaki secara independen; dan order baru selalu memulai kehidupan antrean yang segar. Kemudian di 2025 Binance merilis Order Amend Keep Priority (PUT /api/v3/order/amend/keepPriority): kurangi kuantitas di tempat, pertahankan prioritas waktu, dengan biaya nol pada jumlah order-terbuka. Semantik CME, lima belas tahun kemudian — dan hanya separuh quantity-down-nya.

Binance USDT-M futures memiliki endpoint modify sejati (PUT /fapi/v1/order), tetapi baca cetakan kecilnya: hanya order LIMIT, baik price maupun quantity harus dikirim, dan "modified orders will be reordered in the match queue" — dokumennya menjanjikan tidak ada retensi prioritas bahkan untuk pengurangan kuantitas murni. Perlakukan setiap modify futures sebagai reset antrean yang kebetulan menghemat satu pesan dan mempertahankan order ID. Satu sisi tajam yang perlu diketahui: memodifikasi order GTX (post-only) ke harga yang akan cross membuat order tersebut dibatalkan, bukan ditolak-dan-dipertahankan — implementasi peg yang tidak memeriksa ini sesekali akan meng-amend dirinya sendiri hingga lenyap.

OKX mengekspos POST /api/v5/trade/amend-order (newPx, newSz, dengan cxlOnFail untuk auto-cancel saat amend gagal). Ini satu pesan, mempertahankan order ID, dan mengonfirmasi secara asinkron — sCode = 0 berarti "permintaan diterima", dan hasil sebenarnya tiba di channel orders sebagai amendResult. Yang secara mencolok tidak dispesifikasikan dokumen publiknya adalah perilaku prioritas-antrean. Jangan mengisi celah dokumentasi itu dengan optimisme. Ukurlah: post dua order penanda di level yang sepi, amend ukuran salah satunya ke bawah, dan amati mana yang terisi lebih dulu selama beberapa ratus percobaan. Sampai Anda punya data itu, asumsi konservatif — perubahan harga apa pun me-requeue Anda di mana-mana, quantity-down mempertahankan prioritas hanya di tempat yang secara eksplisit terdokumentasi — adalah satu-satunya yang dapat dipertahankan.

Matriks operasi amend versus venue yang menunjukkan operasi mana yang mempertahankan prioritas antrean dan mana yang mereset-nya

Konsekuensi kebijakannya:

  1. Histeresis, bukan pegging. Reprice hanya ketika touch bergeser lebih dari band bb tick dari harga resting Anda. Di dalam band, drift adalah noise dan posisi antrean Anda bernilai lebih dari satu tick perbaikan harga. Band awal yang masuk akal adalah 1–3 tick yang diskalakan oleh vol jangka pendek; band yang benar membuat reprice marjinal EV-netral: VnewVcur=cmsgV_{\text{new}} - V_{\text{cur}} = c_{\text{msg}}, dengan VV nilai antrean bergaya Moallemi-Yuan dan cmsgc_{\text{msg}} harga bayangan rate-limit Anda. Operasi amend/cancel-replace mengonsumsi budget order-rate di kedua venue Binance; mesin taktik yang meng-peg setiap tick akan membuat sisa sistem Anda kelaparan kapasitas pesan.
  2. Amend turun, jangan pernah cancel-repost turun. Ketika scheduler memotong budget slice di tengah jalan (scheduler POV melihat volume mengering, re-solve Almgren-Chriss setelah fill sebagian), gunakan jalur pemelihara-prioritas di mana pun tersedia. Ini satu-satunya makan siang gratis di seluruh lapisan ini.
  3. Urgensi asimetris pada reprice. Reprice menuju market (mengejar) mereset antrean Anda pada harga yang lebih buruk — ini seharusnya hanya terpicu dari logika eskalasi, pada timer-nya. Reprice menjauh (market datang kepada Anda) adalah hadiah; ambil hanya lewat band pasif, karena level Anda saat ini hampir pasti akan terisi.

Iceberg, ukuran display, dan apa yang membocorkan intensi Anda

Ukuran display adalah keputusan ketiga, dan ini benar-benar trade dua sisi, bukan tombol stealth gratis. Rekam jejak empirisnya:

  • Frey dan Sandås ("The Impact of Iceberg Orders in Limit Order Books", working paper 2009; Quarterly Journal of Finance, 2017), pada data Xetra: iceberg order membawa 9.3% dari volume yang disubmit dan 15.9% dari volume yang tereksekusi, berukuran 12–20x lipat lebih besar dari limit order biasa, dan — poin puncaknya — ketika partisipan lain mendeteksi sebuah iceberg, mereka merespons dengan market order yang menyamai. Ukuran tersembunyi, sekali disimpulkan, menarik flow: pencarian likuiditas laten bekerja di kedua arah.
  • Bessembinder, Panayides dan Venkataraman ("Hidden liquidity: an analysis of order exposure strategies in electronic stock markets", JFE 94(3), 2009), pada Euronext Paris, di mana order tersembunyi adalah 44% dari volume sampel: menyembunyikan menurunkan implementation shortfall tetapi juga menurunkan probabilitas eksekusi penuh dan memperpanjang waktu-hingga-selesai. Eksposur membeli fill dan membayarnya dalam bentuk impact; opsi ini digunakan persis seperti yang diprediksi teori — order agresif memaparkan diri untuk menarik counterparty, ukuran sabar bersembunyi.
  • Esser dan Mönch ("The navigation of an iceberg", Finance Research Letters 4(2), 2007) memperlakukan ukuran peak sebagai sebuah optimisasi: display lebih besar mengisi lebih cepat, display lebih kecil bocor lebih sedikit, dan optimumnya berada di interior.

Mekanika dahulu, karena ini yang mengikat optimisasinya: pada hampir setiap venue yang mendukung iceberg native (Binance spot lewat icebergQty, OKX lewat algo order iceberg-nya), setiap refill puncak yang terlihat masuk ke belakang antrean pada harga tersebut. Sebuah iceberg karenanya bukan "satu order dengan ukuran tersembunyi" — ia adalah sebuah rangkaian order kecil, masing-masing membayar penuh queue-wait, yang dipicu secara otomatis. Pada break-even fee di atas, ini penting: pp efektif per puncak adalah probabilitas fill back-of-queue, bukan posisi asli Anda. Antrean dalam menghukum puncak kecil dua kali lipat — fill lebih lambat dan lebih banyak adverse selection senilai refill.

Kemudian masalah signaling. Metode deteksi milik Frey dan Sandås sendiri adalah kisah peringatan: detektor frequentist mereka mengunci pada dua pola kemalasan implementasi paling umum — ukuran puncak konstan dan timestamp refill identik dengan timestamp trade yang mengeksekusinya. Partisipan mana pun yang menjalankan detektor itu (dan di venue kripto, banyak yang melakukannya — metadata matching milik exchange sendiri membuatnya lebih mudah lagi bagi flow yang colocated) merekonstruksi ukuran tersembunyi Anda dalam beberapa refill saja. Vektor kebocoran, diurutkan berdasarkan seberapa sering saya melihatnya di lapangan:

  1. Ukuran display yang konstan atau bulat (0.5 BTC, setiap kali).
  2. Refill instan dan deterministik setelah eksekusi puncak-penuh — signature timestamp-sama.
  3. Timer eskalasi deterministik: cross tepat 30 detik ke setiap slice dan tape menunjukkan metronom.
  4. Latensi dan band reprice tetap — cadence amend Anda adalah sidik jari yang sama identifiablenya dengan ukuran order Anda, yang menjadi subjek sidik jari digital dan identifikasi trader.

Biaya terdeteksi bukan hipotetis. Van Kervel dan Menkveld ("High-frequency trading around large institutional orders", Journal of Finance 74(3), 2019) menunjukkan HFT awalnya condong melawan metaorder institusional — menyediakan likuiditas yang dikonsumsi taktik pasif Anda — lalu berbalik trading bersama order tersebut begitu persistensinya membocorkan informasi, back-running sisa order dan secara material menaikkan biaya parent order. Institusi mereka merespons dengan menukar profit spekulatif melawan risiko deteksi. Lapisan taktik Anda persis di mana trade-off itu diimplementasikan: acak ukuran display (uniform 30–70% dari basis yang diskalakan-vol bekerja baik), jitter setiap timer sebesar ±20–30%, sesekali biarkan refill menunggu, dan jangan pernah biarkan dua child order berbagi ukuran, fase timer, dan profil latensi yang sama. Tidak satu pun dari ini menelan biaya kualitas fill yang terukur; semuanya menaikkan lantai noise bagi siapa pun yang mencocokkan detektor terhadap flow Anda.

Mesin taktik minimal

Seluruh lapisan di atas memadat menjadi state machine kecil per slice: IDLE → POSTED → (reprice loop) → CROSSING → DONE, dengan gerbang break-even di entry, band histeresis selagi posted, dan eskalasi deadline. Versi di bawah ini sengaja dibuat minimal — tanpa venue adapter, tanpa manajemen iceberg — tetapi ia event-driven dan bebas side-effect, sehingga langsung cocok dengan simulator sadar-antrean rung-4 dari tangga simulasi fill: simulator memanggil on_tick/on_fill, dan menafsirkan action sebagai post → GTX/post-only, cross → IOC, cancel_replace/amend_down → semantik venue dari matriks di atas.

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",)]

Tiga catatan jujur. p_fill di sini adalah rasio placeholder — dalam produksi ia seharusnya model yang di-bucket dan dikalibrasi secara live dari artikel simulasi-fill, karena seluruh gerbang post/cross hanya sebaik estimasi tersebut. adverse_frac menyembunyikan kuantitas tersulit dalam artikel ini (δ\delta bergantung rezim dan melonjak persis ketika posting paling menggoda); estimasikan dari hasil no-fill Anda sendiri, di-bucket berdasarkan rezim vol. Dan mesin di atas mereprice lewat cancel-replace tanpa syarat — versi yang sadar-venue seharusnya merutekan perubahan quantity-down lewat jalur pemelihara-prioritas dan membebankan setiap aksi terhadap budget pesan.

Jalankan di dalam simulator terhadap replay tape sebelum mempercayai parameter apa pun. Eksperimen yang penting: tetapkan scheduler, sapu escalate_frac dan reprice_band, dan plot shortfall slice terhadap biaya model yang diimplikasikan η\eta. Permukaannya punya plateau — band lebar dari parameter yang mendekati optimal — dan dua tebing: eskalasi terlalu terlambat (sisa yang belum terisi cross ke dalam momentum) dan reprice terlalu bersemangat (seluruh nilai antrean terbakar). Anda ingin tahu di mana tebing-tebing Anda sebelum produksi menemukannya untuk Anda.

Yang perlu diingat

  1. Dua lapisan, satu kontrak. Scheduler memutuskan berapa banyak dan kapan; taktik memutuskan bagaimana. Antarmukanya adalah budget, window, urgensi ke bawah; fill dan shortfall slice terhadap mid kedatangan interval ke atas. Jika Anda tidak bisa mengatribusikan shortfall ke sebuah lapisan, Anda tidak bisa men-tuning keduanya.
  2. Gerbang post/cross adalah aritmetika, bukan vibes. Post jika dan hanya jika p>δ/(Π+δ)p > \delta/(\Pi + \delta) dengan Π=s+ftfm\Pi = s + f_t - f_m. Pada book kripto yang ketat, hadiahnya adalah selisih fee, sehingga tier fee Anda menentukan taktik Anda — retune tangga ini setelah setiap re-tier.
  3. Timer age-out adalah titik potong dua kurva — probabilitas fill yang jenuh melawan adverse selection yang tumbuh τ\sqrt{\tau} — bukan konstanta folklore.
  4. Posisi antrean adalah aset; ketahui semantik amend setiap venue sebelum membelanjakannya. CME: quantity-down mempertahankan prioritas. Binance spot: cancelReplace selalu me-requeue, amend-keepPriority 2025 mempertahankannya untuk pemotongan kuantitas. Binance futures: setiap modify me-requeue. OKX: tidak terdokumentasi — ukur, dan asumsikan yang terburuk sementara itu.
  5. Iceberg adalah rangkaian order back-of-queue, dan yang malas mudah dibaca. Puncak konstan dan refill timestamp-sama adalah signature deteksi yang dipublikasikan; acak ukuran dan timer atau terima menjadi target back-run.
  6. Kirim state machine ke dalam simulator fill Anda terlebih dahulu. Lapisan taktik adalah bagian dari stack di mana backtest dan produksi paling menyimpang — sebab itulah tempatnya memang di dalam simulator, bukan ditempel setelahnya.

Tautan berguna

  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)

Sitasi

@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.}
}
Penafian: Informasi yang disediakan dalam artikel ini hanya untuk tujuan edukasi dan informasi serta tidak merupakan nasihat keuangan, investasi, atau trading. Trading mata uang kripto mengandung risiko kerugian yang signifikan.

Penulis

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

Selangkah Lebih Maju dari Pasar

Berlangganan newsletter kami untuk wawasan AI trading eksklusif, analisis pasar, dan pembaruan platform.

Kami menghormati privasi Anda. Berhenti berlangganan kapan saja.