From ea736acb29f791478045f6169c61c99d9e194679 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Fri, 14 Aug 2026 20:04:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(shadow):=20ShadowBroker=E8=A1=A5LiveEngine?= =?UTF-8?q?=200.9.2=E5=8D=8F=E8=AE=AE=E6=96=B9=E6=B3=95(supports=5Faccount?= =?UTF-8?q?=5Fsync/cleanup=E7=AD=895=E4=B8=AA);VPS=E5=AE=9E=E5=86=B5=3D?= =?UTF-8?q?=E5=BD=B1=E5=AD=90=E8=BF=9B=E7=A8=8B=E5=90=AF=E5=8A=A8=E5=8D=B3?= =?UTF-8?q?=E5=B4=A9=E8=BF=9B=E5=B4=A9=E6=BA=83=E5=BE=AA=E7=8E=AF(?= =?UTF-8?q?=E5=BC=95=E6=93=8E=5Fstart=5Fbackground=5Fjobs=E6=97=A0?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=B0=83supports=5Faccount=5Fsync);=E5=8A=A0?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E5=AE=8C=E6=95=B4=E6=80=A7=E9=98=B2=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E6=B5=8B=E8=AF=95=20[vps]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanguo_trader/shadow/broker.py | 17 +++++++++++++++++ tests/trader/test_shadow_broker.py | 19 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/sanguo_trader/shadow/broker.py b/sanguo_trader/shadow/broker.py index def338f..77ca58c 100644 --- a/sanguo_trader/shadow/broker.py +++ b/sanguo_trader/shadow/broker.py @@ -68,6 +68,23 @@ class ShadowBroker: # noqa: R0903 - 仅实现 BrokerBase 协议(bullet_trade du def heartbeat(self) -> None: return None + # ===== LiveEngine 0.9.2 兼容查询(本地柜台无外部账户/委托可同步) ===== + # 引擎 _start_background_jobs 无条件调 supports_account_sync(),缺方法=启动即崩 + def supports_account_sync(self) -> bool: + return False + + def supports_orders_sync(self) -> bool: + return False + + def sync_account(self) -> None: + return None + + def sync_orders(self) -> list: + return [] + + def cleanup(self) -> None: # 引擎关闭时无条件调 + return None + def before_open(self) -> None: """每个交易日开盘前:清 T+1 买入记录(昨日买的今天可卖)。""" self._today_bought = {} diff --git a/tests/trader/test_shadow_broker.py b/tests/trader/test_shadow_broker.py index 207f1fa..00c0af7 100644 --- a/tests/trader/test_shadow_broker.py +++ b/tests/trader/test_shadow_broker.py @@ -133,3 +133,22 @@ def test_cancel_always_false_and_open_orders_empty(): _buy(b, "600519.SH", 100, px=100.0) assert asyncio.run(b.cancel_order("whatever")) is False assert b.get_open_orders() == [] # 即时成交,无挂单 + + +def test_live_engine_protocol_compat(): + """LiveEngine 0.9.2 duck-typed 协议完整性(2026-08-14 VPS 实况教训: + 缺 supports_account_sync → 引擎 _start_background_jobs 启动即崩,影子进程崩溃循环)。""" + from sanguo_trader.shadow.broker import ShadowBroker + b = ShadowBroker() + for attr in ( + "connect", "disconnect", "is_connected", "heartbeat", + "before_open", "after_close", "cleanup", + "supports_account_sync", "supports_orders_sync", + "sync_account", "sync_orders", + "get_account_info", "get_positions", "get_open_orders", + ): + assert hasattr(b, attr), f"LiveEngine 需要 broker.{attr}, ShadowBroker 缺失" + assert b.supports_account_sync() is False # 本地柜台,引擎跳过账户同步 + assert b.supports_orders_sync() is False + assert b.sync_orders() == [] + b.cleanup() # 不抛异常