fix zt
This commit is contained in:
@@ -15,7 +15,7 @@ from libs.runtime import Runtime
|
||||
from libs.signal import SignalItem, init_signals
|
||||
from libs.state import State
|
||||
from libs.watch import DipWatch
|
||||
from sdk import Client
|
||||
from sdk import Client, DealItem, PositionItem
|
||||
from .open import open_signal
|
||||
from .positions import manage_positions
|
||||
from libs.snapshot import cache_portfolio
|
||||
@@ -55,7 +55,7 @@ def StartZT() -> None:
|
||||
log.info('[启动] ZT策略已启动,账户=%s,信号=%d,持仓=%d',
|
||||
config.account_config.account_id, len(signals), len(positions))
|
||||
cache_portfolio(config.account_config.account_id, assets, positions, deals)
|
||||
state.sync_account(positions, deals, initialize=initialize)
|
||||
_sync_state(state, positions, deals, initialize=initialize)
|
||||
run.profit_tracker.sync_positions(positions, state)
|
||||
run.orders.refresh(client, portfolio.orders, cancel_prefix='zt-')
|
||||
Overview(assets, positions, config.account_config)
|
||||
@@ -94,6 +94,26 @@ def StartZT() -> None:
|
||||
client.close()
|
||||
|
||||
|
||||
def _sync_state(state: State, positions: list[PositionItem], deals: list[DealItem],
|
||||
*, initialize: bool = False) -> None:
|
||||
"""使用 State 的独立接口同步,交易前核对归档结果与账户持仓。"""
|
||||
if initialize:
|
||||
state.sync_state(positions)
|
||||
state.sync_deals(deals)
|
||||
state.archiving()
|
||||
|
||||
holdings = {p.stock_code: p.volume for p in positions if p.volume > 0}
|
||||
blocked = {d.stock_code for d in deals if d.order_sys_id not in state.deals_sys_ids}
|
||||
blocked.update(d['stock_code'] for d in state.deals.values() if d['is_arch'] != 1)
|
||||
for code in state.state.keys() | holdings.keys():
|
||||
row = state.get_by_code(code)
|
||||
if row.get('base_qty', 0) + row.get('added_qty', 0) != holdings.get(code, 0):
|
||||
blocked.add(code)
|
||||
state.blocked_codes = blocked
|
||||
if blocked:
|
||||
log.warning('[ZT 同步] 状态待核对,暂停交易:%s', ', '.join(sorted(blocked)))
|
||||
|
||||
|
||||
def RunOnce(run: Runtime, state: State, signals: list[SignalItem]) -> None:
|
||||
now = datetime.now()
|
||||
if not trading_time(now):
|
||||
@@ -114,7 +134,7 @@ def RunOnce(run: Runtime, state: State, signals: list[SignalItem]) -> None:
|
||||
position_codes = list(portfolio.positions)
|
||||
cache_portfolio(run.account_cfg.account_id, assets, positions, deals)
|
||||
|
||||
state.sync_account(positions, deals)
|
||||
_sync_state(state, positions, deals)
|
||||
run.profit_tracker.sync_positions(positions, state)
|
||||
run.orders.refresh(run.client, portfolio.orders, cancel_prefix='zt-')
|
||||
except Exception:
|
||||
|
||||
Reference in New Issue
Block a user