feat(trend): 趋势回调保本移交下单监控并统一写交易记录

保本后结束趋势计划,持仓转入下单监控(备注趋势回调),交易所同时挂保本止损与计划止盈;中控或交易所平仓均经下单监控写入交易记录(trend_plan_id、开仓类型),四所共用 strategy_trend_register。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-03 17:01:34 +08:00
parent d9b1b324f9
commit e2bf58cfd3
11 changed files with 334 additions and 102 deletions
+34
View File
@@ -1,6 +1,8 @@
"""策略交易写入 trade_records 时的类型与复盘开仓类型标注。"""
from __future__ import annotations
from typing import Optional
MONITOR_TYPE_TREND_PULLBACK = "趋势回调"
MONITOR_TYPE_ROLL = "顺势加仓"
@@ -12,6 +14,38 @@ STRATEGY_ENTRY_REASON_OPTIONS = (
ENTRY_REASON_ROLL,
)
# 趋势回调保本移交下单监控:order_monitors.key_signal_type / 平仓备注
TREND_HANDOFF_KEY_SIGNAL = ENTRY_REASON_TREND_PULLBACK
TREND_HANDOFF_TRADE_NOTE = "趋势回调计划"
def handoff_trade_miss_reason(miss_reason, row) -> Optional[str]:
"""趋势保本移交的监控单平仓:交易记录备注带来源。"""
if trend_plan_id_from_monitor_row(row) is None:
return miss_reason
base = (miss_reason or "").strip()
if TREND_HANDOFF_TRADE_NOTE in base:
return base or TREND_HANDOFF_TRADE_NOTE
if base:
return f"{TREND_HANDOFF_TRADE_NOTE}{base}"
return TREND_HANDOFF_TRADE_NOTE
def trend_plan_id_from_monitor_row(row) -> Optional[int]:
if row is None:
return None
try:
keys = row.keys() if hasattr(row, "keys") else []
except Exception:
keys = []
if "trend_plan_id" not in keys or row["trend_plan_id"] in (None, ""):
return None
try:
tid = int(row["trend_plan_id"])
return tid if tid > 0 else None
except (TypeError, ValueError):
return None
def order_had_roll_fills(conn, order_monitor_id) -> bool:
try: