fix bug
This commit is contained in:
@@ -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}
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 = "大盘信号不允许"
|
||||||
|
|||||||
Reference in New Issue
Block a user