研究文章
N / 260926

一个合约交易机器人,其实不是一个“信号策略”

真正的自动交易系统不只是产生 BUY/SELL 信号,还包含执行门控、动态仓位、账户风险状态和持仓管理。本文从系统结构角度拆解一个 BTC 合约机器人。

很多人讨论交易机器人时,核心问题通常是:

你用什么指标?
胜率多少?
什么时候买?
什么时候卖?

这些当然重要。

但做完整系统以后,我越来越觉得:

一个可运行的交易机器人,本质上不是一个信号策略。

信号只是第一层。

真正的系统更接近:

Signal
→ Execution Gate
→ Position Sizing
→ Position Management

每一层都可能决定:

最终到底有没有这笔交易。


1. 第一层:Signal

Signal Layer 回答的是:

市场里是否出现了值得参与的机会?

一个成熟的信号层通常不会只依赖单一指标。

它可能组合:

  • 趋势;
  • 突破;
  • 动量;
  • 均值回归;
  • 波动状态;
  • 成交行为;
  • 多种形态之间的共振。

最终得到的也不应该简单理解成:

“马上买。”

更准确是:

现在出现了一个候选交易事件。


2. Signal ≠ Trade

这是我越来越重视的一点。

一个信号产生以后,还可能因为很多原因不应该真正开仓。

例如:

  • 数据没有确认;
  • 当前已经有仓位;
  • 行情源异常;
  • 账户余额不足;
  • 下单数量达不到最小要求;
  • 交易所还有未处理订单;
  • 杠杆状态没有同步完成;
  • 信号已经过期;
  • 自动化并不处于允许运行的状态。

所以:

Signal 只是交易候选,不是最终订单。


3. 第二层:Execution Gate

Execution Gate 的职责就是判断:

现在是不是一个可以安全执行的状态?

它不是用来提高方向预测胜率。

它更像一个系统健康门。

只有:

  • 数据健康;
  • 仓位状态一致;
  • 订单状态一致;
  • 风险参数准备完成;
  • 信号仍在有效期;
  • 账户满足要求;

才允许真正发单。

否则:

宁可错过,也不延迟追单。


4. 为什么信号需要有效期?

这是自动交易系统和回测差异很大的地方。

回测里,一个信号似乎永远存在。

但实盘里:

5 分钟收盘时有效的机会,十几秒后可能已经不是同一笔交易。

如果:

  • API 异常;
  • 网络中断;
  • 杠杆设置失败;
  • 行情源短暂不可用;

系统不应该等恢复后,在完全不同的价格上追进去。

因此一个很重要的原则是:

Signal has a lifetime.

交易机器人不只是判断方向,还要判断:

这个判断是否仍然来得及执行。


5. 第三层:Position Sizing

即使同样的信号最终允许执行:

也不意味着每一笔应该使用同样仓位。

仓位层回答的是:

这笔交易应该承担多少账户风险?

它可能同时考虑:

  • 信号质量;
  • 当前账户状态;
  • 最近亏损情况;
  • 当前回撤;
  • 配置的最高杠杆。

所以:

Direction 和 Size 是两个不同决策。

同样一个方向信号:

  • 账户健康时,可以允许更多风险;
  • 连续亏损后,应该自动收缩;
  • 回撤扩大时,也应该限制风险。

6. 第四层:Position Management

开仓以后,又进入完全不同的问题:

怎么活着退出?

这包括:

  • 初始保护;
  • 动态保护;
  • 跟踪退出;
  • 异常断连时的交易所托管保护;
  • 仓位状态恢复;
  • 真实成交均价;
  • 最终结算和记录。

所以一个方向判断正确,也不保证这笔交易最终赚钱。

因为:

Entry is only the beginning of the trade path.


7. 为什么保护单应该尽量靠近交易所?

程序运行时,总会面临:

  • 网络断开;
  • 本地进程崩溃;
  • API 超时;
  • 行情源暂停;
  • VPS 异常。

如果所有保护都依赖程序本地运行,那么一旦程序失联:

仓位可能在最危险的时候完全裸奔。

所以比较合理的设计是:

建仓后尽量让最基础的灾难保护托管在交易所侧。

程序再负责动态更新更复杂的保护状态。


8. 为什么“没有交易”也是系统输出?

很多策略研究天然追求:

更多信号。

但真正运行以后,会发现:

NO TRADE 也是一种正式结果。

如果:

  • 信号不够清晰;
  • 执行条件不健康;
  • 风险状态不允许;
  • 机会已经过期;

系统应该可以什么都不做。

这不是“漏单”。

而是系统明确决定:

这笔交易不值得现在执行。


9. 为什么系统层研究比指标研究更难?

因为单个指标研究很容易:

输入数据 → 输出信号 → 看胜率。

完整系统则是:

数据
→ 信号
→ 状态
→ 风险
→ 订单
→ 成交
→ 保护
→ 退出
→ 账户状态更新
→ 影响下一笔交易

每一层都会影响下一层。

于是结果变成高度路径依赖。

这也是为什么生产代码回放,比单纯策略公式回测更重要。


10. 一个更完整的 Trading Bot 应该验证什么?

除了信号本身,还应该验证:

  • 时间边界是否正确;
  • 数据是否过期;
  • 实盘价格源是否健康;
  • 是否重复执行;
  • 持仓和本地状态是否一致;
  • 是否存在未处理挂单;
  • 风险状态是否因果;
  • 保护单是否真正建立;
  • 中断恢复后是否还能恢复状态;
  • 真实执行是否偏离研究假设。

这些问题可能完全不影响“历史胜率”。

但它们会决定:

这个机器人能不能真正运行。


最后

我现在越来越不喜欢把一个自动交易系统描述成:

“一个 BTC 买卖策略。”

它更接近:

一个持续运行的决策系统。

Signal 只是开始。

真正决定系统长期表现的,是后面的:

Execution
Risk
Sizing
Protection
State

所以一个交易机器人最重要的问题,不只是:

它什么时候买?

而是:

它什么时候决定不买?
它买多少?
它怎么保护自己?
系统异常时会发生什么?

这些问题加在一起,才更接近真实的自动交易。


本文仅记录自动交易系统研究,不构成投资、交易或财务建议。历史研究结果不代表未来表现。