feat client.

This commit is contained in:
2026-08-31 13:00:22 +08:00
parent a946c5b53d
commit 1b6f5a9f03
33 changed files with 544 additions and 1284 deletions

View File

@@ -10,7 +10,9 @@ import time
from datetime import datetime
import config
from libs import init_signals, market_allow_open, trading_time
from libs.calc import trading_time
from libs.market import market_allow_open
from libs.signal import init_signals, SignalItem
from sdk import Client
from libs.grid_take_profit import GridTrailingTracker
from .state import State
@@ -113,16 +115,18 @@ def StartTrend() -> None:
time.sleep(max(0.0, 30.0 - elapsed))
def RunOnce(run: Runtime, signals) -> None:
def RunOnce(run: Runtime, signals:list[SignalItem]) -> None:
"""按固定步骤执行一轮趋势策略, ``RunOnce``。"""
if not trading_time(datetime.now()):
return
# 1. 取消超过有效期仍未完成的委托订单。
# 1. 刷新订单数据,清理过期订单。
try:
run.orders.refresh(run.client)
except Exception:
logging.exception("取消过期订单失败")
return
# 2. 验证可用资金;低于资金安全线时禁止开新仓。
try:
@@ -144,37 +148,25 @@ def RunOnce(run: Runtime, signals) -> None:
logging.exception("获取持仓失败")
return
# 每轮使用最新委托和成交恢复状态。查询或落盘失败时禁止继续开仓,
# 避免在订单结果不明确的情况下提交重复买单。
previous_state_codes = set(run.state.codes)
# 5. 更新状态机
try:
broker_orders = run.client.trade_detail_data("order")
run.state.reconcile(positions, broker_orders)
run.state.reconcile(positions, run.orders.data)
except Exception:
logging.exception("订单状态对账失败,本轮禁止自动交易")
return
removed_codes = previous_state_codes - set(run.state.codes)
for code in removed_codes:
run.open_watch.forget(code)
run.add_watch.forget(code)
# 5. 验证有效开仓信号:排除已有持仓和未决订单。
position_code_set = set(position_codes)
allow_open = []
seen_codes = position_code_set | set(run.state.unresolved_codes)
# 6. 验证有效开仓信号:排除已有持仓和未决订单。
allow_open: list[SignalItem] = []
allow_codes: list[str] = []
for signal in signals:
if signal.code not in seen_codes:
if signal.code not in position_codes:
allow_open.append(signal)
seen_codes.add(signal.code)
allow_codes.append(signal.code)
# 6. 获取持仓和待开仓证券的实时行情 tick。
all_codes = list(position_codes)
all_codes.extend(
signal.code for signal in allow_open if signal.code not in position_code_set
)
all_codes = allow_codes + position_codes
try:
ticks = run.client.full_tick(list(dict.fromkeys(all_codes)))
ticks = run.client.full_tick(all_codes)
except Exception:
logging.exception("获取行情失败")
return