diff --git a/MALKHUT/malkhut/planner/action_menu.py b/MALKHUT/malkhut/planner/action_menu.py index 0dddc53..791ffd9 100644 --- a/MALKHUT/malkhut/planner/action_menu.py +++ b/MALKHUT/malkhut/planner/action_menu.py @@ -121,7 +121,7 @@ def build_our_actions( if _path_risk_says_exit(state, params): actions.append(FulfilmentAction( kind=ActionKind.FULL_EXIT, side=_exit_side_for_position(state), - order_type=OrderType.REDUCE_ONLY_MARKET, price_ticks_from_best=0, + order_type=OrderType.MARKET, price_ticks_from_best=0, qty_fraction=1.0, ttl_ms=0, reduce_only=True, metadata={"reason": "path_risk_exit"}, )) diff --git a/MALKHUT/malkhut/state.py b/MALKHUT/malkhut/state.py index bc8d992..4929ca7 100644 --- a/MALKHUT/malkhut/state.py +++ b/MALKHUT/malkhut/state.py @@ -24,13 +24,37 @@ class Side(str, Enum): class OrderType(str, Enum): - LIMIT = "LIMIT" + """Standardized order types — FIX/CCXT-aligned, multi-exchange. + + Five-layer taxonomy (values are uppercase for backward compatibility): + Layer 1: Base types (FIX Tag 40) — MARKET, LIMIT + Layer 2: Time-in-force (FIX Tag 59) — GTC, IOC, FOK, GTD + Layer 3: Conditional (FIX Tag 3/4+MIT) — STOP_MARKET, STOP_LIMIT, etc. + Layer 4: Instructions (FIX Tag 18) — POST_ONLY, REDUCE_ONLY, etc. + Layer 5: Compound (exchange-specific) — OCO, TP_SL + """ + # Layer 1: Base types (FIX Tag 40) MARKET = "MARKET" - POST_ONLY = "POST_ONLY" + LIMIT = "LIMIT" + # Layer 2: Time-in-force (FIX Tag 59) + GTC = "GTC" IOC = "IOC" FOK = "FOK" - REDUCE_ONLY_LIMIT = "REDUCE_ONLY_LIMIT" - REDUCE_ONLY_MARKET = "REDUCE_ONLY_MARKET" + GTD = "GTD" + # Layer 3: Conditional (FIX Tag 3/4 + MIT) + STOP_MARKET = "STOP_MARKET" + STOP_LIMIT = "STOP_LIMIT" + TRIGGER_MARKET = "TRIGGER_MARKET" + TRIGGER_LIMIT = "TRIGGER_LIMIT" + TRAILING_STOP = "TRAILING_STOP" + # Layer 4: Instructions (FIX Tag 18) + POST_ONLY = "POST_ONLY" + REDUCE_ONLY = "REDUCE_ONLY" + HIDDEN = "HIDDEN" + ICEBERG = "ICEBERG" + # Layer 5: Compound (exchange-specific) + OCO = "OCO" + TP_SL = "TP_SL" class ActionKind(str, Enum):