When to Use
Use this skill when integrating directly with Cboe Options Exchanges (Cboe Options Exchange [C1], C2 Options Exchange, Cboe BZX Options, Cboe EDGX Options) over Cboe Titanium FIX to trade multi-leg option strategies. Specifically:
- Construct and serialize New Order Multileg (
MsgType=AB) messages with theNoLegs (555)repeating group. - Eliminate legging risk by routing spreads, straddles, strangles, condors, butterflies, collars and ratio spreads to the Complex Order Book (COB) as one package that executes within a net price and ratio.
- Control Complex Order Auction (COA) exposure through
RoutingInst (9303). - Execute stock-option combination orders (buy-writes, collars) on C1 and EDGX, including the Cboe Rule 5.33 conforming-ratio test.
- Reconcile a complex fill from the package report plus the per-leg reports Cboe sends alongside it.
When NOT to Use
- Single-Leg Option Orders: use
MsgType=D(New Order Single). Cboe requires at least 2 legs onMsgType=AB. - AIM / paired auctions: AIM is entered through
New Order Cross Multileg(C1 and EDGX only), not by tagging a standard complex order. NoExecInstvalue converts an ordinary order into an AIM order. - Short-form COB requests: this skill's helper emits the long form only. The short form (pricing against an already-listed COB strategy symbol via
Symbol (55)+Side (54)) has a side-dependent net-price sign and needs its own builder. - BOEv3 wire encoding: the helper implements FIX only; take binary layouts from the Cboe BOE v3 specification.
- Venues Lacking Native Combo Books: use algorithmic synthetic legging with hedge monitoring instead (see
calendar-spread-and-multi-leg-order-atomicity). - OTC / bilateral options not listed or cleared through the OCC.
Prerequisites
- Active Cboe Titanium FIX order-entry session with market access credentials and a valid EFID.
- FIX engine that serializes and parses repeating groups; it supplies
BeginString (8),BodyLength (9)andCheckSum (10). - OCC clearing parameters for
LegPositionEffect (564)and, where applicable, CMTA fields. - Pre-trade risk controls per SEC Rule 15c3-5.
- For stock-option orders: C1 or EDGX access, plus an equity matching destination (
EquityExDestination (22016)).
Workflow
- Choose the request form. Long form (legs in the
555group) or short form (a listed COB strategy symbol inSymbol (55)withSide (54)). Do not mix them: sending the underlying root inSymbol (55)alongside a leg group is neither form. The rest of this workflow is the long form. - Define legs. Each
OptionLegneedsLegSymbol (600),LegRatioQty (623),LegSide (624)and, unlessOrderCapacity (47)isM/N,LegPositionEffect (564). When600is an OSI root,LegCFICode (608),LegMaturityDate (611)andLegStrikePrice (612)are required too. Mark the equity leg with608=E— there is noLegSecurityType (609)in this message. - Normalize ratios (CRITICAL). Reduce all leg ratios by their GCD and multiply
OrderQty (38)by the same GCD, so net exposure is unchanged. Cboe rejects unreduced ratios outright. - Re-validate after scaling, not before. GCD scaling is a multiplication:
OrderQty (38)must still be ≤ 999,999 afterwards. On C2 and EDGX the reduced smallest-to-largest leg ratio must also be no wider than 1:3. - Stock-option conformance (Cboe Rule 5.33). Compute the ratio from the smallest option leg against the stock leg and require ≤ 8:1. Using the sum of all option legs over-rejects legitimate collars. A non-conforming order is not invalid — it receives different priority and auction handling, so decide deliberately.
- Price the package. Long form: positive = net debit, negative = net credit,
0= even. Whole pennies for option-only spreads; up to 4 decimals only with a stock leg or FLEX. Check the class increment separately — SPX/SPXW non-box/roll spreads trade in $0.05, not $0.01. - Set routing.
RoutingInst (9303): first characterB/P/D, second characterS(expose via COA) orL(suppress). Leave unset to accept Cboe's defaults (Sfor non-IOC,Lfor IOC).PSis rejected.ExecInst (18)has exactly one documented value here —G(All or None) — and plays no part in auction selection. - Serialize.
35=ABwith167=MLEGand47(both required), then555=Nfollowed by leg groups that each start withLegRefID (654), then38,40,44,9303,47,59. - Reconcile the fill. Branch on
MultilegReportingType (442):3is the package fill,2is a per-leg fill carryingLegRefID (654),LastPx (31)andLastShares (32)at the top level. Join byLegRefIDand assertleg_qty == package_qty × reduced_ratio. A breach is a position-integrity incident, not a retry trigger.
Full procedure: see
references/workflows.md. Standards reference: seereferences/standards.md. Printable pre-flight checklist: seeassets/checklist.md.
Common Pitfalls
- Selecting COA through
ExecInst (18): COA exposure lives in the second character ofRoutingInst (9303)(S/L).ExecInstvalues borrowed from base FIX are not Cboe values — sending18=Atransmits "No cross", not "COA eligible". - Emitting
LegSecurityType (609): it is not a field of Cboe's New Order Multileg. Leg type isLegCFICode (608)=OC/OP/E. - Starting the leg group on
LegSymbol (600): Cboe documentsLegRefID (654)as "the required tag to start each repeated group". A group opened on another tag is not a valid repeating group, and654is also the only key that maps leg fills back to legs. - Expecting
LegLastPx (637)/LegLastQty (638): they do not exist in the Cboe message set. A parser that looks for them silently reports every leg as filled at 0.00 for 0 contracts. - Applying the debit-positive rule to a short-form Sell order: under the short form, a positive
Price (44)on a Sell order is a credit. Inverting it crosses the market or is rejected off-market. - Validating
OrderQtybefore GCD scaling: 200,000 packages of a 10:20 spread normalizes to 2,000,000 contracts and breaches the documented 999,999 ceiling only after normalization. - Summing option legs for the 8:1 test: Cboe's ratio check uses the smallest option leg. Summing rejects conforming collars and buy-writes.
- Assuming FOK is available:
TimeInForce (59)on this message is0,1,2,3or6— FOK is not documented. - Assuming pennies everywhere: SPX/SPXW non-box/roll complex orders price in $0.05 increments.
- Serializing prices from binary floats: format from
Decimal;0.1 + 0.2reaches the wire as0.30000000000000004. - Retrying on a request timeout: a lost response does not mean the order was not accepted. Query order state or cancel the original
ClOrdId; Cboe enforcesClOrdIduniqueness only among live orders, so it is not a duplicate guard once an order is no longer live.
Verification
- Run the test suite:
python -m unittest discover -s skills/cboe-options-exchange-api-integration/scripts. - Validate structure:
python tools/validate_skills.py --skill cboe-options-exchange-api-integration. - Confirm a generated debit spread contains
35=AB,167=MLEG,47,555=2, and that the text following555=2begins with654=. - Confirm
609=and18=never appear in generated output, and that55=/54=are absent from long-form output. - Confirm a 10:20 ratio spread reduces to 1:2 with
OrderQtyscaled ×10, and that a scaled quantity above 999,999 is rejected. - Confirm
reconcile_leg_fillsraises when a442=2leg quantity does not equalpackage_qty × reduced_ratio.
Limitations
- Class-level net price increments (e.g. $0.05 for SPX/SPXW) are not enforced — only the whole-penny / 4-decimal precision rule from the FIX specification is.
- FLEX-specific fields (
LegPrice (566),LegDelta (22024),FLEXAuctionDuration (21010)) and floor routing (FloorRoutingInst (22303)) are documented inreferences/standards.mdbut not implemented. - Cboe's field table marks
Price (44)as required on New Order Multileg without stating an exception forOrdType=1; the helper omits44on market orders. Confirm market complex-order handling with the Cboe Trade Desk before enabling it.