逆转:正规化入场点并开发手动交易算法·进阶篇
⚙️

逆转:正规化入场点并开发手动交易算法·进阶篇

(2/3)· 同一根 K 线早一分钟晚一分钟,回测利润可能就变了样,这篇专治随意入场的顽疾

进阶 第 2/3 篇
很多手动逆转交易者凭感觉在任意时刻进场,结果同一策略在不同分钟入场,盈亏曲线天差地别。回测里严丝合缝的漂亮资金曲线,实盘里往往因为没规矩入场就散了架。把入场时机和方向的判断写成可执行的规则,才是从玩具策略走向能用的工具的关键一步。

用均线把入场从“无脑开仓”改成“条件触发”

想消掉交易结果对入场时机的依赖,就不能在“账户没持仓就立刻开仓”这种规则下跑系统。更稳的思路是找一套确定条件下才触发的入场逻辑,而移动平均线刚好能同时解决两件事:判方向、加限制。 均线向上就只做多,向下就只做空,这是大方向过滤;再叠一条“前一根柱线向上或向下穿越均线后才允许开仓”的附加规则,就把无差别入场收成了条件入场。RevertEA 里这套逻辑早就能用,只要改几个参数:Open short positions 设 true(否则只做多),Period 在 Indicator MA #1 模块里填想要的周期,其余设置按品种调。 股票市场的实测能直接验证差异。经纪商1的 Tencent 逆转策略年化约 408%,加均线后 184%,但无逆转+均线盈利因子仍有 2.48;Snap 加均线后盈利因子从 1.97 跳到 3.47,年化 527%。经纪商2的 HPE.m 无逆转+均线盈利因子 3.55,年化 212%,均明显高于无指标版本。 指数只看经纪商1的道琼斯 YM:原逆转策略最大连续亏损 8 次、年度% 57,加均线后最大亏损降到 6 次、年度% 78,2009 年那次断链亏损被均线躲掉。商品里经纪商2的布伦特石油相反——加均线后盈利因子从 1.5 降到 1.26,年度% 从 71% 跌到 41%,说明均线不是万能过滤器。 外汇和贵金属交易者注意:上述均为股票市场、指数、商品的历史回测,杠杆品种波动更剧、滑点和点差会吃掉部分边缘收益,实盘前请在 MT5 用对应 SET 文件重跑并观察掉期正负对持仓的影响。

◍ 入场正规化后测试与取舍

把入场逻辑正规化之后,最直观的变化是测试起始日对结果的影响被削弱,回测不再那么依赖你从哪天开始跑。 多数品种在正规化后盈利能力上升,最大连续亏损次数也往下压了 1 到 2 步,这对外汇与贵金属这类高波动品种算是实打实的风控改善。 代价是成交单数整体降了 1.5 到 2 倍,所有品种净利润随之下滑。这里没有标准答案,你要在「更大盈利空间」和「更低回撤风险」之间自己选边,开 MT5 把同一标的用新旧逻辑各跑一遍,看曲线再定。

「点数止损和 ATR 百分比止损的回测对照」

有用户指出固定点数止损止盈在 15 年跨度里不妥,因为标的价格和波动率会漂移,老止损位可能完全失效。RevertEA 因此改成了可选模式:在 Stop Loss type 里挑点数、价格百分比或 ATR 百分比;止盈也能设成止损的倍数(Take type 参数),比如开盘价挂 3 倍止损距离的止盈。 ATR 按 Gerchik 思路算:日线周期取近 5 天,剔除异常大小柱,柱线不够才退回标准算法。函数写在 Strategies/strategy_base.mqh 的 getATR 里,想换算法直接改这块就行。 我跑了 21 个品种做纯对照(不用均线过滤,入场更多、对比更干净)。Gazprom 用 ATR 百分比时盈利因子 3.02,明显好于点数版的 1.33;但 Tencent 点数版盈利因子 2.54,ATR 版反而掉到 1.38。没有哪种算法通吃。 一个规律很扎眼:只要切到价格百分比或 ATR 百分比止损,连续亏损次数和最大回撤几乎全品种放大。比如 YM 点数版最大回撤 20089,ATR 版冲到 26969。外汇和贵金属杠杆高、跳空频繁,这类回撤扩张实际跑起来可能直接洗掉账户,MT5 里用策略测试器复刻这张表前先想清楚仓位。 我的倾向仍是点数止损——回撤更可控。但如果你做跨品种轮动,把 getATR 改写后接进 EA,按品种波动率动态切止损类型,可能比死守一种更稳。

MQL5 / C++
class="type">class="kw">double getATR(class="type">class="kw">string name){
  class="type">MqlRates rates[];
  ArraySetAsSeries(rates, true);
  class="type">class="kw">double atr=class="num">0;
  class="type">class="kw">double pre_atr=class="num">0;
  class="type">int count=class="num">0;
  
