90 lines
2.2 KiB
Python
90 lines
2.2 KiB
Python
"""PaperAccount/Order/Trade/Reject 数据类测试。"""
|
|
from sanguo_trader.models import (
|
|
AccountConfig,
|
|
PaperOrder,
|
|
PaperTrade,
|
|
PaperReject,
|
|
MatchSession,
|
|
OrderSide,
|
|
)
|
|
|
|
|
|
def test_account_config_defaults():
|
|
cfg = AccountConfig(initial_capital=1_000_000)
|
|
assert cfg.initial_capital == 1_000_000
|
|
assert cfg.rate == 0.0003
|
|
assert cfg.min_commission == 5.0
|
|
assert cfg.stamp_duty_rate == 0.0005
|
|
assert cfg.transfer_fee_rate == 0.00001
|
|
assert cfg.slippage == 0
|
|
assert cfg.pricetick == 0.01
|
|
|
|
|
|
def test_account_config_is_frozen():
|
|
import dataclasses
|
|
|
|
cfg = AccountConfig(initial_capital=1_000_000)
|
|
assert dataclasses.is_dataclass(cfg)
|
|
# frozen=True → 不可变
|
|
try:
|
|
cfg.rate = 0.001 # type: ignore[misc]
|
|
except dataclasses.FrozenInstanceError:
|
|
pass
|
|
else:
|
|
raise AssertionError("AccountConfig 应为 frozen dataclass")
|
|
|
|
|
|
def test_paper_order_defaults_next_open():
|
|
o = PaperOrder(
|
|
strategy_id="s1",
|
|
symbol="600000",
|
|
side=OrderSide.BUY,
|
|
price=10.0,
|
|
volume=100,
|
|
is_market=True,
|
|
)
|
|
assert o.match_session == MatchSession.NEXT_OPEN
|
|
|
|
|
|
def test_paper_order_explicit_current_close():
|
|
o = PaperOrder(
|
|
strategy_id="s1",
|
|
symbol="600000",
|
|
side=OrderSide.SELL,
|
|
price=10.0,
|
|
volume=100,
|
|
is_market=False,
|
|
match_session=MatchSession.CURRENT_CLOSE,
|
|
)
|
|
assert o.match_session == MatchSession.CURRENT_CLOSE
|
|
assert o.is_market is False
|
|
|
|
|
|
def test_paper_trade_fields():
|
|
t = PaperTrade(
|
|
strategy_id="s1",
|
|
symbol="600000",
|
|
side=OrderSide.BUY,
|
|
price=10.0,
|
|
volume=100,
|
|
commission=5.0,
|
|
stamp_duty=0.0,
|
|
transfer_fee=0.01,
|
|
bar_date="2024-01-02",
|
|
match_session=MatchSession.NEXT_OPEN,
|
|
)
|
|
assert t.volume == 100
|
|
assert t.commission == 5.0
|
|
assert t.bar_date == "2024-01-02"
|
|
|
|
|
|
def test_paperReject_records_reason():
|
|
r = PaperReject(
|
|
strategy_id="s1",
|
|
symbol="600000",
|
|
reason="limit_up_locked",
|
|
bar_date="2024-01-02",
|
|
)
|
|
assert r.reason == "limit_up_locked"
|
|
assert r.symbol == "600000"
|