Skip to content

Commit d64906b

Browse files
committed
[Staggered] fix PNL on sell+buy issue
1 parent 97ca95f commit d64906b

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

Trading/Mode/staggered_orders_trading_mode/staggered_orders_trading.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ def _create_mirror_order(self, filled_order: dict):
784784
new_side = trading_enums.TradeOrderSide.SELL if now_selling else trading_enums.TradeOrderSide.BUY
785785
associated_entry_id = filled_order[
786786
trading_enums.ExchangeConstantsOrderColumns.ID.value
787-
]
787+
] if now_selling else None # don't double count PNL: only record entries on sell orders
788788
if self.flat_increment is None:
789789
details = "self.flat_increment is unset"
790790
if self.symbol_market is None:

Trading/Mode/staggered_orders_trading_mode/tests/test_staggered_orders_trading_mode.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ async def test_order_fill_callback():
10611061
assert len(open_orders) == producer.operational_depth
10621062
assert to_fill_order not in open_orders
10631063
newly_created_buy_order = open_orders[-1]
1064-
assert newly_created_buy_order.associated_entry_ids == [to_fill_order.order_id]
1064+
assert newly_created_buy_order.associated_entry_ids is None # buy order => previous sell order is not an entry
10651065
assert newly_created_buy_order.symbol == to_fill_order.symbol
10661066
price = to_fill_order.origin_price - (price_spread - price_increment)
10671067
assert newly_created_buy_order.origin_price == trading_personal_data.decimal_trunc_with_n_decimal_digits(price, 8)
@@ -1106,7 +1106,7 @@ async def test_order_fill_callback():
11061106
assert len(open_orders) == producer.operational_depth
11071107
assert to_fill_order not in open_orders
11081108
newly_created_buy_order = open_orders[-1]
1109-
assert newly_created_buy_order.associated_entry_ids == [to_fill_order.order_id]
1109+
assert newly_created_buy_order.associated_entry_ids is None # buy order => previous sell order is not an entry
11101110
assert newly_created_buy_order.symbol == to_fill_order.symbol
11111111
price = to_fill_order.origin_price - (price_spread - price_increment)
11121112
assert newly_created_buy_order.origin_price == trading_personal_data.decimal_trunc_with_n_decimal_digits(price, 8)
@@ -1835,7 +1835,7 @@ async def test_create_mirror_order():
18351835
assert sell_1.side == trading_enums.TradeOrderSide.SELL
18361836
sell_1_mirror_order = producer._create_mirror_order(sell_1.to_dict())
18371837
assert isinstance(sell_1_mirror_order, staggered_orders_trading.OrderData)
1838-
assert sell_1_mirror_order.associated_entry_id == sell_1.order_id
1838+
assert sell_1_mirror_order.associated_entry_id is None
18391839
assert sell_1_mirror_order.side == trading_enums.TradeOrderSide.BUY
18401840
assert sell_1_mirror_order.symbol == symbol
18411841
assert sell_1_mirror_order.price == decimal.Decimal("101") == sell_1.origin_price - buy_sell_increment
@@ -1849,6 +1849,7 @@ async def test_create_mirror_order():
18491849
assert isinstance(buy_2_mirror_order, staggered_orders_trading.OrderData)
18501850
# mirror order price is still 99, even if fill price is not 97
18511851
assert buy_2_mirror_order.price == decimal.Decimal("99") == buy_1.origin_price + buy_sell_increment
1852+
assert buy_2_mirror_order.associated_entry_id == buy_1.order_id
18521853
assert buy_2_mirror_order.side == trading_enums.TradeOrderSide.SELL
18531854
# new sell order quantity is equal to previous mirror order quantity: only the amount of USDT spend is smaller
18541855
assert buy_2_mirror_order.quantity == buy_1_mirror_order.quantity
@@ -1865,6 +1866,7 @@ async def test_create_mirror_order():
18651866
assert maybe_trade.origin_price == decimal.Decimal("103")
18661867
assert maybe_order is None
18671868
sell_2_mirror_order = producer._create_mirror_order(sell_1.to_dict())
1869+
assert sell_2_mirror_order.associated_entry_id is None
18681870
# mirror order price is still 101, even if fill price is not 110
18691871
assert sell_2_mirror_order.price == decimal.Decimal("101") == sell_1.origin_price - buy_sell_increment
18701872
assert sell_2_mirror_order.side == trading_enums.TradeOrderSide.BUY

0 commit comments

Comments
 (0)