Document manual hub close flow, trade_records vs strategy snapshots, DCA display rules, backfill script, and deployment checklist. Co-authored-by: Cursor <cursoragent@cursor.com>
6.5 KiB
趋势回调:中控平仓与交易记录(检阅备忘)
本文档汇总 中控手动结束趋势计划、交易记录 / 策略记录 写入规则,以及 四所展示统一、补仓表计价 相关修复,便于自行检阅与排错。
适用仓库:crypto_monitor(Binance / OKX / Gate / Gate Bot + manual_trading_hub)。
1. 中控手动平仓会不会写交易记录?
会。 在实例已部署 80226ee 及之后 代码并 重启对应 Flask 的前提下:
中控点击 「结束计划」 → 实例执行市价平仓 + 结束计划 → 同时写入:
| 目标 | 表 | 页面入口 |
|---|---|---|
| 策略记录 | strategy_trade_snapshots |
顶栏 策略交易记录 → 左栏「趋势回调记录」 |
| 交易记录 | trade_records |
顶栏 交易记录与复盘 |
手动结束的结果字段为 「手动平仓」(亏损时也不会被改成「止损」)。
2. 调用链(四所统一)
manual_trading_hub
POST /api/trend/{exchange_id}/stop
→ 实例 POST /api/hub/trend/stop/{plan_id}
→ stop_trend_pullback(pid)
→ 市价平仓 + 撤单
→ _finalize_plan(cfg, conn, row, "手动平仓", exit_price)
共用实现:strategy_trend_register.py(四所同一套,Gate Bot 的 stop_trend_pullback 也调用 _finalize_plan)。
3. _finalize_plan 写入顺序(修复后)
- 写 策略快照
save_trend_plan_snapshot→strategy_trade_snapshots - 撤该品种挂单
- 若尚无
trade_records.trend_plan_id = 计划ID:- 更新当日 session 资金
insert_trade_record写入交易记录
- 更新
trend_pullback_plans.status(stopped_manual/stopped_sl/stopped_tp) conn.commit()一次提交
要点:先写交易记录,再结束计划,避免「计划已结束、交易记录未写入」的半成功状态。
4. 曾出现的 Bug(#4 ONDO 漏记)
现象:策略记录有(止损 -2.71U),交易记录没有。
原因:Gate Bot 的 insert_trade_record 曾 缺少 entry_reason 参数,而 _finalize_plan 固定传入 entry_reason="趋势回调",触发:
TypeError: insert_trade_record() got an unexpected keyword argument 'entry_reason'
策略快照在异常 之前 已插入,交易记录插入失败,故只出现在策略记录页。
修复提交:80226ee
- Gate Bot
insert_trade_record增加entry_reason _call_insert_trade_record:按各所函数 签名过滤 参数,避免未知字段导致失败- 调整写入顺序:交易记录 → 计划结束 → commit
5. 历史漏记补录
对已结束、策略快照在、交易记录缺的计划(如 #4):
cd /opt/crypto_monitor # 或本机仓库根目录
# 先预览
python scripts/backfill_trend_trade_records.py \
--db crypto_monitor_gate_bot/crypto.db --dry-run
# 确认后写入
python scripts/backfill_trend_trade_records.py \
--db crypto_monitor_gate_bot/crypto.db --apply
其它所将 --db 换成对应 crypto.db 路径即可。
6. 与「保本移交」的区别
| 操作 | 策略记录 | 交易记录 |
|---|---|---|
| 中控 结束计划(手动平仓) | 计划结束时写入 | 同一时刻写入 |
| 保本移交 | 移交时写入策略快照 | 不立即写;持仓移交到 order_monitors,后续平仓 再写入 trade_records |
7. 四所展示统一(中控 ↔ 实例)
7.1 数据 enrich 入口
| 场景 | 函数 |
|---|---|
| 实例策略页 | enrich_trend_plan |
中控 /api/hub/monitor |
enrich_trend_plan_for_hub → 同上 |
| 补仓明细表 | attach_trend_dca_levels → enrich_trend_dca_levels_with_tp |
Gate Bot 在 hub_bridge 安装后调用 patch_trend_hub_enrich,与另外三所 install_strategy_trend 行为一致。
7.2 补仓表「触发价 / 加仓后均价」
禁止为凑均价 反推虚构成交价(曾错误出现做多补仓触发价 0.3941 等离谱数值)。
trend_leg_display_price(四所唯一口径):
| 列 | 规则 |
|---|---|
| 触发价 | leg_fill_prices_json 有记录 → 实际成交价;无记录 → 计划网格价 |
| 末档已补仓的加仓后均价 | 与顶部均价一致,取 交易所持仓 entry_price(avg_entry_price) |
| 顶部均价 | 优先交易所 live entry_price,非计划库内估算值 |
修复提交:08082eb(移除反推成交价逻辑)。
7.3 中控静态页
manual_trading_hub/static/app.js:趋势浮盈亏计算 优先 trendPlan.avg_entry_price,与计划卡一致。
8. 部署与自检
8.1 升级
cd /opt/crypto_monitor
git pull # 需含 80226ee、08082eb
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate crypto-monitor-gate-bot manual-trading-hub
pm2 save
8.2 手动平仓后自检
- 中控结束一笔测试计划(或极小仓位)
- 策略交易记录:出现对应条目
- 交易记录与复盘:出现
类型=趋势回调、结果=手动平仓,且trend_plan_id与计划 ID 一致 - 若实例 flash / 日志出现「计划已结束但记账可能不完整」,说明
insert_trade_record仍失败,需查 PM2 日志
8.3 相关代码文件
| 文件 | 作用 |
|---|---|
strategy_trend_register.py |
_finalize_plan、_call_insert_trade_record、enrich_trend_plan |
strategy_trend_lib.py |
trend_leg_display_price、enrich_trend_dca_levels_with_tp |
strategy_snapshot_lib.py |
策略快照写入 |
hub_bridge.py |
/api/hub/trend/stop/<pid> |
crypto_monitor_gate_bot/app.py |
insert_trade_record(含 entry_reason) |
scripts/backfill_trend_trade_records.py |
漏记交易记录补录 |
8.4 相关提交
| 提交 | 说明 |
|---|---|
6a4ec69 |
中控与四所趋势展示 enrich 统一 |
08082eb |
移除补仓表反推虚构成交价 |
80226ee |
修复 Gate Bot 中控平仓漏写 trade_records |
9. 相关文档
| 文档 | 内容 |
|---|---|
| 策略交易说明.md | 策略总览、策略交易记录页 |
| crypto_monitor_gate_bot/趋势回调策略说明.md | 趋势回调业务细则 |
| manual_trading_hub/使用说明.md | 中控监控与趋势卡布局 |
最后整理:2026-06-07(与对话中修复项同步)