fix(risk): trigger cooldown only on user-initiated closes

Remove external-close risk hooks; register user_instance, user_hub, and user_trend_stop via hub API and trend stop; update docs and tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-17 19:14:05 +08:00
parent 850ffcd7d2
commit b6acbf4b2c
14 changed files with 423 additions and 131 deletions
-1
View File
@@ -133,7 +133,6 @@ DAILY_OPEN_HARD_LIMIT=0
# =============================================================================
# RISK_CONTROL_ENABLED=true
# RISK_COOLING_HOURS_MANUAL=4
# RISK_COOLING_HOURS_EXTERNAL=4
# RISK_COOLING_HOURS_MANUAL_JOURNAL=1
# RISK_MANUAL_CLOSE_DAILY_LIMIT=2
# RISK_MOOD_ISSUES_DAILY_FREEZE=true
+36 -12
View File
@@ -1549,6 +1549,28 @@ def hub_account_risk_status(conn):
)
def hub_user_initiated_close(
conn,
*,
source,
count=1,
trade_record_id=None,
closed_at_ms=None,
):
from account_risk_lib import CLOSE_SOURCE_USER_HUB, on_user_initiated_close
src = (source or "").strip() or CLOSE_SOURCE_USER_HUB
on_user_initiated_close(
conn,
source=src,
trade_record_id=trade_record_id,
closed_at_ms=closed_at_ms,
trading_day=get_trading_day(),
now=app_now(),
count=count,
)
def app_now():
"""应用本地时区当前墙钟时间(无时区的 datetime,便于与库中字符串直接比较)。"""
return datetime.now(APP_TZ).replace(tzinfo=None)
@@ -4430,16 +4452,6 @@ def reconcile_external_closes(conn, days=None):
opened_at=opened_at,
closed_at=closed_at,
)
from account_risk_lib import on_external_close, should_apply_external_close_risk
if should_apply_external_close_risk(result):
close_ms = _to_ms_with_fallback(None, closed_at)
on_external_close(
conn,
closed_at_ms=close_ms,
trading_day=session_date,
now=app_now(),
)
conn.execute("UPDATE order_monitors SET status='stopped' WHERE id=?", (r["id"],))
clear_key_sizing_snapshot_if_flat(conn, r["session_date"] or get_trading_day())
if result in ("止盈", "止损", "保本止盈", "移动止盈", "手动平仓", "强制清仓"):
@@ -8642,10 +8654,11 @@ def del_order(id):
opened_at=opened_at,
closed_at=closed_at,
)
from account_risk_lib import insert_trade_record_id, on_manual_close
from account_risk_lib import CLOSE_SOURCE_USER_INSTANCE, insert_trade_record_id, on_user_initiated_close
on_manual_close(
on_user_initiated_close(
conn,
source=CLOSE_SOURCE_USER_INSTANCE,
trade_record_id=insert_trade_record_id(conn),
closed_at_ms=_to_ms_with_fallback(closed_at_ms, closed_at),
trading_day=session_date,
@@ -8708,6 +8721,16 @@ def del_order(id):
opened_at=opened_at,
closed_at=closed_at,
)
from account_risk_lib import CLOSE_SOURCE_USER_INSTANCE, insert_trade_record_id, on_user_initiated_close
on_user_initiated_close(
conn,
source=CLOSE_SOURCE_USER_INSTANCE,
trade_record_id=insert_trade_record_id(conn),
closed_at_ms=_to_ms_with_fallback(None, closed_at),
trading_day=session_date,
now=app_now(),
)
conn.execute("UPDATE order_monitors SET status='stopped' WHERE id=?", (id,))
conn.commit()
conn.close()
@@ -9366,6 +9389,7 @@ try:
ohlcv_fn=_hub_fetch_ohlcv,
volume_rank_fn=_hub_fetch_volume_rank,
risk_status_fn=hub_account_risk_status,
user_close_fn=hub_user_initiated_close,
)
except Exception as _hub_err:
print(f"[hub_bridge] binance: {_hub_err}")