API FIX Istituzionale (4.2 / 4.4 / 5.0 / 5.2)
Connettività istituzionale FIX 4.2, 4.4, 5.0 e 5.2: Inserimento ordini (:9878), Drop Copy in tempo reale (797=Y / 9406=Y), Dati di mercato (:9879) e schema XML QuickFIX.
SKILL.mdSkill pronta all'uso per Claude Code con firma HMAC-SHA256, schemi /fapi/v1 e /fapi/v2 e guardrail di redazione dei secret.
AGENTS.mdFile AGENTS.md pronto per il repository per OpenAI Codex CLI: regole di tick-size, budget di rate limit e confini di self-custody.
AGY.mdSpecifica agente per Google Antigravity (agy) e Gemini con template verificati di esecuzione asincrona Python WebSocket + REST.
llms.txtIndice leggibile da macchina a singolo URL di tutte le pagine della documentazione GaiaEx, schema OpenAPI 3.0 e raccolta Postman.
1. Panoramica sull'architettura e sulle versioni multiple
Il gateway FIX istituzionale nativo in C++26 di GaiaEx offre immissione ordini deterministica e a bassissima latenza, Drop Copy in tempo reale, interrogazione di posizioni e ordini e streaming di dati di mercato L1/L2 su sessioni TCP/TLS persistenti.
Scarica lo schema XML per QuickFIX / OnixS: /fix-dictionary.xml — compatibile con QuickFIX (C++/Python/Go), QuickFIX/J, OnixS, OneZero e piattaforme OMS istituzionali. Configura il tuo motore client con ValidateUserDefinedFields=N e ValidateFieldsOutOfOrder=N per garantire la compatibilità futura.
| Tipo di sessione gateway | Porta | Versioni supportate | Funzionalità | Criteri di accesso |
|---|---|---|---|---|
| Order Management (OE) | 9878 | FIX.4.2, FIX.4.4, FIX.5.0, FIX.5.2 | Immissione ordini (35=D), Cancellazione (35=F), Modifica (35=G), Cancellazione di massa (35=q), Stato dell'ordine (35=H), Posizioni (35=AN), Rate Limit (35=XLQ), Strumenti (35=x) | Chiave API Read + Trade |
| Drop Copy (DC) | 9878 | FIX.4.2, FIX.4.4, FIX.5.0, FIX.5.2 | Flusso consolidato ExecutionReport (35=8) in tempo reale etichettato con 797=Y e 9406=Y per tutti gli ordini FIX e REST/HTTP | Accesso solo lettura forzato (35=j rifiuta gli ordini) |
| Market Data (MD) | 9879 | FIX.4.2, FIX.4.4, FIX.5.0, FIX.5.2 | Snapshot (35=W), IncrementalRefresh (35=X) e MarketDataRequestReject (35=Y) L1/L2 in tempo reale | Accesso solo lettura forzato (35=j rifiuta gli ordini) |
Negoziazione della versione e regole wire
| Versione FIX | BeginString (8) | Tag Logon (35=A) | Tag App Header | ExecType (150) di esecuzione | Regola ExecTransType (20) |
|---|---|---|---|---|---|
| FIX 4.2 | 8=FIX.4.2 | Nessuno | Nessuno | 150=1 (Parziale), 150=2 (Esecuzione completa) | Obbligatorio (20=0 Nuovo, 20=3 Stato) |
| FIX 4.4 | 8=FIX.4.4 | Nessuno | Nessuno | 150=F (Trade) con 39=1/2 | Vietato (rifiutato tramite 35=3, 371=20, 373=2) |
| FIX 5.0 | 8=FIXT.1.1 | 1137=7 | 1128=7 | 150=F (Trade) con 39=1/2 | Vietato (rifiutato tramite 35=3, 371=20, 373=2) |
| FIX 5.2 (5.0 SP2) | 8=FIXT.1.1 | 1137=9 | 1128=9 | 150=F (Trade) con 39=1/2 | Vietato (rifiutato tramite 35=3, 371=20, 373=2) |
2. Gestione della sessione e Logon HMAC-SHA256 (35=A)
Ogni sessione FIX inizia con un frame Logon (35=A) autenticato tramite la tua chiave API GaiaEx (Tag 553), il segreto API (Tag 554) e una firma HMAC-SHA256 esadecimale minuscola in 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()| Tag | Nome del campo | Obbl. | Descrizione |
|---|---|---|---|
98 | EncryptMethod | Sì | 0 = Nessuno / crittografia di trasporto TLS |
108 | HeartBtInt | Sì | Intervallo di heartbeat in secondi (consigliato: 30) |
141 | ResetSeqNumFlag | No | Y = Reimposta i numeri di sequenza a 1; N = Ripristina lo stato di sequenza intraday |
553 | Username | Sì | Chiave API GaiaEx |
554 | Password | Sì | Segreto API GaiaEx |
96 | RawData | Sì | Firma HMAC-SHA256 esadecimale a 64 caratteri su 52|A|34|49|56 |
797 / 9406 | CopyMsgIndicator / DropCopyFlag | No | Imposta 797=Y, 9406=Y o 50=DROPCOPY per registrare una sessione Drop Copy in sola lettura |
1409 | SessionStatus | Uscita | Restituito in 35=A / 35=5: 0=Attivo, 4=Logout completato, 5=Autenticazione non valida, 6=Sequenza troppo bassa, 101=Limite di sequenza a 100M |
Recupero dei gap (35=2 & 35=4) e Cancel-on-Disconnect (CoD)
- Rilevamento del gap in entrata: se un messaggio in arrivo contiene
MsgSeqNum (34) > ExpectedSeqNum, il gateway emette immediatamenteResendRequest (35=2, 7=ExpectedSeqNum, 16=0). SeMsgSeqNum (34) < ExpectedSeqNumsenzaPossDupFlag (43=Y), il gateway emetteLogout (35=5, 1409=6)e chiude il socket. - Replay in uscita: quando il client invia
ResendRequest (35=2), il gateway riproduce tutti i messaggi applicativi (compresi i report Drop Copy35=8) con43=Ye122=OrigSendingTime, e aggrega i frame amministrativi inSequenceReset-GapFill (35=4, 123=Y). - Cancel-on-Disconnect (CoD) automatico: quando una sessione di Order Management si disconnette, tutti gli ordini aperti pendenti (
OrdStatus 39=0) inseriti in quella sessione vengono automaticamente cancellati (150=4, 39=4, 103=3020) e trasmessi in tempo reale a qualsiasi sessione Drop Copy attiva.
3. Immissione ordini, modifica, cancellazione e consultazione (35=D, G, F, q, H, AN, XLQ)
NewOrderSingle (35=D)
| Tag | Nome del campo | Obbl. | Valori supportati e note |
|---|---|---|---|
11 | ClOrdID | Sì | Identificativo univoco dell'ordine assegnato dal client (fino a 31 caratteri) |
1 | Account | No | Indirizzo del vault in autocustodia (0x...) o identificativo del sotto-conto |
50 | SenderSubID | No | ID del trader o della strategia; restituito in TargetSubID (57) su 35=8 |
55 | Symbol | Sì | Perpetual USDC (BTCUSDC, ETHUSDC, SOLUSDC), Perpetual USDT (BTCUSDT, ETHUSDT), Perpetual RWA (xyz:GOLD / GOLDUSDC, xyz:NVDA, xyz:TSLA) |
54 | Side | Sì | 1 = Acquisto, 2 = Vendita |
38 | OrderQty | Sì | Quantità dell'ordine nell'asset di base (supporta precisione frazionaria a 4 decimali, es. 0.0050) |
40 | OrdType | Sì | 1 = Market, 2 = Limit, 4 = Stop Limit (richiede 99=StopPx), p = Post-Only (o 18=6) |
44 | Price | C | Prezzo limite (richiesto per 40=2, 40=4, 40=p) |
59 | TimeInForce | No | 1 = GTC (predefinito), 3 = IOC, 4 = FOK, 5 = GTX |
544 | CashMargin | No | 1 = Cash (predefinito), 2 = Margin Open, 3 = Margin Close |
Modifica (35=G), Cancellazione (35=F), Cancellazione di massa (35=q), Stato (35=H), Posizioni (35=AN) e Limiti (35=XLQ)
| MsgType | Nome del messaggio | Tag chiave della richiesta | Risposta del gateway |
|---|---|---|---|
35=G | OrderCancelReplaceRequest | 11=ClOrdID, 41=OrigClOrdID, 55=Symbol, 54=Side, 38=OrderQty, 44=Price | 35=8 con 150=5, 39=5 (Sostituito) o 35=9 (434=2) |
35=F | OrderCancelRequest | 11=ClOrdID, 41=OrigClOrdID, 55=Symbol, 54=Side | 35=8 in due passaggi: 150=6, 39=6 (Cancellazione in sospeso) → 150=4, 39=4 (Cancellato), o 35=9 (434=1) |
35=q | OrderMassCancelRequest | 11=ClOrdID, 530=7 (Cancella tutti gli ordini) | 35=r (1369=MassActionReportID, 531=7) + un 35=8 (150=4, 39=4) per ciascun ordine cancellato |
35=H | OrderStatusRequest | 11=ClOrdID (o 37=OrderID), 790=OrdStatusReqID | 35=8 con 150=I (Stato ordine) o 150=8, 103=5 (Ordine sconosciuto) |
35=AN | RequestForPositions | 710=PosReqID, 724=0 (Posizioni), 1=Account, 55=Symbol | PositionReport (35=AP) con 721=PosMaintRptID, 728=0, 704=LongQty, 705=ShortQty, 730=SettlePrice |
35=XLQ | LimitQuery | 25003=ReqID | LimitResponse (35=XLR) con 25005=ORDERS (500/s) e 25005=CONNECTIONS (20/account) |
4. Drop Copy in tempo reale e riconciliazione (797=Y / 9406=Y)
Drop Copy offre a prime broker, motori di rischio e sistemi di riconciliazione di back-office un flusso in sola lettura in tempo reale di tutti gli eventi ExecutionReport (35=8) sia sulle sessioni FIX Order Entry che sugli ordini API REST/HTTP.
- Flag di sottoscrizione universali: collegati alla porta
9878e inviaLogon (35=A)con797=Y(CopyMsgIndicator),9406=Y(DropCopyFlag) o50=DROPCOPY(SenderSubID). - Stamping in uscita a doppio tag: ogni frame Drop Copy
35=8contiene57=DROPCOPY,797=Ye9406=Y, oltre al dettaglio completo di commissioni e rebate (381=GrossTradeAmt,1057=AggressorIndicator,136=1|137=MiscFeeAmt|138=MiscFeeCurr|139=4,20000=TradeFeeRebateAmt). - Protezione rigorosa di sola lettura: qualsiasi tentativo di inviare
35=D,35=F,35=Go35=qsu una sessione Drop Copy viene immediatamente respinto tramiteBusinessMessageReject (35=j, 380=4). - Recupero dei gap di sequenza: i report Drop Copy in uscita vengono memorizzati nel registro di sequenza della sessione e possono essere riprodotti tramite
ResendRequest (35=2)conPossDupFlag (43=Y).
5. Dati di mercato (35=V, W, X, Y) e dati di riferimento (35=x, y, h)
Collegati alla porta 9879 per lo streaming dedicato dei dati di mercato oppure consulta le specifiche degli strumenti tramite SecurityListRequest (35=x).
- MarketDataRequest (
35=V): invia262=MDReqID,263=1(Snapshot + Aggiornamenti) o0(Snapshot),264=1(Top of Book) o20(Profondità completa) e55=Symbol. RestituisceMarketDataSnapshotFullRefresh (35=W)seguito daMarketDataIncrementalRefresh (35=X). I simboli sconosciuti restituisconoMarketDataRequestReject (35=Y, 281=0). - SecurityListRequest (
35=x): invia320=SecurityReqIDe559=0(singolo simbolo in55) o559=4(tutti gli strumenti). RestituisceSecurityList (35=y)con tick size (969=MinPriceIncrement), quantità d'ordine min/max (8000/8001) e precisione decimale (8002/8003). - TradingSessionStatus (
35=h): restituisce340=2(Aperto 24x7x365) o340=1(Sospeso).
Modello di configurazione client QuickFIX (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