KRX–NXT Cross-Venue Session Cutover & Auction-Safe Routing Playbook
Date: 2026-02-25 (KST)
TL;DR
In Korea’s multi-venue stock market regime (KRX + Nextrade/ATS), many execution failures come from session-boundary mistakes, not alpha errors.
This playbook turns official session constraints into code-level routing rules:
- Build a time-sliced venue eligibility matrix (KRX-only / NXT-only / dual)
- Enforce auction cutover locks around open/close auctions
- Separate best-execution logic from regulatory hard-block logic
- Keep a deterministic fallback when one venue is temporarily unavailable
1) Why this matters now
With Nextrade (ATS) operating alongside KRX, Korea effectively moved from single-venue assumptions to a cross-venue execution environment. The FSC explicitly frames this as a competition-based market structure with integrated oversight and best-execution obligations for securities firms.
Engine implication: if your router still assumes one continuous venue/day structure, you will leak errors at boundaries (open, close, off-hours transitions).
2) Source-backed market structure constraints
2.1 KRX base trading structure (retail-facing legal summary)
From 생활법령정보 (summarizing KRX rulebook references):
- Regular market: 09:00–15:30
- Quote acceptance (regular): 08:30–15:30
- Pre-open off-hours market: 08:00–09:00
- Off-hours close-price matching: 08:30–08:40
- Post-close off-hours market: 15:40–18:00
- Off-hours close-price matching: 15:40–16:00
- Off-hours single-price session: 16:00–18:00
- Tick-size ladder and price/time priority rules apply; order quantity unit baseline is 1 share.
2.2 FSC ATS operating framework (KRX + NXT interaction)
From FSC press release (Feb 5, 2025 approval notes):
- NXT sessions: pre-market 08:00–08:50, after-market 15:30–20:00
- KRX opening auction stays 08:30–09:00, with displayed indicative-price window reduced to 08:50–09:00
- KRX closing auction remains 15:20–15:30
- During KRX opening/closing auctions, NXT temporarily suspends transactions
- In KRX off-hours auction window (16:00–18:00), items traded there are off-limits for NXT
- Short selling at NXT is restricted to regular session (09:00–15:20)
- Price limits and stabilization framework remain aligned (e.g., ±30% framework)
2.3 KIS Open API operational shape
From KIS sample repo (open-trading-api):
- REST token endpoint:
/oauth2/tokenP - WebSocket approval endpoint:
/oauth2/Approval - Real REST:
https://openapi.koreainvestment.com:9443 - Paper REST:
https://openapivts.koreainvestment.com:29443 - Real WS:
ws://ops.koreainvestment.com:21000 - Paper WS:
ws://ops.koreainvestment.com:31000 - Sample guidance mentions token reissue operational limit around 1 issue per minute
3) Executable session × venue eligibility matrix
| Time block (KST) | KRX | NXT | Router default policy |
|---|---|---|---|
| 08:00–08:30 | limited off-hours | pre-market | session-specific whitelist only |
| 08:30–08:50 | opening auction flow active | pre-market | conservative; avoid dual-routing assumptions |
| 08:50–09:00 | opening indicative-price phase | suspended | KRX-only lock |
| 09:00–15:20 | regular | regular | best-execution SOR (dual venue) |
| 15:20–15:30 | closing auction | suspended | KRX-only close-auction lock |
| 15:30–15:40 | post-close transition | after-market starts | NXT-only or policy-gated |
| 15:40–16:00 | post-close off-hours close-price at KRX | after-market | instrument/session eligibility gate required |
| 16:00–18:00 | KRX off-hours single-price | after-market active but constrained by item overlap rules | enforce item-level exclusivity rule |
| 18:00–20:00 | closed | after-market | NXT-only policy |
Implementation note: do not encode this as static constants in strategy logic. Keep it in config (venue_session_policy.yaml) with versioning.
4) Router architecture pattern (safe split)
4.1 Two-stage decision path
- Regulatory/session hard filter (must-pass)
- venue eligibility by time block
- order type allowedness per venue/session
- short-sale session constraint
- symbol-level overlap restrictions
- Economic ranking layer (best-execution)
- expected fill quality
- fee/slippage estimate
- queue/risk-adjusted urgency
Never allow stage 2 to override stage 1.
4.2 Deterministic fallback states
Define hard fallback modes:
DUAL_ACTIVE(both venues routable)KRX_LOCK(open/close auction windows)NXT_LOCK(KRX closed windows where NXT is available)SAFE_HALT(policy mismatch, stale market-state, or venue health uncertainty)
Avoid fuzzy “try both and see” behavior at boundary seconds.
5) Cutover-safe order handling
5.1 Boundary freeze buffers
At session boundaries, add tiny deterministic freeze windows (e.g., few hundred ms to a few seconds depending on infra latency profile):
- Pause new child-order creation just before boundary
- Recompute venue state using authoritative market clock
- Re-price and re-validate before release
This reduces accidental submission into just-closed states.
5.2 In-flight order hygiene
At each cutover event:
- classify open orders:
keep,cancel-replace,cancel - force revalidation of price band, tick unit, and venue eligibility
- require explicit reason codes for every forced cancel (
cutover.krx_open_lock,cutover.close_auction, etc.)
6) Practical controls to add this week
- Session oracle service
- single source of truth for market phase + venue state
- Reject-code taxonomy
- make boundary failures observable (
reject.venue_window,reject.shortsale_window,reject.symbol_overlap)
- make boundary failures observable (
- Replay harness
- run historical day replay with synthetic timestamps around 08:50, 09:00, 15:20, 15:30, 16:00
- Throttle partitioning
- separate KIS REST/WS/token limiters by environment and function
- “No stale state” invariant
- if session oracle age > threshold, enter
SAFE_HALT
- if session oracle age > threshold, enter
7) Minimal data contract for venue-aware routing
interface VenueState {
tsKst: string
phase:
| 'PRE'
| 'OPEN_AUCTION'
| 'REGULAR'
| 'CLOSE_AUCTION'
| 'POST'
krxTradable: boolean
nxtTradable: boolean
shortSellAllowedNxt: boolean
symbolOverlapRestricted: boolean
sourceVersion: string
}
interface RouteDecision {
allowed: boolean
venue?: 'KRX' | 'NXT'
mode: 'DUAL_ACTIVE' | 'KRX_LOCK' | 'NXT_LOCK' | 'SAFE_HALT'
reasonCodes: string[]
}
8) References
- FSC press release (ATS final approval, session interactions, best execution context): https://www.fsc.go.kr/eng/pr010101/83967
- KIS Open API portal: https://apiportal.koreainvestment.com/intro
- KIS Open API sample repository: https://github.com/koreainvestment/open-trading-api
- KIS sample auth helper (
kis_auth.py): https://raw.githubusercontent.com/koreainvestment/open-trading-api/main/examples_llm/kis_auth.py - KIS sample environment config (
kis_devlp.yaml): https://raw.githubusercontent.com/koreainvestment/open-trading-api/main/kis_devlp.yaml - 생활법령정보 summary of stock trading day/time, quote windows, tick sizes, and matching principles: https://easylaw.go.kr/CSP/CnpClsMain.laf?popMenu=ov&csmSeq=1701&ccfNo=2&cciNo=1&cnpClsNo=2
One-line takeaway
In KR multi-venue execution, alpha competes on milliseconds, but operational survival depends on clean session cutovers and venue-state correctness.