From 5dec80645af4ad0aefe714122714610d4c473e6e Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Mon, 23 Feb 2026 16:52:45 +0100 Subject: [PATCH 1/2] tpluspy: support attached trigger orders --- tplus/model/order.py | 5 +++-- tplus/model/order_trigger.py | 14 ++++++++++++++ tplus/utils/limit_order.py | 4 ++-- tplus/utils/market_order.py | 4 ++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tplus/model/order.py b/tplus/model/order.py index 23ce18b..204fe36 100644 --- a/tplus/model/order.py +++ b/tplus/model/order.py @@ -10,7 +10,7 @@ from tplus.model.asset_identifier import AssetIdentifier from tplus.model.limit_order import LimitOrderDetails from tplus.model.market_order import MarketOrderDetails -from tplus.model.order_trigger import TriggerAbove, TriggerBelow +from tplus.model.order_trigger import OrderTrigger from tplus.model.types import UserPublicKey logger = logging.getLogger(__name__) @@ -68,7 +68,7 @@ class Order(BaseModel): book_quantity_decimals: int details: LimitOrderDetails | MarketOrderDetails side: Side - trigger: TriggerAbove | TriggerBelow | None = None + trigger: OrderTrigger | None = None creation_timestamp_ns: int canceled: bool = False target: TradeTarget = TradeTarget.margin_account_spot_trade() @@ -109,6 +109,7 @@ class OrderResponse(BaseModel): trigger_above_price: Decimal | None trigger_below_price: Decimal | None trigger_touched: bool | None = None + parent_id: str | None = None last_update_timestamp_ns: int | None is_immediate_or_cancel: bool | None = None is_fill_or_kill: bool | None = None diff --git a/tplus/model/order_trigger.py b/tplus/model/order_trigger.py index 29f256e..d9cbd36 100644 --- a/tplus/model/order_trigger.py +++ b/tplus/model/order_trigger.py @@ -23,3 +23,17 @@ def serialize_model(self) -> dict[str, dict[str, Any]]: "price": self.price, } return {"PriceBelow": data} + + +class OrderTrigger(BaseModel): + parent_order_id: str | None + trigger: TriggerAbove | TriggerBelow + + @model_serializer + def serialize_model(self) -> dict[str, dict[str, Any] | str]: + if self.parent_order_id is not None: + return { + "parent_order_id": self.parent_order_id, + "trigger": self.trigger.serialize_model(), + } + return {"trigger": self.trigger.serialize_model()} diff --git a/tplus/utils/limit_order.py b/tplus/utils/limit_order.py index fed1df4..63e078b 100644 --- a/tplus/utils/limit_order.py +++ b/tplus/utils/limit_order.py @@ -3,7 +3,7 @@ from tplus.model.asset_identifier import AssetIdentifier from tplus.model.limit_order import GTC, GTD, IOC, LimitOrderDetails from tplus.model.order import CreateOrderRequest, Order, Side, TradeTarget -from tplus.model.order_trigger import TriggerAbove, TriggerBelow +from tplus.model.order_trigger import OrderTrigger from tplus.utils.user import User @@ -17,7 +17,7 @@ def create_limit_order_ob_request_payload( asset_identifier: AssetIdentifier, order_id: str, time_in_force: GTC | GTD | IOC | None = None, - trigger: TriggerAbove | TriggerBelow | None = None, + trigger: OrderTrigger | None = None, target: TradeTarget | None = None, ) -> CreateOrderRequest: side_normalized = Side.SELL if side.lower() == "sell" else Side.BUY diff --git a/tplus/utils/market_order.py b/tplus/utils/market_order.py index 493a3a2..77f6b79 100644 --- a/tplus/utils/market_order.py +++ b/tplus/utils/market_order.py @@ -8,7 +8,7 @@ MarketQuoteQuantity, ) from tplus.model.order import CreateOrderRequest, Order, Side, TradeTarget -from tplus.model.order_trigger import TriggerAbove, TriggerBelow +from tplus.model.order_trigger import OrderTrigger from tplus.utils.user import User @@ -22,7 +22,7 @@ def create_market_order_ob_request_payload( base_quantity: MarketBaseQuantity | None = None, quote_quantity: MarketQuoteQuantity | None = None, fill_or_kill: bool = False, - trigger: TriggerAbove | TriggerBelow | None = None, + trigger: OrderTrigger | None = None, target: TradeTarget | None = None, ) -> CreateOrderRequest: side_normalized = Side.SELL if side.lower() == "sell" else Side.BUY From e18c739bd11db9f1339faf1f15b0d45a87804b53 Mon Sep 17 00:00:00 2001 From: Serge Farny Date: Sun, 8 Mar 2026 18:53:55 +0100 Subject: [PATCH 2/2] correct json --- tplus/model/order_trigger.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tplus/model/order_trigger.py b/tplus/model/order_trigger.py index d9cbd36..ef1a037 100644 --- a/tplus/model/order_trigger.py +++ b/tplus/model/order_trigger.py @@ -30,10 +30,8 @@ class OrderTrigger(BaseModel): trigger: TriggerAbove | TriggerBelow @model_serializer - def serialize_model(self) -> dict[str, dict[str, Any] | str]: - if self.parent_order_id is not None: - return { - "parent_order_id": self.parent_order_id, - "trigger": self.trigger.serialize_model(), - } - return {"trigger": self.trigger.serialize_model()} + def serialize_model(self) -> dict[str, dict[str, Any] | str | None]: + return { + "parent_order_id": self.parent_order_id, + "condition": self.trigger.serialize_model(), + }