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
+24 -8
View File
@@ -50,7 +50,9 @@ from fib_key_monitor_lib import (
from strategy_trade_labels import (
STRATEGY_ENTRY_REASON_OPTIONS,
entry_reason_for_monitor_type,
handoff_trade_miss_reason,
trade_record_monitor_type as resolve_trade_record_monitor_type,
trend_plan_id_from_monitor_row,
)
from journal_chart_lib import (
JOURNAL_CHART_DEFAULT_LIMIT,
@@ -3999,6 +4001,7 @@ def reconcile_external_closes(conn, days=None):
conn,
symbol=r["symbol"],
monitor_type=trade_record_monitor_type(conn, r),
trend_plan_id=trend_plan_id_from_monitor_row(r),
key_signal_type=order_row_key_signal_type(r),
direction=r["direction"],
trigger_price=r["trigger_price"],
@@ -4014,7 +4017,7 @@ def reconcile_external_closes(conn, days=None):
planned_rr=calc_rr_ratio(r["direction"], r["trigger_price"], r["initial_stop_loss"] or r["stop_loss"], r["take_profit"]),
actual_rr=calc_actual_rr(pnl_amount, r["risk_amount"]),
result=result,
miss_reason=miss_reason,
miss_reason=handoff_trade_miss_reason(miss_reason, r),
opened_at=opened_at,
closed_at=closed_at,
)
@@ -5380,6 +5383,7 @@ def check_order_monitors():
conn,
symbol=sym,
monitor_type=trade_record_monitor_type(conn, r),
trend_plan_id=trend_plan_id_from_monitor_row(r),
key_signal_type=order_row_key_signal_type(r),
direction=direction,
trigger_price=trigger_price,
@@ -5395,7 +5399,10 @@ def check_order_monitors():
planned_rr=calc_rr_ratio(direction, trigger_price, r["initial_stop_loss"] or stop_loss, take_profit),
actual_rr=calc_actual_rr(pnl_amount, r["risk_amount"]),
result=res,
miss_reason="触发价已触达,仓位已由交易所止盈/止损或其他方式平掉(本地补记)",
miss_reason=handoff_trade_miss_reason(
"触发价已触达,仓位已由交易所止盈/止损或其他方式平掉(本地补记)",
r,
),
opened_at=opened_at,
closed_at=closed_at,
)
@@ -5439,6 +5446,7 @@ def check_order_monitors():
conn,
symbol=sym,
monitor_type=trade_record_monitor_type(conn, r),
trend_plan_id=trend_plan_id_from_monitor_row(r),
key_signal_type=order_row_key_signal_type(r),
direction=direction,
trigger_price=trigger_price,
@@ -5454,7 +5462,7 @@ def check_order_monitors():
planned_rr=calc_rr_ratio(direction, trigger_price, r["initial_stop_loss"] or stop_loss, take_profit),
actual_rr=calc_actual_rr(record_pnl, r["risk_amount"]),
result=record_res,
miss_reason=record_miss,
miss_reason=handoff_trade_miss_reason(record_miss, r),
opened_at=opened_at,
closed_at=record_closed,
)
@@ -5518,6 +5526,7 @@ def check_order_monitors():
conn,
symbol=sym,
monitor_type=trade_record_monitor_type(conn, r),
trend_plan_id=trend_plan_id_from_monitor_row(r),
key_signal_type=order_row_key_signal_type(r),
direction=direction,
trigger_price=trigger_price,
@@ -5533,6 +5542,7 @@ def check_order_monitors():
planned_rr=calc_rr_ratio(direction, trigger_price, r["initial_stop_loss"] or stop_loss, take_profit),
actual_rr=calc_actual_rr(pnl_amount, r["risk_amount"]),
result=res,
miss_reason=handoff_trade_miss_reason(None, r),
opened_at=opened_at,
closed_at=closed_at,
)
@@ -5585,6 +5595,7 @@ def force_close_before_reset():
conn,
symbol=r["symbol"],
monitor_type=trade_record_monitor_type(conn, r),
trend_plan_id=trend_plan_id_from_monitor_row(r),
key_signal_type=order_row_key_signal_type(r),
direction=direction,
trigger_price=trigger_price,
@@ -5600,7 +5611,10 @@ def force_close_before_reset():
planned_rr=calc_rr_ratio(direction, trigger_price, r["initial_stop_loss"] or r["stop_loss"], r["take_profit"]),
actual_rr=calc_actual_rr(pnl_amount, r["risk_amount"]),
result="强制清仓",
miss_reason=f"北京时间 {FORCE_CLOSE_BJ_HOUR}:00 整点风控清仓",
miss_reason=handoff_trade_miss_reason(
f"北京时间 {FORCE_CLOSE_BJ_HOUR}:00 整点风控清仓",
r,
),
opened_at=opened_at,
closed_at=closed_at,
)
@@ -7304,6 +7318,7 @@ def del_order(id):
conn,
symbol=row["symbol"],
monitor_type=trade_record_monitor_type(conn, row),
trend_plan_id=trend_plan_id_from_monitor_row(row),
key_signal_type=order_row_key_signal_type(row),
direction=row["direction"],
trigger_price=row["trigger_price"],
@@ -7319,7 +7334,7 @@ def del_order(id):
planned_rr=calc_rr_ratio(row["direction"], row["trigger_price"], row["initial_stop_loss"] or row["stop_loss"], row["take_profit"]),
actual_rr=calc_actual_rr(pnl_amount, row["risk_amount"]),
result="手动平仓",
miss_reason="用户手动删除订单触发平仓",
miss_reason=handoff_trade_miss_reason("用户手动删除订单触发平仓", row),
opened_at=opened_at,
closed_at=closed_at,
)
@@ -7359,8 +7374,9 @@ def del_order(id):
insert_trade_record(
conn,
symbol=row["symbol"],
monitor_type=trade_record_monitor_type(conn, row),
key_signal_type=order_row_key_signal_type(row),
monitor_type=trade_record_monitor_type(conn, row),
trend_plan_id=trend_plan_id_from_monitor_row(row),
key_signal_type=order_row_key_signal_type(row),
direction=row["direction"],
trigger_price=row["trigger_price"],
stop_loss=row["stop_loss"],
@@ -7375,7 +7391,7 @@ def del_order(id):
planned_rr=calc_rr_ratio(row["direction"], row["trigger_price"], row["initial_stop_loss"] or row["stop_loss"], row["take_profit"]),
actual_rr=calc_actual_rr(pnl_amount, row["risk_amount"]),
result=result,
miss_reason=miss_reason,
miss_reason=handoff_trade_miss_reason(miss_reason, row),
opened_at=opened_at,
closed_at=closed_at,
)