FIX Protocol
Financial Information eXchange — standard protocol สำหรับ electronic trading, order management, market data
What I Can Do
- Implement FIX connectivity สำหรับ trading platforms เชื่อมต่อกับ exchanges
- ออกแบบ order management flow ผ่าน FIX messages (NewOrderSingle, ExecutionReport)
- Handle session management — logon, heartbeat, sequence number recovery
- Parse และ construct FIX messages ทั้ง standard และ custom tags
- Debug FIX sessions จาก log files วิเคราะห์ปัญหา connectivity
FIX Protocol Overview
FIX (Financial Information eXchange) เป็น standard protocol สำหรับ electronic trading — ใช้กันทั่วโลกในตลาดหุ้น, forex, crypto exchanges ข้อความเป็น tag=value format คั่นด้วย SOH delimiter (|)
8=FIX.4.4|9=148|35=D|49=SENDER|56=TARGET|34=2|52=20240115-10:30:00.000|
11=ORD001|21=1|55=BTC/USDT|54=1|60=20240115-10:30:00.000|38=1.5|40=2|44=42000|10=128|Message Structure
ทุก FIX message มี 3 ส่วน:
- Header —
8(BeginString),9(BodyLength),35(MsgType),49(SenderCompID),56(TargetCompID),34(MsgSeqNum),52(SendingTime) - Body — fields เฉพาะของ message type นั้นๆ
- Trailer —
10(CheckSum) สำหรับ integrity check
Common Message Types (Tag 35)
Session-level:
A(Logon) — เริ่ม session, authenticate0(Heartbeat) — keep-alive ทุก 30 วินาที1(TestRequest) — เช็คว่าอีกฝั่งยังอยู่2(ResendRequest) — ขอ messages ที่หายไป4(SequenceReset) — reset sequence number5(Logout) — ปิด session
Application-level:
D(NewOrderSingle) — ส่ง order ใหม่F(OrderCancelRequest) — ขอยกเลิก orderG(OrderCancelReplaceRequest) — ขอแก้ไข order8(ExecutionReport) — แจ้งผล order (fill, partial fill, reject)9(OrderCancelReject) — แจ้งว่ายกเลิก/แก้ไขไม่ได้W(MarketDataSnapshotFullRefresh) — market data snapshotX(MarketDataIncrementalRefresh) — market data update
Session Management
FIX session ทำงานบน TCP — ต้อง manage connection lifecycle:
- Logon (A) — ส่ง credentials, ตกลง HeartBtInt (heartbeat interval)
- Heartbeat (0) — ส่งทุก interval เพื่อ keep connection alive
- TestRequest (1) — ส่งเมื่อไม่ได้รับ heartbeat ตาม interval
- Logout (5) — graceful disconnect
Session มี 2 roles: Initiator (client ที่เชื่อมต่อ) และ Acceptor (server ที่รับ connection)
Sequence Numbers
ทุก message มี MsgSeqNum (tag 34) — เพิ่มขึ้นทีละ 1 ต่อ direction, ใช้ detect message loss
- ถ้าได้รับ sequence number สูงกว่าที่คาดไว้ → ส่ง
ResendRequest(2) ขอ messages ที่หาย - ถ้าได้รับ sequence number ต่ำกว่าที่คาดไว้ → possible duplicate, ตรวจ
PossDupFlag(tag 43) - Reset sequence numbers ด้วย
SequenceReset(4) หรือตกลงกันว่า reset ตอน Logon
Order Flow
ส่ง Order
Client ส่ง NewOrderSingle (D) → Exchange ตอบ ExecutionReport (8)
Fields สำคัญใน NewOrderSingle:
11(ClOrdID) — unique order ID จาก client55(Symbol) — instrument เช่น BTC/USDT54(Side) — 1=Buy, 2=Sell38(OrderQty) — จำนวน40(OrdType) — 1=Market, 2=Limit44(Price) — ราคา (สำหรับ Limit order)59(TimeInForce) — 0=Day, 1=GTC, 3=IOC, 4=FOK
Execution Report
Exchange ตอบ ExecutionReport (8) บอกสถานะ order:
150(ExecType) — 0=New, 1=PartialFill, 2=Fill, 4=Canceled, 8=Rejected39(OrdStatus) — สถานะปัจจุบันของ order14(CumQty) — จำนวนที่ fill แล้ว151(LeavesQty) — จำนวนที่ยังเหลือ31(LastPx) — ราคาที่ fill ล่าสุด32(LastQty) — จำนวนที่ fill ล่าสุด
Cancel / Replace
OrderCancelRequest(F) — ยกเลิก order ด้วยOrigClOrdID(tag 41) อ้าง order เดิมOrderCancelReplaceRequest(G) — แก้ไข price/qty ของ order ที่ยังไม่ fill- ถ้า exchange ปฏิเสธจะตอบ
OrderCancelReject(9) พร้อมCxlRejReason
Market Data
Snapshot (W)
Full refresh ของ order book — ได้ทั้ง bid/ask levels ใน message เดียว ใช้ตอนเริ่ม subscribe หรือ recovery
Incremental (X)
Update ทีละ entry — เร็วกว่า snapshot, ใช้สำหรับ real-time price feed, client ต้อง maintain local order book แล้ว apply updates
268(NoMDEntries) — จำนวน entries269(MDEntryType) — 0=Bid, 1=Offer, 2=Trade270(MDEntryPx) — ราคา271(MDEntrySize) — จำนวน279(MDUpdateAction) — 0=New, 1=Change, 2=Delete
FIX Engine Libraries
- QuickFIX (C++/Java/Python/.NET) — open-source, mature, ใช้กันแพร่หลาย
- QuickFIX/Go — Go port ของ QuickFIX
- QuickFIX/J — Java version
- Custom implementation — สำหรับ low-latency ที่ต้องควบคุมทุก layer
FIX Versions
- FIX 4.2 — ยังใช้กันเยอะ, stable
- FIX 4.4 — เพิ่ม features สำหรับ multi-leg orders, allocations
- FIX 5.0 + FIXT 1.1 — แยก transport layer ออกจาก application layer
- ส่วนใหญ่ exchanges รองรับ FIX 4.2 หรือ 4.4 — ตรวจ spec ของแต่ละ exchange
Custom Tags
Exchanges มักเพิ่ม custom tags (5000+) สำหรับ features เฉพาะ — เช่น custom order types, fee tiers, account identifiers ต้องอ่าน spec ของแต่ละ exchange เพื่อ implement ให้ถูก
Logging & Monitoring
- Log ทุก FIX message ทั้ง incoming/outgoing พร้อม timestamp
- Monitor sequence number gaps — สัญญาณว่ามี message loss
- Track heartbeat intervals — ถ้าขาดหาย connection อาจมีปัญหา
- Alert เมื่อ session disconnect หรือ logon fail
- เก็บ FIX logs แยกจาก application logs — ใช้ debug trading issues
ปัญหาที่เจอบ่อย & วิธีแก้
Sequence number mismatch — session เชื่อมต่อไม่ได้
Logon ไม่สำเร็จเพราะ sequence number ไม่ตรงกันระหว่าง client กับ server
สาเหตุ: restart application แล้ว sequence number reset เป็น 1 แต่อีกฝั่งยังจำ sequence เดิม, หรือ recovery หลัง crash ไม่ถูกต้อง
วิธีแก้:
- persist sequence numbers ลง disk/database — ไม่ใช่เก็บแค่ใน memory
- ใช้
ResetOnLogon=Yถ้าทั้งสองฝั่งตกลง reset sequence ทุกครั้งที่ logon - ส่ง
SequenceReset-GapFill(4) เพื่อ skip ช่วงที่หายไป - ติดต่อ exchange support ขอ reset sequence ถ้า mismatch รุนแรง
Message rejected — tag missing หรือ invalid value
Exchange ตอบ Reject (3) หรือ BusinessMessageReject (j)
สาเหตุ: ส่ง message ที่ขาด required tags, ค่า tag ไม่ตรงกับที่ exchange กำหนด (เช่น OrdType ที่ไม่รองรับ), หรือ message format ผิด
วิธีแก้:
- อ่าน
Text(tag 58) และRefTagID(tag 371) ใน reject message — บอกว่า tag ไหนมีปัญหา - ตรวจ FIX spec ของ exchange ให้ครบ — แต่ละ exchange มี required fields ต่างกัน
- ใช้ FIX message validator ตรวจ message ก่อนส่ง
- Log ทุก rejected message พร้อม reason เพื่อ debug
Heartbeat timeout — connection drop บ่อย
Session disconnect ทุกไม่กี่นาที
สาเหตุ: network latency สูงทำให้ heartbeat ไปไม่ทัน, HeartBtInt ตั้งสั้นเกินไป, firewall/NAT timeout ตัด idle TCP connections
วิธีแก้:
- เพิ่ม
HeartBtInt(เช่น 30 → 60 วินาที) ถ้า network ไม่เสถียร - ตรวจ firewall/load balancer timeout — ต้องยาวกว่า HeartBtInt
- ใช้ TCP keepalive ที่ OS level ป้องกัน NAT timeout
- implement reconnection logic — auto reconnect เมื่อ session drop พร้อม sequence recovery
Order stuck — ส่งแล้วไม่ได้ ExecutionReport กลับ
ส่ง NewOrderSingle แล้วไม่มี response กลับมา
สาเหตุ: message ส่งไปแล้วแต่ sequence number ไม่ตรงทำให้อีกฝั่งไม่ process, network issue ทำให้ message ไม่ถึง, หรือ exchange queue เต็ม
วิธีแก้:
- implement timeout สำหรับทุก order — ถ้าไม่ได้ ExecutionReport ภายใน X วินาที ให้ alert
- ส่ง
OrderStatusRequest(H) ถามสถานะ order ตรงๆ - ตรวจ FIX log ว่า message ถูกส่งจริงหรือไม่ (outgoing log)
- มี manual intervention workflow สำหรับ stuck orders — สำคัญมากใน production trading
Duplicate orders — ส่ง order ซ้ำโดยไม่ตั้งใจ
Order เดียวกันถูกส่งหลายครั้ง ทำให้ position ผิด
สาเหตุ: retry logic ส่ง NewOrderSingle ซ้ำเมื่อไม่ได้ response, reconnect แล้ว resend messages ที่ส่งไปแล้ว, PossDupFlag ไม่ถูก set
วิธีแก้:
- ใช้ unique
ClOrdID(tag 11) ทุก order — exchange จะ reject ถ้า duplicate - set
PossDupFlag(tag 43) = Y เมื่อ resend messages หลัง recovery - อย่า retry NewOrderSingle ตรงๆ — ส่ง
OrderStatusRequestก่อนเพื่อตรวจว่า order แรกถึงหรือไม่ - มี reconciliation process ตรวจ orders ระหว่าง local state กับ exchange
Market data gap — order book ไม่ตรง
Local order book ไม่ตรงกับ exchange จริง
สาเหตุ: miss incremental updates (X) ระหว่าง network issue, ไม่ handle MDUpdateAction Delete ทำให้ stale entries ค้าง, sequence gap ใน market data stream
วิธีแก้:
- detect gaps จาก sequence numbers — ถ้าพบ gap ให้ request full snapshot (W) ใหม่
- periodic snapshot reconciliation — ขอ full snapshot ทุก X นาทีเทียบกับ local state
- implement circuit breaker — หยุด trade ถ้า order book data ไม่ reliable
- log ทุก market data update เพื่อ replay และ debug
Related Skills
- Go — ภาษาที่ใช้ implement FIX connectivity
- Gin — web framework สำหรับ trading platform API
- Kafka — event streaming สำหรับ order/trade events
- Redis — caching สำหรับ market data และ session state
- REST API Design — API design สำหรับ trading platform endpoints