fix: 中控改委托后同步计划价并去重条件单展示
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
"""中控改委托同步与条件单按角色去重。"""
|
||||
|
||||
from lib.hub.hub_order_sync_lib import (
|
||||
cond_order_role,
|
||||
dedupe_conditional_orders_by_role,
|
||||
exchange_tpsl_from_cond_orders,
|
||||
sync_active_monitor_tpsl_prices,
|
||||
)
|
||||
from lib.hub.hub_symbol_lib import symbols_match
|
||||
|
||||
|
||||
def test_cond_order_role():
|
||||
assert cond_order_role({"label": "止损 84.1"}) == "sl"
|
||||
assert cond_order_role({"label": "止盈 76"}) == "tp"
|
||||
assert cond_order_role({"label": "市价 买入"}) is None
|
||||
|
||||
|
||||
def test_dedupe_conditional_orders_by_role_keeps_one_sl():
|
||||
rows = [
|
||||
{"label": "止盈 76", "trigger_price": 76},
|
||||
{"label": "止损", "trigger_price": 84.1},
|
||||
{"label": "止损 84.1", "trigger_price": 84.1, "id": "x:sl"},
|
||||
]
|
||||
out = dedupe_conditional_orders_by_role(rows)
|
||||
assert len(out) == 2
|
||||
sl_rows = [r for r in out if cond_order_role(r) == "sl"]
|
||||
assert len(sl_rows) == 1
|
||||
assert sl_rows[0]["label"] == "止损 84.1"
|
||||
|
||||
|
||||
def test_exchange_tpsl_from_cond_orders():
|
||||
cond = [
|
||||
{"label": "止损 84.1", "trigger_price": 84.1, "algo_id": "1"},
|
||||
{"label": "止盈 76", "trigger_price": 76, "algo_id": "1"},
|
||||
]
|
||||
et = exchange_tpsl_from_cond_orders(cond)
|
||||
assert et["sl"]["trigger_price"] == 84.1
|
||||
assert et["tp"]["trigger_price"] == 76
|
||||
|
||||
|
||||
def test_sync_active_monitor_tpsl_prices_updates_matching_order():
|
||||
class Row(dict):
|
||||
def __getitem__(self, key):
|
||||
return dict.get(self, key)
|
||||
|
||||
class Conn:
|
||||
def __init__(self):
|
||||
self.rows = [
|
||||
Row(
|
||||
id=5,
|
||||
symbol="SOL/USDT:USDT",
|
||||
exchange_symbol="SOL/USDT:USDT",
|
||||
direction="short",
|
||||
)
|
||||
]
|
||||
self.updates = []
|
||||
|
||||
def execute(self, sql, params=None):
|
||||
if "SELECT" in sql:
|
||||
return self
|
||||
if "UPDATE" in sql and params:
|
||||
self.updates.append(params)
|
||||
return self
|
||||
|
||||
def fetchall(self):
|
||||
return self.rows
|
||||
|
||||
conn = Conn()
|
||||
out = sync_active_monitor_tpsl_prices(
|
||||
conn, "SOL/USDT:USDT", "short", 85.0, 75.0, symbols_match=symbols_match
|
||||
)
|
||||
assert out["ok"] is True
|
||||
assert out["updated"] == 1
|
||||
assert conn.updates == [(85.0, 75.0, 5)]
|
||||
Reference in New Issue
Block a user