  class=class="str">"cmt">// 获取过去 class="num">7 天的柱线数据
  class=class="str">"cmt">//(这超过了需要,因为我们将计算 class="num">5 天的 ATR)
  class="type">int copied=CopyRates(name, PERIOD_D1, class="num">0, class="num">7, rates);
  
  class=class="str">"cmt">// 判定最近 class="num">7 天的 ATR,不包括
  class=class="str">"cmt">// 太大和太小的柱线
  if(copied>=class="num">5){
    for(class="type">int j=class="num">1; j<copied; j++){
      pre_atr+=rates[j].high-rates[j].low;
    }

用中等波幅柱线挤掉异常噪声

这段逻辑在算 ATR 前先做了一次“波幅体检”:以 7 天 ATR 为基准,单根柱线高低差超过 1.5 倍或小于 0.3 倍的,直接跳过不计入。这样最后参与平均的最多只有最近 5 根“中等身材”的柱线,极端拉伸或僵死行情不会被算进波动率。 如果筛完发现合格柱线不足 2 根,代码会回退到普通 5 根柱线(j=1 到 5)直接求和平均,避免样本过少把 ATR 估歪。最终用 NormalizeDouble 按品种小数位取整返回。 在 MT5 里把这段接进自己的指标,EURUSD H1 上跑一遍,对比标准 iATR 在重大数据夜的差值,往往能看出异常柱线被剔除后读数更平稳。外汇与贵金属杠杆高,波动过滤只是辅助,实际仓位仍要按风险承受来。

MQL5 / C++
  pre_atr/=(copied-class="num">1);
  }

  class=class="str">"cmt">// 判定最后 class="num">5 天或更少的 ATR,包括
  class=class="str">"cmt">// 太大和太小的柱线
  class=class="str">"cmt">// 即,尺寸超过 class="num">7 天 ATR 值  class="num">1.5 倍的柱线
  class=class="str">"cmt">// 和小于 class="num">7 天 ATR 值  class="num">0.3 倍的柱线
  class=class="str">"cmt">// 被丢弃
  if(pre_atr>class="num">0){
      for(class="type">int j=class="num">1; j<copied; j++){
          if( rates[j].high-rates[j].low > pre_atr*class="num">1.5 ) class="kw">continue;
          if( rates[j].high-rates[j].low < pre_atr*class="num">0.3 ) class="kw">continue;
          
          if( ++count > class="num">5 ){
              count=class="num">5;
              break;
          }
          
          atr+=rates[j].high-rates[j].low;
      }
      class=class="str">"cmt">// 如果没有足够的中等柱线
      class=class="str">"cmt">// 计算正常的 ATR class="num">5
      if(count<class="num">2){
          count=class="num">0;
          for(class="type">int j=class="num">1; j<=class="num">5; j++){
              ++count;
              atr+=rates[j].high-rates[j].low;
          }
      }
      atr= NormalizeDouble(atr/count, _Digits);
  }

  class="kw">return atr;
}

◍ 尾随停止不是稳赚开关

EA 提供两个尾随参数:Use constant trailing after N profit points 规定价格须在盈利方向走满 N 点后才激活尾随;Constant trailing in points 则是激活后止损距现价的点数。检查节奏绑定在 M15 每根柱线开盘,也就是每 15 分钟判一次。 触发尾随时,EA 除了推止损还会撤掉止盈,持仓此后只能靠止损或反向出场。逻辑上这能放长利润,但是否划算要看品种。 回测对照里分化明显:Tencent 盈利因子从 1.9 升到 2.3,年度收益 92% 变 178%;而 YM 在 1288 笔交易里盈利因子卡在 1.3 不动,Brent 回撤反而从 8721 扩大到 8790。星巴克、Petrobras、YM 这类长历史样本,尾随多数拖低收益,短历史品种的改善更像是随机扰动。 FOXA.m 是个例外:原链全被止损吞掉,开尾随后整条链保住。但同一品种重测结果波动极大,策略测试器对实际数据份额的取样(0%、2%、8$ 等)不固定,导致每次跑数都不一样。外汇和贵金属杠杆高,这类历史测试结果只能当参考,不能当成实盘依据。

把重复劳动交给小布
这些跨经纪商多品种的历史入场时点诊断,小布盯盘的 AIGC 已内置,打开对应品种页即可看到不同分钟入场的回测偏差,你只需专注定规则。

常见问题

此前文章未正规化入场点,任意时刻可入场,提前或滞后一分钟都无法保证相同利润增长,实盘时点随机性会放大结果差异,概率上更可能出现偏离。
可以,小布盯盘对应品种页内置了多经纪商历史时点的入场偏差视图,能帮你看清哪些分钟区间入场更稳,减少手动试错成本。
它允许立即成交或取消的填单方式,在手动算法里能避免挂单等待带来的滑点不确定性,更贴合正规化后的即时入场规则。
ATR 随波动率伸缩,百分比止损能跨品种保持风险尺度一致,避免高波动品种被轻易扫损或低波动品种止损过宽,回测中更倾向平滑回撤。