From a5331409684ca133035c552d0486d299e395f213 Mon Sep 17 00:00:00 2001 From: alex101xela Date: Mon, 13 Apr 2026 11:47:59 +0400 Subject: [PATCH 1/2] Support TPSL MARKET order price type --- examples/cases/createorder/create_conditional_order.py | 2 +- examples/cases/createorder/create_market_order.py | 6 ++---- .../create_market_order_with_blocking_client.py | 6 ++---- .../cases/tpsl/create_limit_order_with_partial_tpsl.py | 9 +++++---- .../cases/tpsl/create_limit_order_with_position_tpsl.py | 4 ++-- examples/cases/tpsl/create_partial_tpsl_order.py | 4 ++-- examples/cases/tpsl/create_position_tpsl_order.py | 4 ++-- examples/utils.py | 2 +- x10/config.py | 2 ++ x10/perpetual/order_object.py | 5 +---- 10 files changed, 20 insertions(+), 24 deletions(-) diff --git a/examples/cases/createorder/create_conditional_order.py b/examples/cases/createorder/create_conditional_order.py index dfb3e23..d93fb01 100644 --- a/examples/cases/createorder/create_conditional_order.py +++ b/examples/cases/createorder/create_conditional_order.py @@ -29,8 +29,8 @@ async def run_example(): adjust_price_by_pct = get_adjust_price_by_pct(market.trading_config) order_size = market.trading_config.min_order_size - order_price = adjust_price_by_pct(market.market_stats.bid_price, -15.0) order_trigger_price = adjust_price_by_pct(market.market_stats.bid_price, -10.0) + order_price = adjust_price_by_pct(order_trigger_price, -5.0) LOGGER.info("Creating CONDITIONAL order object for market: %s", market.name) diff --git a/examples/cases/createorder/create_market_order.py b/examples/cases/createorder/create_market_order.py index f63cbfb..da5334e 100644 --- a/examples/cases/createorder/create_market_order.py +++ b/examples/cases/createorder/create_market_order.py @@ -1,16 +1,14 @@ import logging from asyncio import run -from decimal import Decimal from examples.utils import create_trading_client -from x10.config import BTC_USD_MARKET +from x10.config import BTC_USD_MARKET, DEFAULT_MARKET_PRICE_SLIPPAGE from x10.perpetual.order_object import create_order_object from x10.perpetual.orders import OrderSide, OrderType, TimeInForce from x10.utils.order import get_price_with_slippage LOGGER = logging.getLogger() MARKET_NAME = BTC_USD_MARKET -SLIPPAGE = Decimal(0.0075) async def run_example(): @@ -28,7 +26,7 @@ async def run_example(): side=order_side, price=best_market_price, min_price_change=market.trading_config.min_price_change, - slippage=SLIPPAGE, + slippage=DEFAULT_MARKET_PRICE_SLIPPAGE, ) LOGGER.info("Creating MARKET order object for market: %s", market.name) diff --git a/examples/cases/createorder/create_market_order_with_blocking_client.py b/examples/cases/createorder/create_market_order_with_blocking_client.py index a49e460..3e5bc20 100644 --- a/examples/cases/createorder/create_market_order_with_blocking_client.py +++ b/examples/cases/createorder/create_market_order_with_blocking_client.py @@ -1,9 +1,8 @@ import asyncio import logging -from decimal import Decimal from examples.utils import create_blocking_client -from x10.config import BTC_USD_MARKET +from x10.config import BTC_USD_MARKET, DEFAULT_MARKET_PRICE_SLIPPAGE from x10.perpetual.configuration import TESTNET_CONFIG from x10.perpetual.orderbook import OrderBook from x10.perpetual.orders import OrderSide, OrderType, TimeInForce @@ -12,7 +11,6 @@ LOGGER = logging.getLogger() ENDPOINT_CONFIG = TESTNET_CONFIG MARKET_NAME = BTC_USD_MARKET -SLIPPAGE = Decimal(0.0075) async def get_orderbook_best_ask(market_name: str): @@ -58,7 +56,7 @@ async def run_example(): side=order_side, price=best_ask_entry.price, min_price_change=market.trading_config.min_price_change, - slippage=SLIPPAGE, + slippage=DEFAULT_MARKET_PRICE_SLIPPAGE, ) LOGGER.info("Creating MARKET order for market %s: %s@%s", market.name, order_size, order_price) diff --git a/examples/cases/tpsl/create_limit_order_with_partial_tpsl.py b/examples/cases/tpsl/create_limit_order_with_partial_tpsl.py index edb6e9e..b3c2912 100644 --- a/examples/cases/tpsl/create_limit_order_with_partial_tpsl.py +++ b/examples/cases/tpsl/create_limit_order_with_partial_tpsl.py @@ -1,12 +1,13 @@ import logging from asyncio import run +from decimal import Decimal from examples.utils import ( create_trading_client, find_order_and_cancel, get_adjust_price_by_pct, ) -from x10.config import BTC_USD_MARKET +from x10.config import BTC_USD_MARKET, DEFAULT_MARKET_PRICE_SLIPPAGE from x10.perpetual.order_object import OrderTpslTriggerParam, create_order_object from x10.perpetual.orders import ( OrderPriceType, @@ -31,9 +32,9 @@ async def run_example(): order_price = adjust_price_by_pct(market.market_stats.bid_price, -10.0) tp_trigger_price = adjust_price_by_pct(order_price, 0.5) - tp_price = adjust_price_by_pct(order_price, 1.0) + tp_price = adjust_price_by_pct(tp_trigger_price, 0.5) sl_trigger_price = adjust_price_by_pct(order_price, -0.5) - sl_price = adjust_price_by_pct(order_price, -1.0) + sl_price = adjust_price_by_pct(sl_trigger_price, -DEFAULT_MARKET_PRICE_SLIPPAGE * Decimal("100")) LOGGER.info("Creating LIMIT order object with TPSL for market: %s", market.name) @@ -58,7 +59,7 @@ async def run_example(): trigger_price=sl_trigger_price, trigger_price_type=OrderTriggerPriceType.LAST, price=sl_price, - price_type=OrderPriceType.LIMIT, + price_type=OrderPriceType.MARKET, ), ) diff --git a/examples/cases/tpsl/create_limit_order_with_position_tpsl.py b/examples/cases/tpsl/create_limit_order_with_position_tpsl.py index 8afc686..d17aaba 100644 --- a/examples/cases/tpsl/create_limit_order_with_position_tpsl.py +++ b/examples/cases/tpsl/create_limit_order_with_position_tpsl.py @@ -31,9 +31,9 @@ async def run_example(): order_price = adjust_price_by_pct(market.market_stats.bid_price, -10.0) tp_trigger_price = adjust_price_by_pct(order_price, 0.5) - tp_price = adjust_price_by_pct(order_price, 1.0) + tp_price = adjust_price_by_pct(tp_trigger_price, 0.5) sl_trigger_price = adjust_price_by_pct(order_price, -0.5) - sl_price = adjust_price_by_pct(order_price, -1.0) + sl_price = adjust_price_by_pct(sl_trigger_price, -0.5) LOGGER.info("Creating LIMIT order object with TPSL for market: %s", market.name) diff --git a/examples/cases/tpsl/create_partial_tpsl_order.py b/examples/cases/tpsl/create_partial_tpsl_order.py index f12255b..3a8958a 100644 --- a/examples/cases/tpsl/create_partial_tpsl_order.py +++ b/examples/cases/tpsl/create_partial_tpsl_order.py @@ -33,9 +33,9 @@ async def run_example(): last_price = market.market_stats.last_price tp_trigger_price = adjust_price_by_pct(last_price, -5) - tp_price = adjust_price_by_pct(last_price, -10) + tp_price = adjust_price_by_pct(tp_trigger_price, -5) sl_trigger_price = adjust_price_by_pct(last_price, 5) - sl_price = adjust_price_by_pct(last_price, 10) + sl_price = adjust_price_by_pct(sl_trigger_price, 5) LOGGER.info("Creating partial TPSL order object for market: %s", market.name) diff --git a/examples/cases/tpsl/create_position_tpsl_order.py b/examples/cases/tpsl/create_position_tpsl_order.py index 5df7895..4aaea74 100644 --- a/examples/cases/tpsl/create_position_tpsl_order.py +++ b/examples/cases/tpsl/create_position_tpsl_order.py @@ -31,9 +31,9 @@ async def run_example(): last_price = market.market_stats.last_price tp_trigger_price = adjust_price_by_pct(last_price, -5) - tp_price = adjust_price_by_pct(last_price, -10) + tp_price = adjust_price_by_pct(tp_trigger_price, -5) sl_trigger_price = adjust_price_by_pct(last_price, 5) - sl_price = adjust_price_by_pct(last_price, 10) + sl_price = adjust_price_by_pct(sl_trigger_price, 5) LOGGER.info("Creating entire position TPSL order object for market: %s", market.name) diff --git a/examples/utils.py b/examples/utils.py index dc5c597..f8380c3 100644 --- a/examples/utils.py +++ b/examples/utils.py @@ -90,7 +90,7 @@ def create_stream_client(endpoint_config: EndpointConfig = TESTNET_CONFIG): def get_adjust_price_by_pct(config: TradingConfigModel): - def adjust_price_by_pct(price: Decimal, pct: int): + def adjust_price_by_pct(price: Decimal, pct: Decimal | int): return config.round_price(price + price * Decimal(pct) / 100) return adjust_price_by_pct diff --git a/x10/config.py b/x10/config.py index d8aa90d..b5c603d 100644 --- a/x10/config.py +++ b/x10/config.py @@ -1,10 +1,12 @@ import importlib.metadata +from decimal import Decimal BTC_USD_MARKET = "BTC-USD" SOL_USD_MARKET = "SOL-USD" ADA_USD_MARKET = "ADA-USD" ETH_USD_MARKET = "ETH-USD" +DEFAULT_MARKET_PRICE_SLIPPAGE = Decimal("0.0075") DEFAULT_REQUEST_TIMEOUT_SECONDS = 500 SDK_VERSION = importlib.metadata.version("x10-python-trading-starknet") USER_AGENT = f"X10PythonTradingClient/{SDK_VERSION}" diff --git a/x10/perpetual/order_object.py b/x10/perpetual/order_object.py index 120de39..9e72e14 100644 --- a/x10/perpetual/order_object.py +++ b/x10/perpetual/order_object.py @@ -243,10 +243,7 @@ def create_tpsl_trigger_model(trigger_param: OrderTpslTriggerParam | None): return None if tp_sl_type is None: - raise ValueError("`tp_sl_type` must be provided if `take_profit` or `stop_loss` is specified") - - if trigger_param.price_type == OrderPriceType.MARKET: - raise NotImplementedError("TPSL `MARKET` price type is not supported yet") + raise ValueError("`tp_sl_type` must be provided if `take_profit` and/or `stop_loss` is specified") return __create_order_tpsl_trigger_model( trigger_param=trigger_param, From 17225cb8d67483aaf59e8fd95140837070dff811 Mon Sep 17 00:00:00 2001 From: alex101xela Date: Mon, 13 Apr 2026 12:27:31 +0400 Subject: [PATCH 2/2] Support TPSL MARKET order price type --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 46b99ab..11d50d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "x10-python-trading-starknet" -version = "1.3.0" +version = "1.3.1" description = "Python client for X10 API" authors = ["X10 "] repository = "https://github.com/x10xchange/python_sdk"