面向开发者 / 产品经理 · 与具体交易方法论无关的底层运行时 · 2026-05-15
具体"交易系统"只需向框架提交一份配置清单,声明选用哪些模块实现、哪种方法、哪些参数,框架即可自动驱动其运行。第一个具体系统实例:《日内交易三步曲》。
每个模块插槽可整体替换为不同的实现类,只要新实现遵守输入/输出契约,框架不关心内部如何工作。
同一模块实现内部,多种算法/策略可作为子选项被选择或组合。
同一方法的具体数值由系统配置传入,运行时不写死。
"传入模块"列标注该字段被哪些下游模块读取。
| 字段名 | 中文名称 | 必填 | 可选项 / 格式 | 传入模块 |
|---|---|---|---|---|
| 系统元数据 | ||||
| system_id | 系统标识 | 必填 | 唯一字符串,如 sanbuqu_v1 |
5C 复盘 多系统运行器 |
| description | 系统简述 | 必填 | 任意文字 | 5C 复盘 |
| exchange | 交易所 | 必填 | Binance · OKX · Bybit · Bitget | 5A 下单 5B 持仓 |
| symbols | 交易品种列表 | 必填 | ["BTC/USDT", "ETH/USDT"] |
1 趋势 2 关键位 3 信号 多系统运行器 |
| 周期配置 | ||||
| trend_timeframe | 趋势参考周期 | 必填 | 5M · 15M · 1H · 4H · 1D | 1 趋势 |
| main_timeframe | 主交易周期 | 必填 | 1M · 5M · 15M · 1H · 4H | 2 关键位 3 信号 |
| kline_window | K线滚动窗口 | 必填 | 正整数,默认 240(根);当前同一值控制三处:① 模块1拉取K线根数,② 模块1趋势分析窗口,③ 模块2关键位EXPIRED判断窗口三者最优值可能不同,后续可拆分为独立参数;暂用同一值保持简单 |
1 趋势 2 关键位 |
| 数据馈入 DataFeed | ||||
| datafeed_lib | 行情数据获取库 | 必填 | ccxt(统一多交易所接口)· websocket(原生推送)· rest(自行实现 REST 拉取) |
运行时 |
| datafeed_exchange_id | 行情来源交易所 | 必填 | ccxt 标准 ID,如 okx · binanceusdm · bybit;可与 exchange(下单交易所)不同 |
运行时 |
| datafeed_symbol | 行情品种标识 | 必填 | 遵循所选 datafeed_lib 的符号格式,如 ccxt 永续写法 BTC/USDT:USDT |
1 趋势 2 关键位 3 信号 |
| refresh_mode | K 线刷新触发模式 | 必填 | on_kline_close(每根 K 线收盘后触发,推荐)· fixed_interval(按固定秒数轮询)on_kline_close:运行时根据 main_timeframe 自动计算下一收盘时间并等待;fixed_interval 退化为定时 cron |
运行时 |
| refresh_delay_seconds | 收盘后延迟取数秒数 | 必填 | 正整数,默认 5;K 线收盘时刻到交易所数据稳定之间的保守等待时间 |
运行时 |
| 趋势方法 | ||||
| trend_method_main | 趋势判断主方法 | 必填 | EMA均线 · 裸K分析 · 形态分析 · 趋势线123 | 1 趋势 |
| trend_methods_aux | 趋势判断辅方法 | 选填 | 列表,可空 [];与主方法相同枚举值 |
1 趋势 |
| 信号方法 | ||||
| signal_method_main | 信号识别主策略 | 必填 | Pinbar · 金K形态 · 突破 · 量能 | 3 信号 |
| signal_methods_aux | 信号识别辅策略 | 选填 | 列表,可空 [];与主策略相同枚举值 |
3 信号 |
| 交易策略 | ||||
| trade_direction_policy | 做单类型 | 必填 | 顺势单 · 逆势单 | 3 信号 4 计划 |
| entry_style | 入场方式 | 必填 | 左侧 · 右侧 | 3 信号 4 计划 ★可覆盖 |
| min_risk_reward | 最小盈亏比 | 必填 | ≥ 1 的数字,如 1.5 |
2 关键位 3 信号 4 计划 |
| take_profit_strategy_default | 止盈策略类型 | 必填 | 关键位止盈 · 跟踪均线止盈 · 等距止盈 | 4 计划 ★可覆盖 5B 持仓 |
| 仓位与杠杆 | ||||
| risk_mode | 风险计量模式 | 必填 | fixed_amount(固定金额)· equity_percent(账户净值百分比) |
4 计划 ★可覆盖 |
| risk_value | 每笔风险额度 | 必填 | risk_mode=fixed_amount 时为 U 金额(如 10);equity_percent 时为小数比例(如 0.01=1%)以损定仓分子 = fixed_amount 直接使用;equity_percent 时 = risk_value × account_equity(由框架实时查询) |
4 计划 ★可覆盖 |
| margin_mode | 保证金模式 | 必填 | 逐仓(当前版本仅支持逐仓) | 5A 下单 5B 持仓 |
| leverage | 杠杆倍数 | 必填 | 正整数,如 5 · 10 · 50 |
4 计划 5A 下单 |
| 异常保护 | ||||
| protection_check_delay_seconds | 保护单确认延迟 | 必填 | 正整数,默认 15(秒);开仓后多少秒 REST 确认止损单存在(5秒过短:限价单撮合1~3秒 + REST往返1~2秒 + 重试窗口,15秒可覆盖一次完整重试) |
5B 持仓 |
| websocket_failsafe_seconds | 断线熔断时限 | 必填 | 正整数,默认 30(秒);WebSocket 断连超时后触发本地止损 |
5B 持仓 |
| order_cancel_timeout_hours | 挂单超时时限 | 必填 | 正整数,默认 4(小时);限价单挂出后超时未成交则自动撤单 |
5A 下单 |
| cancel_price_buffer_bps | 撤单价格容差 | 必填 | 正整数,默认 50(bps = 0.5%);限价单挂出后若市场价偏离超过此阈值(做多:低于 entry−buffer;做空:高于 entry+buffer),自动撤单 |
5A 下单 |
| 字段名 | 中文名称 | 必填 | 可选项 / 格式 | 传入模块 |
|---|---|---|---|---|
| 置信度门槛(方法置信度机制待设计) | ||||
| confidence_threshold_trend | 趋势置信度门槛 | 必填 | 0~1,默认 0.6 |
1 趋势 |
| confidence_threshold_signal | 信号置信度门槛 | 必填 | 0~1,默认 0.65;逆势单自动 +0.1 |
3 信号 |
| 风控参数 (v1 暂缓,配置可填可空,框架运行时不强校验) | ||||
| revenge_quota | 复仇配额 | 暂缓 | { per_event: 1, per_day: 2 } |
复仇控制器 多系统运行器 |
| daily_loss_limit_per_symbol | 单对每日最大亏损 | 暂缓 | 正数,单位与投入金额一致 | 多系统运行器 |
| daily_loss_limit_global | 全局每日最大亏损 | 暂缓 | 正数,单位与投入金额一致 | 多系统运行器 |
| 扩展字段(系统自定义) | ||||
| metadata.* | 系统自定义扩展 | 选填 | 如 kline_visible_max、fib_levels |
由系统声明决定 |
以下字段允许在计划层(PlanModule)按单覆盖,其他字段一律不可在运行时修改:
take_profit_strategy_default → 止盈策略类型entry_style → 入场方式(左侧/右侧);覆盖后在 M4 与 entry_timing.side 比对(见模块4)position_classification(短线/中线)由模块4根据趋势阶段自动评分得出,不源自 SystemConfig,不在覆盖范围内。
| 来源 | 字段名 | 中文名称 | 必/选 | 用途 |
|---|---|---|---|---|
| 行情数据 | K线序列 trend_timeframe 周期 · kline_window 根 |
K线序列 | 必选 | 供 trend_method_main 分析,输出 direction / stage / extreme_price / pullback_depth |
| SystemConfig | symbols | 交易品种列表 | 必选 | 决定拉取哪条行情数据 |
| SystemConfig | trend_timeframe | 趋势参考周期 | 必选 | 决定K线数据周期 |
| SystemConfig | kline_window | K线滚动窗口 | 必选 | 决定拉取多少根K线(如240根) |
| SystemConfig | trend_method_main | 趋势判断主方法 | 必选 | 主逻辑算法,计算 direction / stage / extreme_price |
| SystemConfig | trend_methods_aux | 趋势判断辅方法 | 可选 | 辅助方法,生成 favorable_factors / unfavorable_factors |
| 字段名 | 中文名称 | 必须 | 格式 / 可选项 | 传给下游 |
|---|---|---|---|---|
| 核心判断 | ||||
| direction | 趋势方向 | 必须 | 涨势 · 跌势 · 震荡 | 2 关键位 3 信号 4 计划 |
| 趋势结构细节 | ||||
| stage | 趋势阶段 | 可选 | 初期 · 中期 · 末期 · unknown | 4 计划(短/中线评分) |
| trend_origin_price | 趋势起点价格 | 可选 | 数字 | 2 关键位 3 信号(段数测距) |
| extreme_price | 极值价格 | 可选 | 涨势取最高点,跌势取最低点 | 2 关键位 3 信号(回调深度计算) |
| pullback_depth | 当前回调深度 | 可选 | 0~1 小数;做多(上升趋势回调):(extreme_price − current_price) ÷ (extreme_price − trend_origin_price);做空(下降趋势反弹):(current_price − extreme_price) ÷ (trend_origin_price − extreme_price) |
3 信号(61.8% 红线过滤) |
| 辅方法输出 | ||||
| favorable_factors | 有利因素清单 | 可选 | 字符串列表,与主判断方向一致的辅助依据 | 4 计划(理由收集) |
| unfavorable_factors | 不利因素清单 | 可选 | 字符串列表,与主判断方向相反的辅助依据 | 4 计划(理由收集) |
| 字段名 | 中文名称 | 必须 | 格式 / 可选项 | 传给下游 |
|---|---|---|---|---|
| confidence | 趋势置信度 | 可选 | 0~1 小数 | 1 自身(与门槛对比,决定是否输出"震荡") |
| metadata | 扩展字段 | 可选 | 对象,如段数、Vegas 隧道位置 | 由系统声明决定 |
{
direction: "涨势",
stage: "中期",
trend_origin_price: 58000,
extreme_price: 72000,
pullback_depth: 0.26, // (72000-68400)÷(72000-58000)
favorable_factors: ["EMA多头排列", "高点高低点结构完整", "H4收于隧道上轨"],
unfavorable_factors: ["RSI接近超买70区间"]
}
direction == 震荡 → 整条流水线立即停止。
震荡时无明确趋势方向,顺势/逆势均无法判断做单方向,直接短路。
| 来源 | 字段名 | 中文名称 | 必/选 | 用途 |
|---|---|---|---|---|
| 模块1 | trend_origin_price | 趋势起点价格 | 可选 | 计算隐藏字段 relative_position;未传入则该字段为空,不影响关键位识别 |
| 模块1 | extreme_price | 极值价格 | 可选 | 计算隐藏字段 relative_position;未传入则该字段为空,不影响关键位识别 |
| 行情数据 | K线序列 主周期 + 1H + 4H · kline_window 根 |
多周期K线序列 | 必选 | 扫描价格结构,识别 price_zone / role / timeframes / reasons / strength |
| SystemConfig | main_timeframe | 主交易周期 | 必选 | 扫描频率基准 |
| SystemConfig | kline_window | K线滚动窗口 | 必选 | 决定关键位 EXPIRED 判断窗口 |
| SystemConfig | min_risk_reward | 最小盈亏比 | 必选 | estimated_rr 粗筛门槛,低于此值的关键位不传入模块3 |
输出是一个列表,不是单个关键位。系统同时维护多个活跃关键位,每个关键位独立判断,信号模块对列表中每一个 ACTIVE 关键位逐一检测信号。关键位越多(例如多个支撑位叠加),信号模块触发的机会也越多,各自独立走流水线。
| 字段名 | 中文名称 | 必须 | 格式 / 可选项 | 传给下游 |
|---|---|---|---|---|
| 列表容器 | ||||
| key_levels | 关键位列表 | 必须 | list<key_level>,可含多个元素 | 3 信号 4 计划 |
| 位置与标识 | ||||
| level_id | 关键位唯一ID | 必须 | UUID 字符串;首次识别时生成,reconcile() 合并时继承旧ID,生命周期内不变 | 3 信号 4 计划(跨图关联) |
| price_low | 区间下沿 | 必须 | 数字;关键位是区间不是单线 | 3 信号(价格是否进入区间判断) |
| price_high | 区间上沿 | 必须 | 数字 | 3 信号 |
| role | 支撑/压力 | 必须 | 支撑 · 压力 | 3 信号(决定做多/空方向) |
| label | 关键位标签 | 必须 | S1 · S2(支撑,由近到远)· T1 · T2(压力,由近到远);按距当前价格距离排序 | 3 信号 4 计划 |
| 生命周期 | ||||
| status | 生命周期状态 | 必须 | ACTIVE(监控中)· HIDDEN(休眠,>3×ATR)· EXPIRED(超出 kline_window);M2 仅将 ACTIVE 关键位传下游,HIDDEN/EXPIRED 在 M2 内部过滤 | 3 信号 |
| 质量与筛选 | ||||
| estimated_rr | 预估盈亏比 | 可选 | 数字;悲观估算公式(以区间边沿为基准,不依赖形态价格): 支撑位(做多):entry≈price_high,stop≈price_low,t1≈最近压力位 price_low → (t1−entry)÷(entry−stop)压力位(做空):entry≈price_low,stop≈price_high,t1≈最近支撑位 price_high → (entry−t1)÷(stop−entry)粗筛用,数值会比模块4的 risk_reward 偏低(悲观),只用于提前过滤明显不满足条件的关键位 |
3 信号 |
| 成因 | ||||
| reasons | 关键位成因 | 必须 | 字符串列表,如 ["前期高点", "H1支撑压力互换", "整数关口"];记录该区间被判定为关键位的理由 | 4 计划(纳入交易理由) |
| 共振信息 | ||||
| timeframes | 共振周期列表 | 必须 | 字符串列表,如 ["M15","H1","H4"];多周期扫描到同一区间时合并 | 3 信号 5C 复盘(派生 key_level_tier) |
| key_level_tier | 关键位级别 | 必须 | 由 timeframes 长度派生:1→单周期;2→双周期共振;3→三周期共振 | 5C 复盘(统计不同级别关键位胜率) |
| 字段名 | 中文名称 | 必须 | 格式 / 可选项 | 传给下游 |
|---|---|---|---|---|
| relative_position | 价格相对位置 | 可选 | 接近出发地 · 半道 · 接近目的地 依赖模块1的 trend_origin_price 和 extreme_price;两者未输出时此字段为空 |
3 信号 |
| metadata | 扩展字段 | 可选 | 对象,如出发地价格、颜色标注 | 由系统声明决定 |
key_levels: [
{
level_id: "a3f2c1d0-...", // 首次识别时生成,跨图关联用
price_low: 68200, // 区间下沿(支撑底部)
price_high: 68500, // 区间上沿(支撑顶部)
role: "支撑",
timeframes: ["M15","H1","H4"],// 三周期共振
reasons: ["前期低点密集区", "H1支撑压力互换", "整数关口68000附近"],
estimated_rr: 5.7,
status: "ACTIVE"
},
{
level_id: "b7e9a2f1-...", // 不同ID,不同关键位
price_low: 65800, // 第二个支撑区间,价格更低
price_high: 66100,
role: "支撑",
timeframes: ["M15"], // 仅主周期识别
reasons: ["M15前低反弹点"],
estimated_rr: 8.2,
status: "ACTIVE"
}
// 信号模块对以上两个关键位分别独立检测,各自走完整流水线
]
estimated_rr 使用区间边沿做悲观估算(支撑:entry=price_high;压力:entry=price_low),不依赖形态价格,比模块4的精算值偏低。estimated_rr < min_risk_reward 的关键位提前过滤;精确盈亏比(含两步试算后的实际入场价)在模块4计算并作为唯一最终门槛。若 estimated_rr 为空(无法找到对侧关键位),该关键位跳过粗筛,由模块4精算兜底所有关键位过滤后列表为空 → 流水线停止。有多个关键位时,各自独立进入信号检测,任一产出合格信号即可继续。
| 来源 | 字段名 | 中文名称 | 必/选 | 用途 |
|---|---|---|---|---|
| 模块2 | key_levels 仅 ACTIVE 状态 |
活跃关键位列表 | 必选 | 位置校验(信号须在区间内才有效) |
| 模块2 | key_levels[].role | 支撑/压力 | 必选 | 结合做单方向决定 trade_direction 输出 |
| 模块1透传 | direction | 趋势方向 | 必选 | × trade_direction_policy → 决定做单方向,进而决定搜索哪类形态 |
| 模块1透传 | pullback_depth | 当前回调深度 | 可选 | 61.8% 红线过滤(回调过深则跳过本次信号检测);缺失时跳过此过滤,记录日志"pullback_depth 不可用,跳过深度过滤" |
| 行情数据 | K线序列 main_timeframe 周期,当前及近期 |
当前K线序列 | 必选 | 识别 signal_type / signal_subtype / pattern_candle_count / pattern_prices / entry_timing |
| SystemConfig | signal_method_main | 信号识别主策略 | 必选 | 定义形态识别算法,计算所有信号输出字段 |
| SystemConfig | signal_methods_aux | 信号识别辅策略 | 可选 | 辅助验证信号质量 |
| SystemConfig | trade_direction_policy | 做单类型 | 必选 | 顺势/逆势,与 direction 共同决定做单方向及形态搜索类型 |
做单方向推导:模块1 direction × SystemConfig trade_direction_policy
→ 涨势+顺势=做多 · 跌势+顺势=做空 · 涨势+逆势=做空 · 跌势+逆势=做多
做单方向确定后只搜索对应方向形态:做多→看涨形态(启明星、看涨吞没、看涨Pinbar等);做空→看跌形态
| 字段名 | 中文名称 | 必须 | 格式 / 可选项 | 传给下游 |
|---|---|---|---|---|
| 信号识别结果 | ||||
| signal_type | 信号形态大类 | 必须 | Pinbar · 吞没 · 金K形态 · 突破 · 量能(由系统枚举) | 5C 复盘(统计各形态胜率) |
| signal_subtype | 信号方向形态 | 必须 | 做多:启明星 · 看涨Pinbar · 看涨吞没 · 看涨金K 等 做空:黄昏星 · 看跌Pinbar · 看跌吞没 · 看跌金K 等 |
4 计划(纳入 reasons) |
| trade_direction | 信号做单方向 | 必须 | 做多 · 做空;由输入侧做单方向决定,signal_subtype 与之一致 | 4 计划 5A 下单 |
| 形态细节 | ||||
| pattern_candle_count | 形态K线数 | 必须 | 整数;Pinbar=1,吞没=2,启明星/黄昏星=3 | 4 计划 5C 复盘 |
| pattern_start_time | 形态起始K时间 | 必须 | ISO 时间字符串;单K形态与 pattern_end_time 相同 | 5C 复盘 |
| pattern_end_time | 形态末K收盘时间 | 必须 | ISO 时间字符串;信号确认时刻 | 5C 复盘 |
| pattern_prices | 形态关键价格 | 必须 | 对象:low(形态最低价)· high(形态最高价)· close(末K收盘价,信号确认价) Pinbar:low=影线低点,close=收盘价;启明星:low=中间K最低点,close=第3根K收盘价 |
4 计划(计算入场/止损参考价) |
| entry_timing | 入场时机 | 必须 | 对象;side: 左侧|右侧(入场策略类型,左侧=收盘即进,右侧=等待突破确认后进);attempt: 本关键位第几次触发信号(两者正交,左侧也可能有多次 attempt);prev_times: 之前每次信号的 ISO 时间列表 |
4 计划 5A 下单 |
| 字段名 | 中文名称 | 必须 | 格式 / 可选项 | 传给下游 |
|---|---|---|---|---|
| confidence | 信号置信度 | 必须 | 0~1 小数;逆势单门槛自动 +0.1 | 4 计划(理由质量评估) |
| trade_direction_relative | 顺势/逆势 | 必须 | 顺势 · 逆势 | 4 计划(逆势自动减仓40%) |
| metadata | 扩展字段 | 可选 | 如 Pinbar 影线倍数、数K线状态 | 由系统声明决定 |
// 看涨Pinbar(单K,左侧) { signal_type: "Pinbar", signal_subtype: "看涨Pinbar", trade_direction: "做多", pattern_candle_count: 1, pattern_start_time: "2024-05-15T06:15:00Z", pattern_end_time: "2024-05-15T06:15:00Z", pattern_prices: { low: 67820, high: 68650, close: 68350 }, entry_timing: { side: "左侧", attempt: 1, prev_times: [] } } // 启明星(3K,右侧) { signal_type: "启明星", signal_subtype: "启明星", trade_direction: "做多", pattern_candle_count: 3, pattern_start_time: "2024-05-15T05:45:00Z", // 第1根阴K pattern_end_time: "2024-05-15T06:15:00Z", // 第3根阳K收盘 pattern_prices: { low: 67750, high: 68620, close: 68400 }, entry_timing: { side: "右侧", attempt: 2, prev_times: ["2024-05-15T04:15:00Z"] // 第1次信号时间 } }
未识别到合格信号 → 流水线停止。
注:入场时机校验(entry_timing.side vs entry_style)已下沉至模块4,在计划层覆盖 entry_style 后执行,避免 M3 提前短路掉计划层本会接受的信号。
| 来源 | 字段名 | 中文名称 | 必/选 | 用途 |
|---|---|---|---|---|
| 模块3 | signal_type signal_subtype |
信号形态大类 信号方向形态 |
必选 | 纳入 reasons(如"看涨Pinbar(左侧入场)") |
| 模块3 | trade_direction | 信号做单方向 | 必选 | 透传给模块5A,决定下单买/卖方向 |
| 模块3 | entry_timing | 入场时机 | 必选 | 透传给模块5A,辅助决策挂单时机 |
| 模块3 | pattern_prices | 形态关键价格 | 必选 | 结合 entry_style 计算 entry_price(市价取 close,限价取形态关键点) |
| 模块2透传 | key_levels[].price_low/high | 触发信号的关键位区间 | 必选 | 止损锚点参考:做多→ price_low(区间下沿);做空→ price_high(区间上沿);实际止损取 pattern_prices.low/high(形态极值),见规则2 |
| 模块2透传 | key_levels(反向) | 反向关键位 | 可选 | 计算 t1_price(关键位止盈策略时需要;无反向位则降级为等距止盈) |
| 模块2透传 | key_levels[].reasons | 关键位成因 | 必选 | 纳入 reasons(如"三周期共振支撑区间 [68200, 68500]") |
| 模块1透传 | stage | 趋势阶段 | 可选 | 纳入 reasons(如"涨势中期");缺失时 position_classification 默认"短线",reasons 省略趋势阶段描述 |
| 模块1透传 | favorable_factors unfavorable_factors |
有利/不利因素 | 可选 | 汇总纳入 reasons;缺失时 reasons 不追加辅方法理由,但 ≥2 条门槛仍须达成 |
| SystemConfig | take_profit_strategy_default | 止盈策略类型 | 必选 | 决定 take_profit_strategy 输出值 |
| SystemConfig | entry_style | 入场方式 | 必选 | 接收计划层覆盖后的最终值;与模块3输出的 entry_timing.side 比对:不一致则流水线停止,记录原因 "信号时机不匹配:系统限定[{entry_style}],当前信号为[{entry_timing.side}]" |
| SystemConfig | risk_mode risk_value |
风险计量模式 每笔风险额度 |
必选 | 以损定仓分子:fixed_amount→直接用 risk_value;equity_percent→risk_value × 当前账户净值;结果除以 |entry−stop| 得 position_size |
| SystemConfig | min_risk_reward | 最小盈亏比 | 必选 | risk_reward 门槛校验,不达标则流水线停止 |
| SystemConfig | leverage | 杠杆倍数 | 必选 | position_size 约束(最大仓位上限) |
| 字段名 | 中文名称 | 必须/可选 | 格式/可选项 | 传给下游 |
|---|---|---|---|---|
| 方向与入场 | ||||
trade_direction | 交易方向 | 必须 | 做多 · 做空 | 5A 下单 |
entry_price | 入场价 | 必须 | 两步试算(按方向分支):① 取 pattern_prices.close → 市价单;② 若①RR不足 → 做多:low+(close−low)×50%;做空:high−(high−close)×50% → 限价单;两步均不足则短路 | 5A 下单 |
order_type | 订单类型 | 必须 | 市价单 · 限价单;由入场价两步试算结果决定:步骤①→市价单,步骤②→限价单 | 5A 下单 |
entry_mode | 建仓方式 | 必须 | 一次性 · 分批 | 5A 下单 |
entry_orders | 分批挂单规格 | 可选 | 列表,分批模式时有值 | 5A 下单 |
| 止损止盈 | ||||
stop_loss_price | 止损价 | 必须 | 数字;做多→ pattern_prices.low(形态最低价);做空→ pattern_prices.high(形态最高价);两步试算中均不变 | 5B 持仓 |
take_profit_strategy | 止盈策略 | 必须 | 关键位止盈 · 跟踪均线止盈 · 等距止盈;由 SystemConfig.take_profit_strategy_default 决定 | 5B 持仓 |
t1_price | 第一止盈价 | 必须 | 数字;由 take_profit_strategy 决定:关键位止盈→最近反向关键位近端;等距止盈→entry + N×|entry−stop|;跟踪均线止盈→首个目标价 | 5B 持仓 |
t2_price | 第二止盈价 | 可选 | 数字,中线单时存在 | 5B 持仓 |
take_profit_legs | 各档止盈比例 | 必须 | 列表,各值之和=1;index 0 对应 t1_price,index 1 对应 t2_price;单档:[1.0],双档:[0.5, 0.5];5B 按 (price, ratio) 配对监控各档止盈 | 5B 持仓 |
| 盈亏与仓位 | ||||
risk_reward | 精算盈亏比 | 必须 | 数字;做多:(t1 − entry) ÷ (entry − stop);做空:(entry − t1) ÷ (stop − entry);必须 ≥ min_risk_reward | 5C 复盘 |
position_size | 仓位大小 | 必须 | 数字(以损定仓后的最终值) | 5A 下单 |
is_batch_entry | 是否分批建仓 | 必须 | 布尔值;由 entry_mode 派生:entry_mode=="分批" → true | 5C 复盘(统计分批 vs 一次性效果) |
max_entry_slippage_bps | 最大可容忍滑点 | 可选 | 数字(基点);默认 20bps(0.2%);5A 成交后若 entry_slippage_bps 超出此值,触发告警 | 5A 下单(滑点校验) |
| 交易理由 | ||||
reasons | 交易理由清单 | 必须 | 字符串列表,框架默认 ≥2 条(去重后计数) | 5C 复盘 |
| 字段名 | 中文名称 | 必须/可选 | 格式/可选项 | 传给下游 |
|---|---|---|---|---|
position_classification | 持仓分类 | 必须 | 短线 · 中线(自动评分) | 5B 持仓 |
revenge_count | 后手次数 | 必须 | 整数,初始为 0 | 复仇控制器 |
metadata | 扩展字段 | 可选 | 对象,由系统声明 | 由系统声明决定 |
// 步骤①:市价试算 // entry=68350(close), stop=67820(low), RR=(71200-68350)÷(68350-67820)=5.4 ≥ 2.0 ✓ 通过,无需降级 { trade_direction: "做多", take_profit_strategy: "关键位止盈", // 先确定策略 entry_price: 68350, // ①市价入场:pattern_prices.close stop_loss_price: 67820, // pattern_prices.low(形态最低价) t1_price: 71200, // 关键位止盈→最近压力位近端 risk_reward: 5.4, // (71200-68350)÷(68350-67820)=5.4 position_size: 0.15, // 愿亏 80 USDT ÷ 530 点/BTC entry_mode: "一次性", reasons: [ "涨势中期,EMA多头排列", "三周期共振支撑区间 [68200, 68500]", "看涨Pinbar(左侧入场)" ] } // 步骤②示例(做多,假设t1=69200,步骤①RR不足时降级限价) // entry=67820+(68350-67820)×50%=68085, stop=67820, RR=(69200-68085)÷(68085-67820)=4.2 ≥ 2.0 ✓ // entry_price=68085, order_type="限价单" // 做空示例:pattern {high:68650, close:68200, low:67900} // 步骤①:entry=68200(close), stop=68650(high), RR=(68200-65500)÷(68650-68200)=6.0 ≥ 2.0 ✓ // stop_loss_price=68650(形态最高价), order_type="市价单"
pattern_prices.close(市价单)·止损见规则2 → 计算 RRentry = pattern_prices.low + (close − low) × 50%(区间中点,挂低一些)entry = pattern_prices.high − (high − close) × 50%(区间中点,挂高一些)stop_loss_price = pattern_prices.low(形态最低价)stop_loss_price = pattern_prices.high(形态最高价)risk_reward = (t1 − entry) ÷ (entry − stop)risk_reward = (entry − t1) ÷ (stop − entry)entry ± N×|entry−stop|,N 为等距止盈算法内部参数,由算法实现定义;跟踪均线→首个目标价)仓位大小 = 风险额度 ÷ |entry - stop_loss|;风险额度由 risk_mode 决定:fixed_amount→直接用 risk_value;equity_percent→risk_value × 当前账户净值(框架实时查询)len(unique(reasons)) < 配置阈值 → 不生成计划,流水线停止;去重后计数,重复条目不累计两步入场价试算后盈亏比仍不足 / 理由不足 → 流水线停止。
entry_timing.side ≠ entry_style → 流水线停止,原因:信号时机不匹配(如系统限定右侧,但本次信号为左侧)。
| 来源 | 字段名 | 中文名称 | 必/选 | 用途 |
|---|---|---|---|---|
| 模块4 | trade_direction | 交易方向 | 必选 | 向交易所提交买/卖指令 |
| 模块4 | order_type | 订单类型 | 必选 | 决定向交易所下市价单还是限价单 |
| 模块4 | entry_price | 入场价 | 必选 | 市价单时为参考价,限价单时为挂单价格 |
| 模块4 | entry_mode | 建仓方式 | 必选 | 决定一次性下单还是分批挂单 |
| 模块4 | entry_orders | 分批挂单规格 | 可选 | 分批模式下的各档挂单参数 |
| 模块4 | position_size | 仓位大小 | 必选 | 向交易所提交的下单数量 |
| 模块4 | stop_loss_price | 止损价 | 必选 | 同步挂止损单;透传给模块5B |
| 模块4 | t1_price | 第一止盈价 | 必选 | 同步挂止盈单;透传给模块5B |
| 模块4 | max_entry_slippage_bps | 最大可容忍滑点 | 可选 | 默认 20bps;成交后校验 entry_slippage_bps:超出则触发告警并写入5C,不阻塞下单流程 |
| SystemConfig | exchange | 交易所 | 必选 | 决定调用哪个交易所 API |
| SystemConfig | margin_mode | 保证金模式 | 必选 | 逐仓,影响下单接口参数(当前版本仅支持逐仓) |
| SystemConfig | leverage | 杠杆倍数 | 必选 | 设置交易所杠杆倍数 执行参数由5A直接读取,不经过模块4 |
SystemConfig.leverage 一致;若不一致则先调用交易所设置杠杆接口更正,再执行下单| 字段名 | 中文名称 | 必须/可选 | 格式/可选项 | 传给下游 |
|---|---|---|---|---|
| 成交信息 | ||||
order_id | 订单编号 | 必须 | 字符串(交易所返回) | 5B 持仓 |
order_type | 订单类型 | 必须 | 市价单 · 限价单;透传自模块4 | 5C 复盘(统计市价/限价胜率) |
status | 订单状态 | 必须 | PENDING · FILLED · PARTIAL · CANCELLED · EXPIRED · REJECTED | 5B 持仓 5C 复盘 |
filled_size | 实际成交量 | 必须 | 数字(FILLED / PARTIAL 时有值) | 5B 持仓 |
filled_price | 实际成交价 | 必须 | 数字(FILLED / PARTIAL 时有值) | 5B 持仓 |
entry_fee | 入场手续费 | 可选 | 数字(U计价);交易所返回的本次成交手续费;FILLED/PARTIAL 时有值;pnl 为税前值,手续费单独记录,不计入 pnl 计算 | 5C 复盘(汇总全程手续费) |
| 滑点校验 | ||||
entry_slippage_bps | 实际入场滑点 | 可选 | 数字;(filled_price − plan_entry_price) ÷ plan_entry_price × 10000 × sign,sign=做多+1/做空−1;正值=不利滑点,负值=有利滑点;FILLED/PARTIAL 时计算;超限判定:entry_slippage_bps > max_entry_slippage_bps(只对正值即不利方向告警) | 5B 持仓(滑点超限时触发告警)5C 复盘 |
actual_rr_at_fill | 成交时实际RR | 可选 | 数字;用 filled_price 代替 entry_price 重新计算 risk_reward;低于 min_risk_reward×0.8 时触发告警 | 5B 持仓 5C 复盘 |
| 撤单与异常 | ||||
cancel_reason | 撤单原因 | 可选 | 字符串(CANCELLED / EXPIRED 时有值) | 5C 复盘 |
partial_protection_order_id | 部分成交保护单ID | 可选 | 字符串;PARTIAL 时有值,指向为 filled_size 创建的 reduce-only 止损单 | 5B 持仓 |
reject_reason | 拒单原因 | 可选 | 字符串(REJECTED 时有值) | 5C 复盘 |
failed_leg | 失败委托类型 | 可选 | 入场单 · 止损单 · 止盈单(REJECTED 时指明哪类委托被拒) | 5C 复盘 |
emergency_flatten_triggered | 是否触发应急平仓 | 可选 | 布尔值;保护单重试仍失败且已有持仓时 = true | 5C 复盘 |
{
order_id: "OKX-BTC-20240515-0042",
order_type: "市价单", // 步骤①通过,市价成交
status: "FILLED",
filled_size: 0.15,
filled_price: 68350,
cancel_reason: null
}
PENDING(已挂单未成交)
├─ FILLED(完全成交) → 用 filled_price 重校 RR;移交 PositionMonitor
├─ PARTIAL(部分成交)→ 立即为已成交数量(filled_size)挂 reduce-only 止损保护单;剩余继续等待;记录 partial_protection_order_id
├─ CANCELLED(撤单) → 记录原因,结束
├─ EXPIRED(超时) → 超出 order_cancel_timeout_hours(默认 4 小时)未成交,自动撤
└─ REJECTED(交易所拒绝) → ① 重试一次(原参数);② 仍失败 → 触发告警;若已有持仓则立即市价 reduce-only 平仓(emergency_flatten);记录 reject_reason、failed_leg
cancel_price_buffer_bps(做多:市价跌破 entry_price − buffer;做空:市价涨破 entry_price + buffer),视为价格走远,自动撤单order_cancel_timeout_hours,默认 4 小时),自动撤单注:"关键位被有效突破"原为第2条撤单规则,已移除。原因:"有效突破"需要定义收盘确认根数、超出区间 bps 等参数,精确定义复杂且易误撤;当前由 cancel_price_buffer_bps 和超时机制兜底,后续如需重新引入可在算法层实现。
| 来源 | 字段名 | 中文名称 | 必/选 | 用途 |
|---|---|---|---|---|
| 模块5A | order_id | 订单编号 | 必选 | 初始化持仓追踪,生成 position_id |
| 模块5A | filled_size | 实际成交量 | 必选 | 初始化持仓数量 |
| 模块5A | filled_price | 实际成交价 | 必选 | 初始化持仓成本价 |
| 模块5A | status | 订单状态 | 必选 | FILLED/PARTIAL → 激活持仓监控 |
| 模块4透传 | stop_loss_price | 止损价 | 必选 | 价格触及时触发止损平仓 |
| 模块4透传 | t1_price | 第一止盈价 | 必选 | 价格触及时触发第一止盈 |
| 模块4透传 | t2_price | 第二止盈价 | 可选 | 中线单时存在;价格触及时触发第二止盈 |
| 模块4透传 | take_profit_legs | 各档止盈比例 | 必选 | 与 (t1_price, t2_price) 按 index 配对监控各档分批止盈,比例之和=1 |
| 模块4透传 | take_profit_strategy | 止盈策略 | 必选 | 决定持仓动态监控逻辑(关键位/跟踪均线/等距) |
| SystemConfig | exchange | 交易所 | 必选 | 执行平仓指令的账户参数 |
| SystemConfig | margin_mode | 保证金模式 | 必选 | 执行平仓指令的账户参数 |
| SystemConfig | take_profit_strategy_default | 止盈策略类型 | 可选 | 兜底策略(模块4未指定 take_profit_strategy 时使用) |
| 字段名 | 中文名称 | 必须/可选 | 格式/可选项 | 传给下游 |
|---|---|---|---|---|
| 持仓标识 | ||||
position_id | 持仓编号 | 必须 | 字符串 | 5C 复盘 |
status | 持仓状态 | 必须 | OPEN · PARTIAL_CLOSED · CLOSED | 5C 复盘 |
| 平仓结果 | ||||
close_price | 平仓价格 | 必须 | 数字(平仓后有值) | 5C 复盘 |
close_reason | 平仓原因 | 必须 | 止盈 · 止损 · 当日强平 · 手动 · 断线熔断 · 交易所强平(爆仓) · ADL(自动减仓) · API故障 | 5C 复盘 |
| 盈亏统计 | ||||
pnl | 盈亏金额(税前) | 必须 | 数字(正盈负亏,不含手续费);多头:(close_price − entry_price) × qty;空头:(entry_price − close_price) × qty | 5C 复盘 |
pnl_ratio | 实际盈亏比 | 必须 | 数字(相对于止损金额) | 5C 复盘 |
exit_fee | 出场手续费 | 可选 | 数字(U计价);平仓单实际成交时交易所返回的手续费;与 entry_fee 配合供复盘汇总全程费用 | 5C 复盘 |
{
position_id: "POS-20240515-0042",
status: "CLOSED",
close_price: 71520,
close_reason: "止盈",
pnl: 317.2, // (71520−68348)×0.1
pnl_ratio: 6.0 // 317.2 ÷ ((68348−67820)×0.1) = 317.2÷52.8 ≈ 6.0
}
take_profit_strategy 驱动;具体行为由策略实现自定义protection_check_delay_seconds(默认 15 秒)内,REST 查询交易所确认止损单存在;不存在则重新挂单;重试失败 → 触发 emergency_flatten(市价 reduce-only 全平)websocket_failsafe_seconds(默认 30 秒)且 REST 心跳也失败 → 触发本地止损(以 stop_loss_price 为基准市价平仓);记录 close_reason="断线熔断"| 来源 | 字段名 | 中文名称 | 必/选 | 用途 |
|---|---|---|---|---|
| 模块5B | position_id | 持仓编号 | 必选 | 关联本次交易记录 |
| 模块5B | close_price | 平仓价格 | 必选 | 记录实际平仓价格,计算 pnl |
| 模块5B | close_reason | 平仓原因 | 必选 | 分类统计止盈/止损/强平/ADL/手动/API故障各占比 |
| 模块5B | pnl | 盈亏金额 | 必选 | 计算总收益统计 |
| 模块5B | pnl_ratio | 实际盈亏比 | 必选 | 与计划盈亏比对比,评估执行质量 |
| 模块5A透传 | cancel_reason | 撤单原因 | 可选 | 记录撤单原因(撤单时才有值) |
| 模块3透传 | signal_type | 信号形态大类 | 必选 | 统计各形态胜率和盈亏比 |
| 模块2透传 | key_level_tier | 关键位级别 | 必选 | 统计不同级别关键位胜率;取自 M2 输出,M2 有则必须有 |
| 模块4透传 | trade_direction | 交易方向 | 必选 | 统计多空胜率对比 |
| 模块4透传 | is_batch_entry | 是否分批建仓 | 必选 | 统计分批 vs 一次性建仓的效果对比 |
| 模块5A透传 | entry_fee | 入场手续费 | 可选 | 汇总全程手续费(entry_fee + exit_fee)用于分析费用侵蚀 |
| 模块5B透传 | exit_fee | 出场手续费 | 可选 | 汇总全程手续费(entry_fee + exit_fee)用于分析费用侵蚀 |
| 用户填写 | emotion_tag | 情绪标签 | 可选 | 情绪复盘分析 |
| 用户填写 | watch_duration | 盯盘时长 | 可选 | 行为复盘分析 |
| 字段名 | 中文名称 | 必须/可选 | 格式/可选项 | 传给下游 |
|---|---|---|---|---|
symbol | 交易品种 | 必须 | 字符串(如 BTCUSDT) | 落库/日志 |
trade_direction | 交易方向 | 必须 | 做多 · 做空 | 落库/日志 |
signal_type | 信号形态大类 | 必须 | 字符串(由 SignalModule 传入) | 统计报告 |
signal_subtype | 信号方向形态 | 必须 | 字符串(由 SignalModule 传入) | 统计报告 |
key_level_tier | 关键位级别 | 必须 | 字符串(由 KeyLevelModule 传入) | 统计报告 |
is_batch_entry | 是否分批建仓 | 必须 | 布尔值 | 落库/日志 |
pnl | 盈亏金额 | 必须 | 数字(正盈负亏) | 统计报告 |
pnl_ratio | 实际盈亏比 | 必须 | 数字 | 统计报告 |
entry_slippage | 入场滑点 | 必须 | 数字(计划价 vs 成交价之差) | 质量统计 |
emotion_tag | 情绪标签 | 可选 | 字符串(如 冲动、耐心、平稳) | 落库/日志 |
watch_duration | 盯盘时长 | 可选 | 数字(分钟) | 落库/日志 |
metadata | 系统专属维度 | 可选 | 对象,由系统统计模板处理 | 统计报告 |
{
symbol: "BTCUSDT",
trade_direction: "做多",
signal_type: "Pinbar",
signal_subtype: "看涨Pinbar",
key_level_tier: "三周期共振", // len(timeframes)==3
is_batch_entry: false,
pnl: 317.2,
pnl_ratio: 5.78,
entry_slippage: -2, // 计划 68350,实际 68348
emotion_tag: "平稳",
watch_duration: 45 // 分钟
}
短路的语义:前一步不通过,后一步没必要计算——既节省算力,也确保不会在弱信号上勉强生成计划。
启动时收集所有系统注册的交易对,合并去重后统一拉取K线。每个交易对每个周期只拉一份,多个系统订阅同一份数据。
每个交易对的每种趋势分析方法 + 每个周期,只算一次。缓存 key:(symbol, timeframe, method, params_hash)。各系统按需取用,不重复计算。
同一交易对的多周期关键位扫描只做一次。缓存 key:(symbol, timeframe, method, params_hash, source_close_time)(params_hash 覆盖 atr_multiplier、lookback_bars 等扫描参数;source_close_time 为产生缓存的那根K线收盘 ISO 时间,新K线收盘时旧条目自动失效,保留1根供回放)。多个系统共享同一份关键位列表,各自决定如何使用(如不同的盈亏比门槛、不同的相对位置筛选)。
示例:同一品种 BTC/H4,两套不同参数产生不同缓存 key:
"BTCUSDT_H4_swing_high_low_a3f2c1"(atr_multiplier=1.5, lookback_bars=100)
"BTCUSDT_H4_swing_high_low_9d7e44"(atr_multiplier=2.0, lookback_bars=200)
params_hash 为参数字典序列化后的哈希摘要(取前6位),两套系统互不污染。
以交易对为视角的配置入口,决定哪个交易对激活哪些系统模板。运营时可随时启停某交易对的某套策略,不需要改代码。
示例:BTC/USDT → 激活系统A、系统C;SOL/USDT → 激活系统B;BNB/USDT → 激活系统B
所有系统通用,PositionMonitor 强制拦截,禁止覆盖。
按 SystemConfig 中的强平比例和强平时间点驱动,独立任务执行,不依赖各系统的持仓监控。
main_timeframe 收盘时触发 + trend_timeframe 收盘时触发main_timeframe 每根新K线收盘时触发当日强平由独立任务在收盘前驱动,不依赖持仓追踪轨道。所有状态变更均带时间戳落日志。
并发安全约定:
source_close_time(产生该缓存的K线收盘时间)。信号探测读取前校验:trend.source_close_time == key_level.source_close_time;不一致时跳过本次检测并记录日志,等待下一个K线事件。order_id + event_type 作为幂等键去重,同一 (order_id, event_type) 只处理一次。| 系统 | 趋势方法 | 信号方法 | 止盈策略 | 交易对 | 建仓方式 |
|---|---|---|---|---|---|
| 系统A | EMA均线(主)+ 裸K(辅) | Pinbar | 关键位止盈 | BTC/ETH | 一次性 |
| 系统B | 裸K分析(主)+ 趋势线/EMA(辅) | 突破信号 | 等距止盈 | SOL/BNB | 三档分批 |
| 系统C | EMA均线(主)+ 形态(辅) | 金K形态 | 跟踪均线止盈 | BTC | 一次性 |
本框架文档(trading_framework_v1.html)只定义各模块的输入/输出接口契约,不规定具体计算逻辑。完整的系统由三层文档共同描述:
| 层级 | 文档 | 负责什么 | 示例 |
|---|---|---|---|
| 框架层 | trading_framework_v1.html |
模块接口协议、字段 schema、流水线流程、并发安全规则 | M1 输出 direction(涨势/跌势/震荡),类型 string,必须 |
| 算法层 | algorithms/M1_Trend_Sanbuqu.md |
具体判断逻辑、私有参数定义、字段映射关系 | Close > EMA20 且近3根低点抬升 → direction="涨势" |
| 实例层 | system_a_config.json |
声明某交易系统使用哪套算法 + 具体参数值 | trend_method_main: "sanbuqu_v1", kline_window: 200 |
以下模块的"具体如何判断"需要独立算法规格书;M0/M5A/M5B/M5C 是框架运行时,不需要:
| 模块 | 算法规格书命名示例 | 规格书描述的核心内容 |
|---|---|---|
| M1 TrendModule | M1_Trend_Sanbuqu.mdM1_Trend_EMA_Crossover.md | 如何从K线计算 direction / stage / extreme_price / pullback_depth |
| M2 KeyLevelModule | M2_KeyLevel_SwingHighLow.mdM2_KeyLevel_VolumeZone.md | 如何识别关键位区间、合并相邻位、定义 price_low/high |
| M3 SignalModule | M3_Signal_MorningStar.mdM3_Signal_PinBar.md | 如何识别K线形态、定义 signal_type / signal_subtype / pattern_prices |
| M4 止盈策略 | M4_TP_KeyLevel.mdM4_TP_EqualDistance.md | 如何计算 t1_price / t2_price,等距策略的 N 值定义及默认值 |
# M1_Trend_Sanbuqu.md(示例) ## 身份声明 - 对应模块:M1 TrendModule - algorithm_id:sanbuqu_v1(M0 的 trend_method_main 中引用的 ID) ## 接口映射(对接框架契约) // 框架要求的输出字段 → 本算法如何填充 - direction ← "涨势" / "跌势" / "震荡"(见判断逻辑第3步) - stage ← "初期" / "中期" / "末期"(见阶段划分) - trend_origin_price ← 本轮趋势的起点价格 - extreme_price ← 本轮趋势的极值价格(高点/低点) - pullback_depth ← 做多:(extreme−current)÷(extreme−origin) 做空:(current−extreme)÷(origin−extreme) ## 算法私有参数(写入 M0 的 metadata 字段) - metadata.ema_period:均线周期,默认 20 - metadata.trend_confirm_bars:趋势确认K线数,默认 3 ## 判断逻辑 1. 取 kline_window 根K线 2. 计算 EMA{ema_period} 3. 涨势判定:Close > EMA 且近 {trend_confirm_bars} 根K线低点依次抬升 → direction="涨势",trend_origin_price=本轮起涨点,extreme_price=区间最高点 4. 跌势判定:Close < EMA 且近 N 根K线高点依次下移 → direction="跌势" 5. 震荡判定:价格在 EMA ±0.5% 内交织超过5根K线 → direction="震荡"(触发框架短路) ## 阶段划分(stage 字段) - 初期:趋势确认后的前 1/3 时间段(以 kline_window 为参考) - 中期:中间 1/3 - 末期:extreme_price 距前高/低不足 ATR×1.5,或动量明显衰竭
① 框架文档确认 M1 需要输出 direction(接口契约)
② 算法规格书 M1_Trend_Sanbuqu.md 定义如何计算 direction(逻辑)
③ 系统配置声明 trend_method_main: "sanbuqu_v1" + 参数值(实例化)
④ 运行时框架读取配置,调用对应算法实现,校验输出字段是否符合接口契约