FIX API ระดับสถาบัน (4.2 / 4.4 / 5.0 / 5.2)
การเชื่อมต่อ FIX 4.2, 4.4, 5.0 และ 5.2 ระดับสถาบัน: การส่งคำสั่งซื้อขาย (:9878), Drop Copy แบบเรียลไทม์ (797=Y / 9406=Y), ข้อมูลตลาด (:9879) และสกีมา QuickFIX XML
SKILL.mdสกิลแบบ Drop-in สำหรับ Claude Code พร้อมการลงลายเซ็น HMAC-SHA256, สกีมา /fapi/v1 & /fapi/v2 และระบบป้องกันการเปิดเผยข้อมูลลับ
AGENTS.mdไฟล์ AGENTS.md แบบ Drop-in สำหรับ OpenAI Codex CLI — กฎ tick-size, ขีดจำกัด rate-limit และขอบเขตการดูแลทรัพย์สินด้วยตนเอง
AGY.mdสเปกเอเจนต์ Google Antigravity (agy) & Gemini พร้อมเทมเพลตการรันคำสั่ง async Python WebSocket + REST ที่ผ่านการตรวจสอบแล้ว
llms.txtดัชนีที่เครื่องอ่านได้ผ่าน URL เดียวของเอกสาร GaiaEx ทุกหน้า, สกีมา OpenAPI 3.0 และ Postman collection
1. สถาปัตยกรรมและภาพรวมของเวอร์ชันต่างๆ
GaiaEx Native C++26 Institutional FIX Gateway มอบการส่งคำสั่งซื้อขาย (Order Entry), Real-Time Drop Copy, การสอบถามสถานะคำสั่งซื้อขายและสถานะพอร์ต (Position & Order Inquiry) ตลอดจนการสตรีมข้อมูลตลาด L1/L2 ที่มีความหน่วงต่ำเป็นพิเศษ (ultra-low-latency) และมีความแน่นอน (deterministic) สูง ผ่านเซสชัน TCP/TLS แบบ persistent
ดาวน์โหลด XML Schema สำหรับ QuickFIX / OnixS: /fix-dictionary.xml — ใช้งานร่วมกับ QuickFIX (C++/Python/Go), QuickFIX/J, OnixS, OneZero และแพลตฟอร์ม OMS ระดับสถาบันได้ กำหนดค่า client engine ของคุณด้วย ValidateUserDefinedFields=N และ ValidateFieldsOutOfOrder=N เพื่อความเข้ากันได้ในอนาคต
| ประเภทเซสชัน Gateway | พอร์ต | เวอร์ชันที่รองรับ | ขีดความสามารถ | นโยบายการเข้าถึง |
|---|---|---|---|---|
| Order Management (OE) | 9878 | FIX.4.2, FIX.4.4, FIX.5.0, FIX.5.2 | การส่งคำสั่งซื้อขาย (35=D), ยกเลิก (35=F), แก้ไข (35=G), ยกเลิกคำสั่งซื้อขายทั้งหมด (35=q), สถานะคำสั่งซื้อขาย (35=H), สถานะพอร์ต (35=AN), การจำกัดอัตราคำขอ (35=XLQ), ตราสารการซื้อขาย (35=x) | API Key ที่มีสิทธิ์ Read + Trade |
| Drop Copy (DC) | 9878 | FIX.4.2, FIX.4.4, FIX.5.0, FIX.5.2 | สตรีม ExecutionReport (35=8) รวมแบบเรียลไทม์ที่ติดแท็ก 797=Y และ 9406=Y ครอบคลุมทุกคำสั่งซื้อขายผ่าน FIX และ REST/HTTP | บังคับใช้สิทธิ์อ่านอย่างเดียว (Read-Only Enforced) (35=j ปฏิเสธคำสั่งซื้อขาย) |
| Market Data (MD) | 9879 | FIX.4.2, FIX.4.4, FIX.5.0, FIX.5.2 | Snapshot (35=W), IncrementalRefresh (35=X), และ MarketDataRequestReject (35=Y) ระดับ L1/L2 แบบเรียลไทม์ | บังคับใช้สิทธิ์อ่านอย่างเดียว (Read-Only Enforced) (35=j ปฏิเสธคำสั่งซื้อขาย) |
การเจรจาเวอร์ชันและกฎระดับสายสัญญาณ (Wire Rules)
| เวอร์ชัน FIX | BeginString (8) | แท็ก Logon (35=A) | แท็ก App Header | Trade ExecType (150) | กฎ ExecTransType (20) |
|---|---|---|---|---|---|
| FIX 4.2 | 8=FIX.4.2 | ไม่มี | ไม่มี | 150=1 (Partial), 150=2 (Fill) | จำเป็นต้องระบุ (Mandatory) (20=0 ใหม่, 20=3 สถานะ) |
| FIX 4.4 | 8=FIX.4.4 | ไม่มี | ไม่มี | 150=F (Trade) พร้อม 39=1/2 | ไม่อนุญาต (Forbidden) (ปฏิเสธผ่าน 35=3, 371=20, 373=2) |
| FIX 5.0 | 8=FIXT.1.1 | 1137=7 | 1128=7 | 150=F (Trade) พร้อม 39=1/2 | ไม่อนุญาต (Forbidden) (ปฏิเสธผ่าน 35=3, 371=20, 373=2) |
| FIX 5.2 (5.0 SP2) | 8=FIXT.1.1 | 1137=9 | 1128=9 | 150=F (Trade) พร้อม 39=1/2 | ไม่อนุญาต (Forbidden) (ปฏิเสธผ่าน 35=3, 371=20, 373=2) |
2. การจัดการเซสชันและการเข้าสู่ระบบด้วย HMAC-SHA256 (35=A)
ทุกเซสชัน FIX จะเริ่มต้นด้วยเฟรม Logon (35=A) ที่ยืนยันตัวตนผ่าน GaiaEx API Key (Tag 553), API Secret (Tag 554) ของคุณ และลายเซ็น HMAC-SHA256 ในรูปแบบเลขฐานสิบหกตัวพิมพ์เล็กใน RawData (Tag 96)
import hmac, hashlib
def sign_fix_logon(api_secret: str, sending_time: str, seq_num: int, sender_comp_id: str, target_comp_id: str) -> str:
# Canonical prehash string: SendingTime(52) | MsgType(35) | MsgSeqNum(34) | SenderCompID(49) | TargetCompID(56)
payload = f"{sending_time}|A|{seq_num}|{sender_comp_id}|{target_comp_id}"
return hmac.new(api_secret.encode("utf-8"), payload.encode("utf-8"), hashlib.sha256).hexdigest()| แท็ก | ชื่อฟิลด์ | จำเป็น | คำอธิบาย |
|---|---|---|---|
98 | EncryptMethod | Y | 0 = ไม่มีการเข้ารหัส / การเข้ารหัสระดับการส่งข้อมูล TLS |
108 | HeartBtInt | Y | ช่วงเวลา Heartbeat เป็นวินาที (แนะนำ: 30) |
141 | ResetSeqNumFlag | N | Y = รีเซ็ตลำดับหมายเลข (sequence numbers) กลับเป็น 1; N = สานต่อสถานะลำดับหมายเลขระหว่างวัน |
553 | Username | Y | GaiaEx API Key |
554 | Password | Y | GaiaEx API Secret |
96 | RawData | Y | ลายเซ็น HMAC-SHA256 ความยาว 64 ตัวอักษรฐานสิบหก ครอบคลุม 52|A|34|49|56 |
797 / 9406 | CopyMsgIndicator / DropCopyFlag | N | กำหนดเป็น 797=Y, 9406=Y, หรือ 50=DROPCOPY เพื่อลงทะเบียนเซสชัน Drop Copy แบบอ่านอย่างเดียว |
1409 | SessionStatus | Out | ส่งกลับมาใน 35=A / 35=5: 0=ใช้งานอยู่ (Active), 4=ออกจากระบบสมบูรณ์, 5=การยืนยันตัวตนไม่ถูกต้อง, 6=ลำดับต่ำเกินไป, 101=จำกัดลำดับสูงสุดที่ 100M |
การกู้คืนข้อความที่ตกหล่น (35=2 & 35=4) และ Cancel-on-Disconnect (CoD)
- การตรวจจับข้อความขาเข้าที่ตกหล่น (Inbound Gap Detection): หากข้อความขาเข้ามีค่า
MsgSeqNum (34) > ExpectedSeqNumgateway จะส่งResendRequest (35=2, 7=ExpectedSeqNum, 16=0)ทันที หากพบMsgSeqNum (34) < ExpectedSeqNumโดยไม่มีPossDupFlag (43=Y)gateway จะส่งLogout (35=5, 1409=6)และปิดซ็อกเก็ต - การส่งข้อความขาออกซ้ำ (Outbound Replay): เมื่อไคลเอนต์ส่ง
ResendRequest (35=2)gateway จะเล่นซ้ำข้อความระดับแอปพลิเคชันทั้งหมด (รวมถึงรายงาน35=8ของ Drop Copy) พร้อมด้วย43=Yและ122=OrigSendingTimeและรวมเฟรมการดูแลระบบไว้ในSequenceReset-GapFill (35=4, 123=Y) - การยกเลิกคำสั่งซื้อขายอัตโนมัติเมื่อตัดการเชื่อมต่อ (Cancel-on-Disconnect - CoD): เมื่อเซสชัน Order Management หลุดการเชื่อมต่อ คำสั่งซื้อขายที่ยังค้างอยู่ทั้งหมด (
OrdStatus 39=0) ซึ่งส่งมาจากเซสชันนั้นจะถูกยกเลิกโดยอัตโนมัติ (150=4, 39=4, 103=3020) และจะถ่ายทอดสัญญาณแบบเรียลไทม์ไปยังเซสชัน Drop Copy ที่เปิดใช้งานอยู่ทันที
3. การส่ง แก้ไข ยกเลิก และสอบถามสถานะคำสั่งซื้อขาย (35=D, G, F, q, H, AN, XLQ)
NewOrderSingle (35=D)
| แท็ก | ชื่อฟิลด์ | จำเป็น | ค่าที่รองรับและหมายเหตุ |
|---|---|---|---|
11 | ClOrdID | Y | ตัวระบุคำสั่งซื้อขายเฉพาะที่ไคลเอนต์เป็นผู้กำหนด (สูงสุด 31 ตัวอักษร) |
1 | Account | N | ที่อยู่วอลเล็ตดูแลตนเอง (Self-custody vault address) (0x...) หรือตัวระบุบัญชีย่อย |
50 | SenderSubID | N | ID ของเทรดเดอร์หรือกลยุทธ์; สะท้อนกลับมาใน TargetSubID (57) บน 35=8 |
55 | Symbol | Y | USDC Perps (BTCUSDC, ETHUSDC, SOLUSDC), USDT Perps (BTCUSDT, ETHUSDT), RWA Perps (xyz:GOLD / GOLDUSDC, xyz:NVDA, xyz:TSLA) |
54 | Side | Y | 1 = ซื้อ (Buy), 2 = ขาย (Sell) |
38 | OrderQty | Y | ปริมาณคำสั่งซื้อขายในสกุลสินทรัพย์หลัก (base asset) (รองรับทศนิยมสูงสุด 4 ตำแหน่ง เช่น 0.0050) |
40 | OrdType | Y | 1 = Market, 2 = Limit, 4 = Stop Limit (จำเป็นต้องมี 99=StopPx), p = Post-Only (หรือ 18=6) |
44 | Price | C | ราคา Limit (จำเป็นต้องระบุสำหรับ 40=2, 40=4, 40=p) |
59 | TimeInForce | N | 1 = GTC (ค่าเริ่มต้น), 3 = IOC, 4 = FOK, 5 = GTX |
544 | CashMargin | N | 1 = Cash (ค่าเริ่มต้น), 2 = Margin Open, 3 = Margin Close |
แก้ไข (35=G), ยกเลิก (35=F), ยกเลิกทั้งหมด (35=q), สถานะ (35=H), สถานะพอร์ต (35=AN) และขีดจำกัด (35=XLQ)
| MsgType | ชื่อข้อความ | แท็กคำขอหลัก | การตอบกลับของ Gateway |
|---|---|---|---|
35=G | OrderCancelReplaceRequest | 11=ClOrdID, 41=OrigClOrdID, 55=Symbol, 54=Side, 38=OrderQty, 44=Price | 35=8 พร้อม 150=5, 39=5 (แทนที่แล้ว) หรือ 35=9 (434=2) |
35=F | OrderCancelRequest | 11=ClOrdID, 41=OrigClOrdID, 55=Symbol, 54=Side | 35=8 แบบ 2 ขั้นตอน: 150=6, 39=6 (รอยกเลิก) → 150=4, 39=4 (ยกเลิกแล้ว), หรือ 35=9 (434=1) |
35=q | OrderMassCancelRequest | 11=ClOrdID, 530=7 (ยกเลิกคำสั่งซื้อขายทั้งหมด) | 35=r (1369=MassActionReportID, 531=7) + หนึ่ง 35=8 (150=4, 39=4) ต่อหนึ่งคำสั่งซื้อขายที่ถูกยกเลิก |
35=H | OrderStatusRequest | 11=ClOrdID (หรือ 37=OrderID), 790=OrdStatusReqID | 35=8 พร้อม 150=I (สถานะคำสั่งซื้อขาย) หรือ 150=8, 103=5 (ไม่พบคำสั่งซื้อขาย) |
35=AN | RequestForPositions | 710=PosReqID, 724=0 (สถานะพอร์ต), 1=Account, 55=Symbol | PositionReport (35=AP) พร้อม 721=PosMaintRptID, 728=0, 704=LongQty, 705=ShortQty, 730=SettlePrice |
35=XLQ | LimitQuery | 25003=ReqID | LimitResponse (35=XLR) พร้อม 25005=ORDERS (500/วินาที) และ 25005=CONNECTIONS (20/บัญชี) |
4. Drop Copy และการกระทบยอดแบบเรียลไทม์ (797=Y / 9406=Y)
Drop Copy ให้บริการแก่โบรกเกอร์หลัก (prime brokers), ระบบประเมินความเสี่ยง และระบบกระทบยอดงานสนับสนุนส่วนหลัง (back-office reconciliation) ด้วยสตรีมแบบอ่านอย่างเดียวแบบเรียลไทม์ของทุกเหตุการณ์ ExecutionReport (35=8) ทั้งจากเซสชัน FIX Order Entry และคำสั่งซื้อขายผ่าน REST/HTTP API
- แฟล็กการบอกรับข้อมูลสากล (Universal Subscription Flags): เชื่อมต่อไปยังพอร์ต
9878และส่งLogon (35=A)พร้อมกับ797=Y(CopyMsgIndicator),9406=Y(DropCopyFlag), หรือ50=DROPCOPY(SenderSubID) - การประทับแท็กคู่ขาออก: ทุกเฟรม
35=8ของ Drop Copy จะมี57=DROPCOPY,797=Y, และ9406=Yควบคู่ไปกับรายละเอียดค่าธรรมเนียม/ส่วนลดทั้งหมด (381=GrossTradeAmt,1057=AggressorIndicator,136=1|137=MiscFeeAmt|138=MiscFeeCurr|139=4,20000=TradeFeeRebateAmt) - การป้องกันโหมดอ่านอย่างเดียวอย่างเข้มงวด: ความพยายามใดๆ ในการส่ง
35=D,35=F,35=G, หรือ35=qบนเซสชัน Drop Copy จะถูกปฏิเสธทันทีผ่านBusinessMessageReject (35=j, 380=4) - การกู้คืนลำดับข้อความที่ตกหล่น: รายงาน Drop Copy ขาออกจะถูกเก็บรักษาไว้อย่างถาวรในที่จัดเก็บลำดับของเซสชัน และสามารถเรียกเปิดซ้ำได้ผ่าน
ResendRequest (35=2)พร้อมด้วยPossDupFlag (43=Y)
5. ข้อมูลตลาด (35=V, W, X, Y) และข้อมูลอ้างอิง (35=x, y, h)
เชื่อมต่อไปยังพอร์ต 9879 สำหรับการสตรีมข้อมูลตลาดโดยเฉพาะ หรือสอบถามข้อมูลจำเพาะของตราสารผ่าน SecurityListRequest (35=x)
- MarketDataRequest (
35=V): ส่ง262=MDReqID,263=1(ภาพรวม + อัปเดต) หรือ0(ภาพรวม),264=1(ระดับบนสุดของสมุดคำสั่งซื้อขาย) หรือ20(ความลึกเต็มรูปแบบ), และ55=Symbolจะส่งคืนMarketDataSnapshotFullRefresh (35=W)ตามด้วยMarketDataIncrementalRefresh (35=X)หากไม่พบสัญลักษณ์จะส่งคืนMarketDataRequestReject (35=Y, 281=0) - SecurityListRequest (
35=x): ส่ง320=SecurityReqIDและ559=0(สัญลักษณ์เดี่ยวใน55) หรือ559=4(ตราสารทั้งหมด) จะส่งคืนSecurityList (35=y)พร้อมขนาดช่วงราคา (tick size) (969=MinPriceIncrement), ปริมาณคำสั่งซื้อขายต่ำสุด/สูงสุด (8000/8001) และความละเอียดทศนิยม (8002/8003) - TradingSessionStatus (
35=h): ส่งคืน340=2(เปิดตลอด 24 ชั่วโมง 7 วัน 365 วัน) หรือ340=1(หยุดการซื้อขายชั่วคราว)
เทมเพลตการกำหนดค่า QuickFIX Client (gaiaex_fix.cfg)
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=5
FileStorePath=./store
FileLogPath=./log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
DataDictionary=./fix-dictionary.xml
ValidateUserDefinedFields=N
ValidateFieldsOutOfOrder=N
HeartBtInt=30
[SESSION]
BeginString=FIX.4.4
SenderCompID=INST_CLIENT_OE
TargetCompID=GAIAEX_PROD
SocketConnectHost=10.10.0.51
SocketConnectPort=9878
ResetOnLogon=N
[SESSION]
BeginString=FIX.4.4
SenderCompID=INST_CLIENT_DC
TargetCompID=GAIAEX_PROD
SenderSubID=DROPCOPY
SocketConnectHost=10.10.0.51
SocketConnectPort=9878
ResetOnLogon=N