From 78012e35b7aae0f6ea3feb11d81b74a6c4550b37 Mon Sep 17 00:00:00 2001 From: alex101xela Date: Fri, 31 Oct 2025 13:28:01 +0400 Subject: [PATCH 1/5] Remove FOK support for new orders --- examples/01_create_limit_order.py | 4 ++-- .../02_create_limit_order_with_partial_tpsl.py | 4 ++-- examples/simple_client_example.py | 4 ++-- x10/perpetual/order_object.py | 17 ++++++++++------- x10/perpetual/orders.py | 11 ++++++++--- .../simple_client/simple_trading_client.py | 8 ++++---- .../trading_client/order_management_module.py | 4 ++-- x10/perpetual/trading_client/trading_client.py | 4 ++-- 8 files changed, 32 insertions(+), 24 deletions(-) diff --git a/examples/01_create_limit_order.py b/examples/01_create_limit_order.py index 1f72e64..da429b8 100644 --- a/examples/01_create_limit_order.py +++ b/examples/01_create_limit_order.py @@ -7,7 +7,7 @@ from x10.perpetual.accounts import StarkPerpetualAccount from x10.perpetual.configuration import MAINNET_CONFIG from x10.perpetual.order_object import create_order_object -from x10.perpetual.orders import OrderSide, TimeInForce +from x10.perpetual.orders import NewOrderTimeInForce, OrderSide from x10.perpetual.trading_client import PerpetualTradingClient LOGGER = logging.getLogger() @@ -40,7 +40,7 @@ async def run_example(): side=OrderSide.BUY, amount_of_synthetic=order_size, price=market.trading_config.round_price(order_price), - time_in_force=TimeInForce.GTT, + time_in_force=NewOrderTimeInForce.GTT, reduce_only=False, post_only=True, ) diff --git a/examples/02_create_limit_order_with_partial_tpsl.py b/examples/02_create_limit_order_with_partial_tpsl.py index 4cfb2b5..002f33d 100644 --- a/examples/02_create_limit_order_with_partial_tpsl.py +++ b/examples/02_create_limit_order_with_partial_tpsl.py @@ -8,11 +8,11 @@ from x10.perpetual.configuration import MAINNET_CONFIG from x10.perpetual.order_object import OrderTpslTriggerParam, create_order_object from x10.perpetual.orders import ( + NewOrderTimeInForce, OrderPriceType, OrderSide, OrderTpslType, OrderTriggerPriceType, - TimeInForce, ) from x10.perpetual.trading_client import PerpetualTradingClient @@ -51,7 +51,7 @@ async def run_example(): side=OrderSide.BUY, amount_of_synthetic=order_size, price=market.trading_config.round_price(order_price), - time_in_force=TimeInForce.GTT, + time_in_force=NewOrderTimeInForce.GTT, reduce_only=False, post_only=True, tp_sl_type=OrderTpslType.ORDER, diff --git a/examples/simple_client_example.py b/examples/simple_client_example.py index f9166b2..12e01b5 100644 --- a/examples/simple_client_example.py +++ b/examples/simple_client_example.py @@ -4,7 +4,7 @@ from x10.perpetual.accounts import StarkPerpetualAccount from x10.perpetual.configuration import MAINNET_CONFIG from x10.perpetual.orderbook import OrderBook -from x10.perpetual.orders import OrderSide, TimeInForce +from x10.perpetual.orders import NewOrderTimeInForce, OrderSide from x10.perpetual.simple_client.simple_trading_client import BlockingTradingClient @@ -54,7 +54,7 @@ async def best_ask_initialised(best_ask): market_name=market.name, side=OrderSide.BUY, post_only=False, - time_in_force=TimeInForce.IOC, + time_in_force=NewOrderTimeInForce.IOC, ) print(f"Placed order result: {placed_order}") diff --git a/x10/perpetual/order_object.py b/x10/perpetual/order_object.py index 33f466b..80904a7 100644 --- a/x10/perpetual/order_object.py +++ b/x10/perpetual/order_object.py @@ -14,14 +14,14 @@ ) from x10.perpetual.orders import ( CreateOrderTpslTriggerModel, + NewOrderModel, + NewOrderTimeInForce, OrderPriceType, OrderSide, OrderTpslType, OrderTriggerPriceType, OrderType, - PerpetualOrderModel, SelfTradeProtectionLevel, - TimeInForce, ) from x10.utils.date import to_epoch_millis, utc_now from x10.utils.nonce import generate_nonce @@ -46,7 +46,7 @@ def create_order_object( previous_order_external_id: Optional[str] = None, expire_time: Optional[datetime] = None, order_external_id: Optional[str] = None, - time_in_force: TimeInForce = TimeInForce.GTT, + time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT, nonce: Optional[int] = None, builder_fee: Optional[Decimal] = None, @@ -55,7 +55,7 @@ def create_order_object( tp_sl_type: Optional[OrderTpslType] = None, take_profit: Optional[OrderTpslTriggerParam] = None, stop_loss: Optional[OrderTpslTriggerParam] = None, -) -> PerpetualOrderModel: +) -> NewOrderModel: """ Creates an order object to be placed on the exchange using the `place_order` method. """ @@ -123,7 +123,7 @@ def __create_order_object( post_only: bool = False, previous_order_external_id: Optional[str] = None, order_external_id: Optional[str] = None, - time_in_force: TimeInForce = TimeInForce.GTT, + time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT, nonce: Optional[int] = None, builder_fee: Optional[Decimal] = None, @@ -132,7 +132,10 @@ def __create_order_object( tp_sl_type: Optional[OrderTpslType] = None, take_profit: Optional[OrderTpslTriggerParam] = None, stop_loss: Optional[OrderTpslTriggerParam] = None, -) -> PerpetualOrderModel: +) -> NewOrderModel: + assert side in OrderSide, f"Unexpected order side value: {side}" + assert time_in_force in NewOrderTimeInForce, f"Unexpected time in force value: {time_in_force}" + if exact_only: raise NotImplementedError("`exact_only` option is not supported yet") @@ -194,7 +197,7 @@ def __create_order_object( ) order_id = str(settlement_data.order_hash) if order_external_id is None else order_external_id - order = PerpetualOrderModel( + order = NewOrderModel( id=order_id, market=market.name, type=OrderType.LIMIT, diff --git a/x10/perpetual/orders.py b/x10/perpetual/orders.py index eec6389..1ed3c6f 100644 --- a/x10/perpetual/orders.py +++ b/x10/perpetual/orders.py @@ -6,10 +6,14 @@ from x10.utils.model import HexValue, SettlementSignatureModel, X10BaseModel +class NewOrderTimeInForce(StrEnum): + GTT = "GTT" + IOC = "IOC" + + class TimeInForce(StrEnum): GTT = "GTT" IOC = "IOC" - FOK = "FOK" class OrderSide(StrEnum): @@ -131,7 +135,7 @@ class CreateOrderTpslTriggerModel(X10BaseModel): debugging_amounts: Optional[StarkDebuggingOrderAmountsModel] = None -class PerpetualOrderModel(X10BaseModel): +class NewOrderModel(X10BaseModel): id: str market: str type: OrderType @@ -140,7 +144,7 @@ class PerpetualOrderModel(X10BaseModel): price: Decimal reduce_only: bool = False post_only: bool = False - time_in_force: TimeInForce + time_in_force: NewOrderTimeInForce expiry_epoch_millis: int fee: Decimal nonce: Decimal @@ -188,6 +192,7 @@ class OpenOrderModel(X10BaseModel): created_time: int updated_time: int expiry_time: Optional[int] = None + time_in_force: TimeInForce tp_sl_type: Optional[OrderTpslType] = None take_profit: Optional[OpenOrderTpslTriggerModel] = None stop_loss: Optional[OpenOrderTpslTriggerModel] = None diff --git a/x10/perpetual/simple_client/simple_trading_client.py b/x10/perpetual/simple_client/simple_trading_client.py index 12bbf36..d6be2fc 100644 --- a/x10/perpetual/simple_client/simple_trading_client.py +++ b/x10/perpetual/simple_client/simple_trading_client.py @@ -9,11 +9,11 @@ from x10.perpetual.markets import MarketModel from x10.perpetual.order_object import create_order_object from x10.perpetual.orders import ( + NewOrderModel, + NewOrderTimeInForce, OpenOrderModel, OrderSide, OrderStatus, - PerpetualOrderModel, - TimeInForce, ) from x10.perpetual.stream_client.perpetual_stream_connection import ( PerpetualStreamConnection, @@ -202,13 +202,13 @@ async def create_and_place_order( external_id: str | None = None, builder_fee: Decimal | None = None, builder_id: int | None = None, - time_in_force: TimeInForce = TimeInForce.GTT, + time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, ) -> TimedOpenOrderModel: market = (await self.get_markets()).get(market_name) if not market: raise ValueError(f"Market '{market_name}' not found.") - order: PerpetualOrderModel = create_order_object( + order: NewOrderModel = create_order_object( account=self.__account, market=market, amount_of_synthetic=amount_of_synthetic, diff --git a/x10/perpetual/trading_client/order_management_module.py b/x10/perpetual/trading_client/order_management_module.py index 7143466..4924312 100644 --- a/x10/perpetual/trading_client/order_management_module.py +++ b/x10/perpetual/trading_client/order_management_module.py @@ -1,6 +1,6 @@ from typing import List, Optional -from x10.perpetual.orders import PerpetualOrderModel, PlacedOrderModel +from x10.perpetual.orders import NewOrderModel, PlacedOrderModel from x10.perpetual.trading_client.base_module import BaseModule from x10.utils.http import send_delete_request, send_post_request from x10.utils.log import get_logger @@ -17,7 +17,7 @@ class _MassCancelRequestModel(X10BaseModel): class OrderManagementModule(BaseModule): - async def place_order(self, order: PerpetualOrderModel): + async def place_order(self, order: NewOrderModel): """ Placed new order on the exchange. diff --git a/x10/perpetual/trading_client/trading_client.py b/x10/perpetual/trading_client/trading_client.py index 655123a..f5194c7 100644 --- a/x10/perpetual/trading_client/trading_client.py +++ b/x10/perpetual/trading_client/trading_client.py @@ -7,11 +7,11 @@ from x10.perpetual.markets import MarketModel from x10.perpetual.order_object import OrderTpslTriggerParam, create_order_object from x10.perpetual.orders import ( + NewOrderTimeInForce, OrderSide, OrderTpslType, PlacedOrderModel, SelfTradeProtectionLevel, - TimeInForce, ) from x10.perpetual.trading_client.account_module import AccountModule from x10.perpetual.trading_client.info_module import InfoModule @@ -51,7 +51,7 @@ async def place_order( post_only: bool = False, previous_order_id=None, expire_time: Optional[datetime] = None, - time_in_force: TimeInForce = TimeInForce.GTT, + time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT, external_id: Optional[str] = None, builder_fee: Optional[Decimal] = None, From 54d4b1ba34fdd9755074d43b8e924af68db70f60 Mon Sep 17 00:00:00 2001 From: alex101xela Date: Fri, 31 Oct 2025 13:28:47 +0400 Subject: [PATCH 2/5] Remove FOK support for new orders --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 188ec28..1c556c6 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 = "0.0.15" +version = "0.1.0" description = "Python client for X10 API" authors = ["X10 "] repository = "https://github.com/x10xchange/python_sdk" From ba2e373d4518f2625d914bf19efba9bfc4e491b4 Mon Sep 17 00:00:00 2001 From: alex101xela Date: Fri, 31 Oct 2025 13:37:13 +0400 Subject: [PATCH 3/5] Remove FOK support for new orders --- x10/perpetual/orders.py | 1 + 1 file changed, 1 insertion(+) diff --git a/x10/perpetual/orders.py b/x10/perpetual/orders.py index 1ed3c6f..ce3ad01 100644 --- a/x10/perpetual/orders.py +++ b/x10/perpetual/orders.py @@ -14,6 +14,7 @@ class NewOrderTimeInForce(StrEnum): class TimeInForce(StrEnum): GTT = "GTT" IOC = "IOC" + FOK = "FOK" class OrderSide(StrEnum): From 8aef2312a1b03ded5f8dcc8862a5f00cc25416ef Mon Sep 17 00:00:00 2001 From: alex101xela Date: Fri, 31 Oct 2025 13:45:21 +0400 Subject: [PATCH 4/5] Remove FOK support for new orders --- examples/01_create_limit_order.py | 4 ++-- ...02_create_limit_order_with_partial_tpsl.py | 4 ++-- examples/simple_client_example.py | 4 ++-- x10/perpetual/order_object.py | 19 +++++++++++-------- x10/perpetual/orders.py | 7 +------ .../simple_client/simple_trading_client.py | 4 ++-- .../trading_client/trading_client.py | 4 ++-- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/examples/01_create_limit_order.py b/examples/01_create_limit_order.py index da429b8..1f72e64 100644 --- a/examples/01_create_limit_order.py +++ b/examples/01_create_limit_order.py @@ -7,7 +7,7 @@ from x10.perpetual.accounts import StarkPerpetualAccount from x10.perpetual.configuration import MAINNET_CONFIG from x10.perpetual.order_object import create_order_object -from x10.perpetual.orders import NewOrderTimeInForce, OrderSide +from x10.perpetual.orders import OrderSide, TimeInForce from x10.perpetual.trading_client import PerpetualTradingClient LOGGER = logging.getLogger() @@ -40,7 +40,7 @@ async def run_example(): side=OrderSide.BUY, amount_of_synthetic=order_size, price=market.trading_config.round_price(order_price), - time_in_force=NewOrderTimeInForce.GTT, + time_in_force=TimeInForce.GTT, reduce_only=False, post_only=True, ) diff --git a/examples/02_create_limit_order_with_partial_tpsl.py b/examples/02_create_limit_order_with_partial_tpsl.py index 002f33d..4cfb2b5 100644 --- a/examples/02_create_limit_order_with_partial_tpsl.py +++ b/examples/02_create_limit_order_with_partial_tpsl.py @@ -8,11 +8,11 @@ from x10.perpetual.configuration import MAINNET_CONFIG from x10.perpetual.order_object import OrderTpslTriggerParam, create_order_object from x10.perpetual.orders import ( - NewOrderTimeInForce, OrderPriceType, OrderSide, OrderTpslType, OrderTriggerPriceType, + TimeInForce, ) from x10.perpetual.trading_client import PerpetualTradingClient @@ -51,7 +51,7 @@ async def run_example(): side=OrderSide.BUY, amount_of_synthetic=order_size, price=market.trading_config.round_price(order_price), - time_in_force=NewOrderTimeInForce.GTT, + time_in_force=TimeInForce.GTT, reduce_only=False, post_only=True, tp_sl_type=OrderTpslType.ORDER, diff --git a/examples/simple_client_example.py b/examples/simple_client_example.py index 12e01b5..f9166b2 100644 --- a/examples/simple_client_example.py +++ b/examples/simple_client_example.py @@ -4,7 +4,7 @@ from x10.perpetual.accounts import StarkPerpetualAccount from x10.perpetual.configuration import MAINNET_CONFIG from x10.perpetual.orderbook import OrderBook -from x10.perpetual.orders import NewOrderTimeInForce, OrderSide +from x10.perpetual.orders import OrderSide, TimeInForce from x10.perpetual.simple_client.simple_trading_client import BlockingTradingClient @@ -54,7 +54,7 @@ async def best_ask_initialised(best_ask): market_name=market.name, side=OrderSide.BUY, post_only=False, - time_in_force=NewOrderTimeInForce.IOC, + time_in_force=TimeInForce.IOC, ) print(f"Placed order result: {placed_order}") diff --git a/x10/perpetual/order_object.py b/x10/perpetual/order_object.py index 80904a7..7ab7207 100644 --- a/x10/perpetual/order_object.py +++ b/x10/perpetual/order_object.py @@ -15,13 +15,13 @@ from x10.perpetual.orders import ( CreateOrderTpslTriggerModel, NewOrderModel, - NewOrderTimeInForce, OrderPriceType, OrderSide, OrderTpslType, OrderTriggerPriceType, OrderType, SelfTradeProtectionLevel, + TimeInForce, ) from x10.utils.date import to_epoch_millis, utc_now from x10.utils.nonce import generate_nonce @@ -46,7 +46,7 @@ def create_order_object( previous_order_external_id: Optional[str] = None, expire_time: Optional[datetime] = None, order_external_id: Optional[str] = None, - time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, + time_in_force: TimeInForce = TimeInForce.GTT, self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT, nonce: Optional[int] = None, builder_fee: Optional[Decimal] = None, @@ -123,7 +123,7 @@ def __create_order_object( post_only: bool = False, previous_order_external_id: Optional[str] = None, order_external_id: Optional[str] = None, - time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, + time_in_force: TimeInForce = TimeInForce.GTT, self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT, nonce: Optional[int] = None, builder_fee: Optional[Decimal] = None, @@ -133,8 +133,14 @@ def __create_order_object( take_profit: Optional[OrderTpslTriggerParam] = None, stop_loss: Optional[OrderTpslTriggerParam] = None, ) -> NewOrderModel: - assert side in OrderSide, f"Unexpected order side value: {side}" - assert time_in_force in NewOrderTimeInForce, f"Unexpected time in force value: {time_in_force}" + if side not in OrderSide: + raise ValueError(f"Unexpected order side value: {side}") + + if time_in_force not in TimeInForce or time_in_force == TimeInForce.FOK: + raise ValueError(f"Unexpected time in force value: {time_in_force}") + + if expire_time is None: + raise ValueError("`expire_time` must be provided") if exact_only: raise NotImplementedError("`exact_only` option is not supported yet") @@ -147,9 +153,6 @@ def __create_order_object( ): raise NotImplementedError("TPSL `MARKET` price type is not supported yet") - if expire_time is None: - raise ValueError("`expire_time` must be provided") - if nonce is None: nonce = generate_nonce() diff --git a/x10/perpetual/orders.py b/x10/perpetual/orders.py index ce3ad01..146b253 100644 --- a/x10/perpetual/orders.py +++ b/x10/perpetual/orders.py @@ -6,11 +6,6 @@ from x10.utils.model import HexValue, SettlementSignatureModel, X10BaseModel -class NewOrderTimeInForce(StrEnum): - GTT = "GTT" - IOC = "IOC" - - class TimeInForce(StrEnum): GTT = "GTT" IOC = "IOC" @@ -145,7 +140,7 @@ class NewOrderModel(X10BaseModel): price: Decimal reduce_only: bool = False post_only: bool = False - time_in_force: NewOrderTimeInForce + time_in_force: TimeInForce expiry_epoch_millis: int fee: Decimal nonce: Decimal diff --git a/x10/perpetual/simple_client/simple_trading_client.py b/x10/perpetual/simple_client/simple_trading_client.py index d6be2fc..a8600c4 100644 --- a/x10/perpetual/simple_client/simple_trading_client.py +++ b/x10/perpetual/simple_client/simple_trading_client.py @@ -10,10 +10,10 @@ from x10.perpetual.order_object import create_order_object from x10.perpetual.orders import ( NewOrderModel, - NewOrderTimeInForce, OpenOrderModel, OrderSide, OrderStatus, + TimeInForce, ) from x10.perpetual.stream_client.perpetual_stream_connection import ( PerpetualStreamConnection, @@ -202,7 +202,7 @@ async def create_and_place_order( external_id: str | None = None, builder_fee: Decimal | None = None, builder_id: int | None = None, - time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, + time_in_force: TimeInForce = TimeInForce.GTT, ) -> TimedOpenOrderModel: market = (await self.get_markets()).get(market_name) if not market: diff --git a/x10/perpetual/trading_client/trading_client.py b/x10/perpetual/trading_client/trading_client.py index f5194c7..655123a 100644 --- a/x10/perpetual/trading_client/trading_client.py +++ b/x10/perpetual/trading_client/trading_client.py @@ -7,11 +7,11 @@ from x10.perpetual.markets import MarketModel from x10.perpetual.order_object import OrderTpslTriggerParam, create_order_object from x10.perpetual.orders import ( - NewOrderTimeInForce, OrderSide, OrderTpslType, PlacedOrderModel, SelfTradeProtectionLevel, + TimeInForce, ) from x10.perpetual.trading_client.account_module import AccountModule from x10.perpetual.trading_client.info_module import InfoModule @@ -51,7 +51,7 @@ async def place_order( post_only: bool = False, previous_order_id=None, expire_time: Optional[datetime] = None, - time_in_force: NewOrderTimeInForce = NewOrderTimeInForce.GTT, + time_in_force: TimeInForce = TimeInForce.GTT, self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT, external_id: Optional[str] = None, builder_fee: Optional[Decimal] = None, From 46a6efc141bca21e3402ea8e72d2542f63a05145 Mon Sep 17 00:00:00 2001 From: alex101xela Date: Fri, 31 Oct 2025 13:47:20 +0400 Subject: [PATCH 5/5] Remove FOK support for new orders --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1c556c6..1567655 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 = "0.1.0" +version = "0.0.16" description = "Python client for X10 API" authors = ["X10 "] repository = "https://github.com/x10xchange/python_sdk"