Skip to content

Commit b1a1eae

Browse files
Merge pull request #30 from x10xchange/feature/x10-3723-sdk-add-stp
X10-3723 [SDK] Add STP
2 parents 6baac55 + 961ee97 commit b1a1eae

File tree

5 files changed

+20
-3
lines changed

5 files changed

+20
-3
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ build-backend = "poetry.core.masonry.api"
55

66
[tool.poetry]
77
name = "x10-python-trading"
8-
version = "0.3.1"
8+
version = "0.3.2"
99
description = "Python client for X10 API"
1010
authors = ["X10 <tech@ex10.org>"]
1111
repository = "https://github.com/x10xchange/python_sdk"

tests/perpetual/test_order_object.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from hamcrest import assert_that, equal_to, has_entries
77
from pytest_mock import MockerFixture
88

9-
from x10.perpetual.orders import OrderSide
9+
from x10.perpetual.orders import OrderSide, SelfTradeProtectionLevel
1010
from x10.utils.date import utc_now
1111

1212
FROZEN_NONCE = 1473459052
@@ -46,6 +46,7 @@ async def test_create_sell_order(mocker: MockerFixture, create_trading_account,
4646
"expiryEpochMillis": 1705626536860,
4747
"fee": "0.0005",
4848
"nonce": "1473459052",
49+
"selfTradeProtectionLevel": "ACCOUNT",
4950
"cancelId": None,
5051
"settlement": {
5152
"signature": {
@@ -81,6 +82,7 @@ async def test_create_buy_order(mocker: MockerFixture, create_trading_account, c
8182
price=Decimal("43445.11680000"),
8283
side=OrderSide.BUY,
8384
expire_time=utc_now() + timedelta(days=14),
85+
self_trade_protection_level=SelfTradeProtectionLevel.CLIENT,
8486
)
8587

8688
assert_that(
@@ -99,6 +101,7 @@ async def test_create_buy_order(mocker: MockerFixture, create_trading_account, c
99101
"expiryEpochMillis": 1705626536860,
100102
"fee": "0.0005",
101103
"nonce": "1473459052",
104+
"selfTradeProtectionLevel": "CLIENT",
102105
"cancelId": None,
103106
"settlement": {
104107
"signature": {

x10/perpetual/order_object.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
StarkDebuggingOrderAmountsModel,
2121
StarkSettlementModel,
2222
TimeInForce,
23+
SelfTradeProtectionLevel,
2324
)
2425
from x10.utils.date import to_epoch_millis, utc_now
2526
from x10.utils.starkex import generate_nonce, hash_order
@@ -36,6 +37,7 @@ def create_order_object(
3637
expire_time=utc_now() + timedelta(hours=8),
3738
order_external_id: Optional[str] = None,
3839
time_in_force: TimeInForce = TimeInForce.GTT,
40+
self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT,
3941
) -> PerpetualOrderModel:
4042
"""
4143
Creates an order object to be placed on the exchange using the `place_order` method.
@@ -56,6 +58,7 @@ def create_order_object(
5658
previous_order_external_id=previous_order_id,
5759
order_external_id=order_external_id,
5860
time_in_force=time_in_force,
61+
self_trade_protection_level=self_trade_protection_level,
5962
)
6063

6164

@@ -74,6 +77,7 @@ def __create_order_object(
7477
previous_order_external_id: Optional[str] = None,
7578
order_external_id: Optional[str] = None,
7679
time_in_force: TimeInForce = TimeInForce.GTT,
80+
self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT,
7781
) -> PerpetualOrderModel:
7882
if exact_only:
7983
raise NotImplementedError("`exact_only` option is not supported yet")
@@ -130,6 +134,7 @@ def __create_order_object(
130134
time_in_force=time_in_force,
131135
expiry_epoch_millis=to_epoch_millis(expire_time),
132136
fee=amounts.fee_rate,
137+
self_trade_protection_level=self_trade_protection_level,
133138
nonce=Decimal(nonce),
134139
cancel_id=previous_order_external_id,
135140
settlement=settlement,

x10/perpetual/orders.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ class OrderPriceType(Enum):
9696
LIMIT = "LIMIT"
9797

9898

99+
class SelfTradeProtectionLevel(Enum):
100+
DISABLED = "DISABLED"
101+
ACCOUNT = "ACCOUNT"
102+
CLIENT = "CLIENT"
103+
104+
99105
class StarkSettlementModel(X10BaseModel):
100106
signature: SettlementSignatureModel
101107
stark_key: HexValue
@@ -137,6 +143,7 @@ class PerpetualOrderModel(X10BaseModel):
137143
expiry_epoch_millis: int
138144
fee: Decimal
139145
nonce: Decimal
146+
self_trade_protection_level: SelfTradeProtectionLevel
140147
cancel_id: Optional[str] = None
141148
settlement: Optional[StarkSettlementModel] = None
142149
trigger: Optional[CreateOrderConditionalTriggerModel] = None

x10/perpetual/trading_client/trading_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from x10.perpetual.configuration import EndpointConfig
77
from x10.perpetual.markets import MarketModel
88
from x10.perpetual.order_object import create_order_object
9-
from x10.perpetual.orders import OrderSide, PlacedOrderModel, TimeInForce
9+
from x10.perpetual.orders import OrderSide, PlacedOrderModel, TimeInForce, SelfTradeProtectionLevel
1010
from x10.perpetual.trading_client.account_module import AccountModule
1111
from x10.perpetual.trading_client.info_module import InfoModule
1212
from x10.perpetual.trading_client.markets_information_module import (
@@ -43,6 +43,7 @@ async def place_order(
4343
previous_order_id=None,
4444
expire_time=utc_now() + timedelta(hours=8),
4545
time_in_force: TimeInForce = TimeInForce.GTT,
46+
self_trade_protection_level: SelfTradeProtectionLevel = SelfTradeProtectionLevel.ACCOUNT,
4647
) -> WrappedApiResponse[PlacedOrderModel]:
4748
if not self.__stark_account:
4849
raise ValueError("Stark account is not set")
@@ -65,6 +66,7 @@ async def place_order(
6566
previous_order_id,
6667
expire_time,
6768
time_in_force=time_in_force,
69+
self_trade_protection_level=self_trade_protection_level,
6870
)
6971

7072
return await self.__order_management_module.place_order(order)

0 commit comments

Comments
 (0)