This commit is contained in:
2026-09-05 14:30:16 +08:00
parent 2059f87fe5
commit ba1bd93afa
4 changed files with 7 additions and 20 deletions

View File

@@ -73,8 +73,3 @@ class GridTrailingTracker:
with self._lock: with self._lock:
self._peaks.pop(position_key, None) self._peaks.pop(position_key, None)
def retain(self, position_keys) -> None:
"""删除已不在券商持仓中的峰值,避免同代码重新开仓继承旧状态。"""
active = set(position_keys)
with self._lock:
self._peaks = {key: value for key, value in self._peaks.items() if key in active}

View File

@@ -81,7 +81,6 @@ def do_open(run: Runtime, code: str, volume: int, signal_key: str, price: float)
"""生成本地订单号并按最新价提交开仓委托。""" """生成本地订单号并按最新价提交开仓委托。"""
order_id = run.orders.new_order_id() order_id = run.orders.new_order_id()
request = PlaceOrderRequest( request = PlaceOrderRequest(
run.client,
OP_BUY, OP_BUY,
code, code,
volume, volume,
@@ -89,7 +88,7 @@ def do_open(run: Runtime, code: str, volume: int, signal_key: str, price: float)
signal_key, signal_key,
kind="base", kind="base",
) )
if not run.orders.place(request): if not run.orders.place(run.client,request):
raise RuntimeError("订单提交失败") raise RuntimeError("订单提交失败")
run.open_watch.forget(code) run.open_watch.forget(code)

View File

@@ -88,7 +88,7 @@ class OrderBook:
self.busy_keys = busy_keys self.busy_keys = busy_keys
logging.info("[Order] 刷新完成,跟踪=%d,处理中=%d,撤销=%d", len(data), len(busy_keys), canceled) logging.info("[Order] 刷新完成,跟踪=%d,处理中=%d,撤销=%d", len(data), len(busy_keys), canceled)
def place(self, request: PlaceOrderRequest) -> bool: def place(self, client: Client, request: PlaceOrderRequest) -> bool:
"""按最新价提交委托,并立即写入本地方向锁。""" """按最新价提交委托,并立即写入本地方向锁。"""
side = ORDER_SIDE_BY_OFFSET.get(str(request.op), "") side = ORDER_SIDE_BY_OFFSET.get(str(request.op), "")
if not side: if not side:
@@ -103,7 +103,7 @@ class OrderBook:
self.busy_cache.set(key, True, timeout=self.lock_timeout_sec) self.busy_cache.set(key, True, timeout=self.lock_timeout_sec)
try: try:
result = request.client.passorder( result = client.passorder(
op_type=request.op, op_type=request.op,
stock_code=request.code, stock_code=request.code,
volume=request.volume, volume=request.volume,

View File

@@ -31,17 +31,10 @@ def manage_positions(
market_ok: bool, market_ok: bool,
available: float, available: float,
) -> None: ) -> None:
"""处理所有真实持仓,并在本轮内统一控制补仓预算。""" # 遍历处理每个持仓
active_keys = {
_position_key(runtime, position.stock_code)
for position in positions
if position.volume > 0 and position.stock_code
}
runtime.profit_tracker.retain(active_keys)
remaining_cash = max(0.0, available)
for position in positions: for position in positions:
try: try:
available = max(0,0,available)
code = position.stock_code code = position.stock_code
tick = ticks.get(code) tick = ticks.get(code)
if code in runtime.account_cfg.excluded_codes: if code in runtime.account_cfg.excluded_codes:
@@ -77,9 +70,9 @@ def manage_positions(
position=position, position=position,
tick=tick, tick=tick,
pnl_rate=pnl_rate, pnl_rate=pnl_rate,
available=remaining_cash, available=available,
) )
remaining_cash -= loss_decision.reserved_cash available = available - loss_decision.reserved_cash
loss_add_action = loss_decision.message or "未触发" loss_add_action = loss_decision.message or "未触发"
elif runtime.account_cfg.enable_loss_add_position: elif runtime.account_cfg.enable_loss_add_position:
loss_add_action = "大盘信号不允许" loss_add_action = "大盘信号不允许"