feat(matcher): 集合竞价CALL_AUCTION撮合(分期项)—开盘价(最大成交量原则→open)

CALL_AUCTION枚举原拒单(unsupported), 现撮合用开盘价(open, 集合竞价确定开盘价).
当前定价同NEXT_OPEN(均为open); 未来区分开盘/尾盘集合竞价需扩枚举.
test: call_auction fills@open(原rejected用例改).
This commit is contained in:
2026-07-08 07:02:51 +08:00
parent 7eec983164
commit ab703e93ba
2 changed files with 9 additions and 4 deletions
+4
View File
@@ -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
+5 -4
View File
@@ -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
# ---- 限价单触价 ----