From ab703e93bab82b67b6366e00ce2e87cab5ed9028 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Wed, 8 Jul 2026 07:02:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(matcher):=20=E9=9B=86=E5=90=88=E7=AB=9E?= =?UTF-8?q?=E4=BB=B7CALL=5FAUCTION=E6=92=AE=E5=90=88(=E5=88=86=E6=9C=9F?= =?UTF-8?q?=E9=A1=B9)=E2=80=94=E5=BC=80=E7=9B=98=E4=BB=B7(=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E6=88=90=E4=BA=A4=E9=87=8F=E5=8E=9F=E5=88=99=E2=86=92?= =?UTF-8?q?open)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CALL_AUCTION枚举原拒单(unsupported), 现撮合用开盘价(open, 集合竞价确定开盘价). 当前定价同NEXT_OPEN(均为open); 未来区分开盘/尾盘集合竞价需扩枚举. test: call_auction fills@open(原rejected用例改). --- sanguo_trader/matcher.py | 4 ++++ tests/trader/test_matcher.py | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sanguo_trader/matcher.py b/sanguo_trader/matcher.py index 3f19e8f..7640776 100644 --- a/sanguo_trader/matcher.py +++ b/sanguo_trader/matcher.py @@ -72,6 +72,10 @@ def cross_order( fill_price = float(match_bar["open"]) elif order.match_session == MatchSession.CURRENT_CLOSE: fill_price = float(match_bar["close"]) + elif order.match_session == MatchSession.CALL_AUCTION: + # 集合竞价开盘价(最大成交量原则 → open)。当前同 NEXT_OPEN 定价; + # 未来区分开盘/尾盘集合竞价需扩枚举(CALL_AUCTION_OPEN/CLOSE)。 + fill_price = float(match_bar["open"]) else: return PaperReject( order.strategy_id, symbol, "unsupported_match_session", bar_date diff --git a/tests/trader/test_matcher.py b/tests/trader/test_matcher.py index cd6d019..4a115c7 100644 --- a/tests/trader/test_matcher.py +++ b/tests/trader/test_matcher.py @@ -110,11 +110,12 @@ def test_st_5pct_limit_up(): assert isinstance(r, PaperReject) and r.reason == "limit_up_locked" -def test_call_auction_session_rejected(): - """CALL_AUCTION 首版预留,不支持。""" +def test_call_auction_fills_at_open(): + """集合竞价撮合用开盘价(最大成交量原则 → open,分期项)。""" o = buy(market=True, session=MatchSession.CALL_AUCTION) - r = cross_order(o, mkbar(10.5, 11, 10.2, 10.8), PREV, CFG) - assert isinstance(r, PaperReject) and r.reason == "unsupported_match_session" + t = cross_order(o, mkbar(10.5, 11, 10.2, 10.8), PREV, CFG) + assert isinstance(t, PaperTrade) + assert t.price == 10.5 # 集合竞价开盘价 = open # ---- 限价单触价 ----