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

@@ -7,18 +7,14 @@ from datetime import datetime
from libs import calc_buy_volume
from sdk import OP_BUY
from .runtime import Runtime
from .order import PlaceOrderRequest
from .state import STATUS_ING, StateItem
def open_signal(run, ticks, open_signals) -> None:
def open_signal(run:Runtime, ticks, open_signals) -> None:
"""逐个验证开仓信号并提交买入委托。"""
for item in open_signals:
# 候选生成后状态仍可能发生变化,提交前再次阻止未决订单重复开仓。
if run.state.has_unresolved_order(item.code):
continue
# 1. 验证信号配置允许开仓的时间区间。
signal_config = run.global_cfg.signals.get(item.signal_key)
if signal_config is None or not check_timezone(signal_config.timezone):
@@ -34,44 +30,44 @@ def open_signal(run, ticks, open_signals) -> None:
if price <= 0:
continue
# 4. 等待价格从观察低点反弹,防止直接接下跌中的“飞刀”。
if not run.open_watch.triggered("开仓", item.code, price):
continue
# 5. 根据单笔买入金额计算整手开仓数量。
volume = calc_buy_volume(price, run.account_cfg.buy_value)
if volume <= 0:
continue
# 6. 生成本地订单号并按最新价提交开仓委托。
order_id = run.orders.new_order_id("base")
request = PlaceOrderRequest(
run.client,
OP_BUY,
item.code,
volume,
order_id,
item.signal_key,
)
if not run.orders.place(request):
# 当前价高于昨收价可开仓
if signal_config.gt_last_price_is_open and item.last_close>0 and price>item.last_close:
try:
do_open(run,item.code,volume,item.signal_key)
logging.info("[开仓] %s 买入 %d", item.code, volume)
except Exception as e:
logging.exception("[开仓] %s 失败: %s", item.code,e)
continue
# 4. 等待价格从观察低点反弹,防止直接接下跌中的“飞刀”。
if not run.open_watch.triggered("开仓", item.code, price):
continue
# 7. 保存底仓订单、数量、成本和处理中状态。
run.state.set(
StateItem(
code=item.code,
base_order_id=order_id,
base_qty=volume,
base_cost=price,
base_status=STATUS_ING,
)
)
try:
run.state.save()
except OSError:
logging.exception("[状态] %s 开仓状态保存失败", item.code)
run.open_watch.forget(item.code)
logging.info("[ZT][开仓] %s 买入 %d", item.code, volume)
do_open(run,item.code,volume,item.signal_key)
logging.info("[开仓] %s 买入 %d", item.code, volume)
except Exception as e:
logging.exception("[开仓] %s 失败: %s", item.code,e)
def do_open(run:Runtime,code:str,volume:int,signal_key:str)->None:
"""生成本地订单号并按最新价提交开仓委托。"""
order_id = run.orders.new_order_id("base")
request = PlaceOrderRequest(
run.client,
OP_BUY,
code,
volume,
order_id,
signal_key,
)
if not run.orders.place(request):
raise RuntimeError("订单提交失败")
def check_timezone(timezone: str, now: datetime | None = None) -> bool: