106 lines
3.2 KiB
Python
106 lines
3.2 KiB
Python
|
|
from datetime import date
|
||
|
|
from decimal import Decimal
|
||
|
|
|
||
|
|
from grid_trading.domain.models import Account, Instrument, StrategyTemplate, Trade, TradeGroup, TradeSide
|
||
|
|
from grid_trading.storage.repositories import Repository
|
||
|
|
|
||
|
|
|
||
|
|
def test_database_round_trips_account_instrument_template_and_trade(tmp_path):
|
||
|
|
db_path = tmp_path / "grid.db"
|
||
|
|
repo = Repository(db_path)
|
||
|
|
repo.initialize()
|
||
|
|
|
||
|
|
account = repo.save_account(Account(id=None, name="主账户", initial_cash=Decimal("100000"), notes="first"))
|
||
|
|
template = repo.save_strategy_template(
|
||
|
|
StrategyTemplate(
|
||
|
|
id=None,
|
||
|
|
name="默认模板",
|
||
|
|
grid_spacing_pct=Decimal("0.03"),
|
||
|
|
amount_per_grid=Decimal("5000"),
|
||
|
|
base_target_amount=Decimal("20000"),
|
||
|
|
max_position_amount=Decimal("80000"),
|
||
|
|
min_lot=100,
|
||
|
|
is_default=True,
|
||
|
|
)
|
||
|
|
)
|
||
|
|
instrument = repo.save_instrument(
|
||
|
|
Instrument(
|
||
|
|
id=None,
|
||
|
|
code="510300",
|
||
|
|
name="沪深300ETF",
|
||
|
|
market="ETF",
|
||
|
|
lot_size=100,
|
||
|
|
manual_price=Decimal("3.95"),
|
||
|
|
)
|
||
|
|
)
|
||
|
|
trade = repo.save_trade(
|
||
|
|
Trade(
|
||
|
|
id=None,
|
||
|
|
account_id=account.id,
|
||
|
|
instrument_id=instrument.id,
|
||
|
|
trade_date=date(2026, 7, 8),
|
||
|
|
side=TradeSide.BUY,
|
||
|
|
price=Decimal("3.90"),
|
||
|
|
quantity=1000,
|
||
|
|
commission=Decimal("5"),
|
||
|
|
transfer_fee=Decimal("0.04"),
|
||
|
|
trade_group=TradeGroup.GRID,
|
||
|
|
notes="first buy",
|
||
|
|
)
|
||
|
|
)
|
||
|
|
repo.close()
|
||
|
|
|
||
|
|
reopened = Repository(db_path)
|
||
|
|
reopened.initialize()
|
||
|
|
|
||
|
|
assert reopened.list_accounts() == [account]
|
||
|
|
assert reopened.get_default_strategy_template() == template
|
||
|
|
assert reopened.list_instruments() == [instrument]
|
||
|
|
assert reopened.list_trades(account_id=account.id) == [trade]
|
||
|
|
|
||
|
|
|
||
|
|
def test_trade_update_and_delete_are_persistent(tmp_path):
|
||
|
|
repo = Repository(tmp_path / "grid.db")
|
||
|
|
repo.initialize()
|
||
|
|
account = repo.save_account(Account(id=None, name="主账户", initial_cash=Decimal("50000")))
|
||
|
|
instrument = repo.save_instrument(Instrument(id=None, code="600000", name="浦发银行"))
|
||
|
|
trade = repo.save_trade(
|
||
|
|
Trade(
|
||
|
|
id=None,
|
||
|
|
account_id=account.id,
|
||
|
|
instrument_id=instrument.id,
|
||
|
|
trade_date=date(2026, 7, 7),
|
||
|
|
side=TradeSide.BUY,
|
||
|
|
price=Decimal("10"),
|
||
|
|
quantity=100,
|
||
|
|
commission=Decimal("5"),
|
||
|
|
trade_group=TradeGroup.BASE,
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
updated = repo.save_trade(
|
||
|
|
Trade(
|
||
|
|
id=trade.id,
|
||
|
|
account_id=account.id,
|
||
|
|
instrument_id=instrument.id,
|
||
|
|
trade_date=date(2026, 7, 7),
|
||
|
|
side=TradeSide.BUY,
|
||
|
|
price=Decimal("9.8"),
|
||
|
|
quantity=200,
|
||
|
|
commission=Decimal("5"),
|
||
|
|
trade_group=TradeGroup.BASE,
|
||
|
|
notes="corrected",
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
assert repo.get_trade(trade.id) == updated
|
||
|
|
|
||
|
|
repo.close()
|
||
|
|
reopened = Repository(tmp_path / "grid.db")
|
||
|
|
reopened.initialize()
|
||
|
|
assert reopened.get_trade(trade.id) == updated
|
||
|
|
|
||
|
|
reopened.delete_trade(trade.id)
|
||
|
|
assert reopened.get_trade(trade.id) is None
|
||
|
|
assert reopened.list_trades(account_id=account.id) == []
|