# 多执行器与信号转发 · 设计归档 本文档归档 2026-05 前后关于 **onchain_scout_gate(扫描端)** 与 **gate_order_executor(执行器)** 联动的讨论结论与已实现能力,便于后期检阅。 --- ## 1. 背景与目标 | 目标 | 说明 | |------|------| | **一套信号** | 扫描端在企微突破推送成功后,构造 **一份** 方案 A 止盈/止损 payload | | **多套账户** | 可向多个执行器进程广播,各绑不同 Gate API,用于盈亏比等规则的对照实验 | | **规则在执行器** | 最低盈亏比、仓位、移动保本等 **不在扫描端** 区分,由各执行器自行配置 | | **统一 Webhook** | 全系统使用 **同一个** `webhook_secret` | | **仅扫描端登记** | 执行器列表 **只能** 在扫描端 Web 面板(及对应 API)维护,**禁止执行器反向注册** | --- ## 2. 架构 ```mermaid flowchart LR scout[onchain_scout_gate :8088] scout -->|1 次| wecom[企业微信] scout -->|同一 payload| exA[执行器 A] scout -->|同一 payload| exB[执行器 B] exA --> gateA[Gate 账户 A] exB --> gateB[Gate 账户 B] ``` - 转发 **不走** 扫描端 `proxy`,直连各 `base_url`(通常 `http://127.0.0.1:8090` 或内网 IP)。 - 各执行器独立进程、独立 `config.yaml`、独立 SQLite;互不通信。 --- ## 3. 扫描端实现要点(已实现) ### 3.1 持久化 | 文件 | 内容 | |------|------| | `runtime/order_executors.json` | 总开关、`webhook_secret`、`timeout_seconds`、执行器列表 | | `config.yaml` `order_executor` | **仅冷启动**:首次无 json 时从 `base_url` / `enabled` / `secret` 导入一条 | 之后以 **面板修改** 为准;改 `config.yaml` **不会** 覆盖已有 json。 ### 3.2 执行器列表字段 | 字段 | 说明 | |------|------| | `id` | UUID | | `name` | 展示名(日志、面板) | | `base_url` | 如 `http://127.0.0.1:8090` | | `enabled` | 单条开关 | | `last_forward` | 最近一次转发结果(HTTP、exec_status) | ### 3.3 HTTP API(需登录) | 方法 | 路径 | 作用 | |------|------|------| | GET | `/api/order-executors` | 读取完整配置 | | PUT | `/api/order-executors/settings` | 总开关、webhook_secret、timeout | | POST | `/api/order-executors` | 新增 | | PATCH | `/api/order-executors/{id}` | 改名称/URL/启用 | | DELETE | `/api/order-executors/{id}` | 删除 | ### 3.4 转发逻辑 1. `build_order_executor_payload()` 仍只构建 **一次**(与企微方案 A 一致)。 2. 对 `enabled=true` 的列表项 **并行** `POST {base_url}/v1/signal`。 3. **同一 `signal_id`** 发往所有目标。 4. 部分失败只记日志,不阻断其他执行器。 ### 3.5 Web 面板 路径:Dashboard → **「下单执行器 · 转发链」** - 总开关、Webhook 密钥(可改)、超时 - 添加 / 启用 / 停用 / 删除 - 展示上次转发状态 ### 3.6 代码模块 | 文件 | 职责 | |------|------| | `app/order_executors_store.py` | 读写 json、CRUD | | `app/order_executor_forward.py` | 构建 payload、多路 POST | | `app/monitor.py` | 企微成功后调用转发 | | `app/web.py` | API + 启动时 `ensure_store_initialized` | --- ## 4. 执行器侧(gate_order_executor) 本次 **未改** 执行器业务代码。多账户 = 多实例部署: | 实例 | 典型差异 | |------|----------| | 目录/PM2 名 | 两份 `gate_order_executor` | | `app.port` | 8090 / 8091 | | `gate.api_key/secret` | 不同子账户 | | `security.webhook_secret` | 与扫描端面板 **相同** | | `risk.*`、移动保本 | 各实例自行实验 | 另见执行器仓库已实现的 **移动保本**(1R 拉至开仓价±0.2%、面板开关、`breakeven_prefs` 等),与多路转发正交。 --- ## 5. 部署套数怎么选 | 场景 | 面板操作 | |------|----------| | 单账户 | 列表 **1 条** URL | | 双账户对照 | **2 条** URL,各指向不同端口/机器 | | 临时只跑一套 | 另一条 `enabled: false` 或关总开关 | | 完全停止自动下单 | 总开关 `enabled: false` | --- ## 6. 盈亏比对照实验(用法) 1. 扫描端产生同一 `signal_id`、同一 TP/SL。 2. 执行器 A:`min_reward_risk_ratio = 1.3` → 可能 `accepted`。 3. 执行器 B:`min_reward_risk_ratio = 1.8` → 可能 `skipped` / `reward_risk_below_min`。 4. 分别在两个执行器面板「信号流」与 Gate 平仓统计中对比结果。 --- ## 7. 云服务器关闭代理 ### 7.1 何时关闭 - **本机 + 本地 SOCKS**:`proxy.enabled: true` - **境外云、可直连 Gate**:`proxy.enabled: false` ### 7.2 扫描端 ```yaml proxy: enabled: false ``` 仅影响 **Gate 行情**;企微、转发执行器本就直连。 ### 7.3 执行器(每个实例) ```yaml proxy: enabled: false ``` 影响 Gate 下单/查仓及(若开启)企微出站。 ### 7.4 自检 ```bash curl -I --max-time 15 https://api.gateio.ws ``` ### 7.5 文档索引 - `onchain_scout_gate/交易系统部署说明.md` §7、§8 - `onchain_scout_gate/docs/本地部署-SOCKS5代理.md`(本地 SOCKS) - `gate_order_executor/docs/部署说明.md` §6.1 --- ## 8. 日志关键字 扫描端运行日志(面板「运行日志」或 `runtime/system.log`): | 日志前缀 | 含义 | |----------|------| | `order_executor_ok name=...` | 该执行器 HTTP 成功 | | `order_executor_failed name=...` | HTTP 或业务失败 | | `order_executor_no_active_targets` | 总开关开但无启用条目 | | `webhook_secret is empty` | 未配置密钥 | --- ## 9. 安全与约束 - **Webhook 密钥** 在面板修改后,须手动同步到 **每一个** 执行器 `security.webhook_secret`。 - **勿** 将执行器 `8090/8091` 对公网裸奔;建议仅本机或内网 + 防火墙。 - 执行器 **不会** 也 **不能** 向扫描端注册;避免运维混乱。 --- ## 10. 变更记录 | 日期 | 内容 | |------|------| | 2026-05 | 多执行器运行时存储、面板 CRUD、并行广播、部署与代理文档 | --- ## 11. 相关路径速查 ```text onchain_scout_gate/ runtime/order_executors.json # 执行器列表(面板写入) app/order_executors_store.py app/order_executor_forward.py templates/dashboard.html # 「下单执行器」区块 static/app.js gate_order_executor/ # 多实例部署,代码无需为多账户改动 config.yaml # 每实例独立 API / risk / proxy ```