只看收盘K线判断的EA,为什么不会重绘
先说结论:只看收盘K线判断的EA,信号之所以不易改变,是因为判断依据在那一刻已经不再变动。形成中的K线,收盘价、最高价、最低价都可能在下一个Tick发生变化。而已经收盘的K线,其四个价格(开高低收)通常在收盘后不会再动。
不过,读取收盘K线并不等于绝对安全。受指标计算方式或高周期处理方式的影响,即使你以为用的是收盘K线,也可能混入了未来的数值。
为什么形成中的K线有风险
在MQL5中,shift 0是形成中的K线,shift 1是最近一根收盘K线。shift 0的收盘价只是"当前价格"。如果用它来做判断,就会出现以下问题:
- 条件随Tick时成立时消失,入场的依据事后又不见了
- 因一个收盘后不会留在图表上的瞬间信号而成交
- 在策略测试器中,结果容易因Tick的生成方式而改变,K线内的价格走势一旦与实际不同,差异会直接体现在业绩上
| 项目 | 形成中K线(shift 0) | 收盘K线(shift 1及以前) |
|---|---|---|
| 判断依据的数值 | 收盘前持续变化 | 通常不变 |
| 信号的可复现性 | 低 | 高 |
| 入场速度 | 快 | 需等待收盘,因此偏慢 |
| 测试器Tick模式的影响 | 判断本身可能改变 | 对判断的影响较小(平仓仍会受影响) |
使用形成中K线并非总是错误。有些设计就是要即时捕捉突破。这种情况下,需要承认策略依赖K线内的走势,并更加重视用真实Tick进行验证。
推荐经纪商比较 →
🎁 免费下载EA📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集
订阅后会立即收到订阅者专享合集的下载链接,内含本站 13 款 MT5 指标的已编译文件(.ex5)、源代码和使用指南。随后通过共 8 封邮件介绍外汇自动交易的本质、回测的正确解读方法和经纪商选择技巧(前 5 天每天 1 封,之后在订阅第 7、14、30 天各 1 封)。MQL5 Market 版(首发价,随销量分阶段涨价)涨价前也会通知您。在本站,只要拥有合作经纪商的真实账户,EA 即可免费使用。
※ 严格保护隐私。可随时取消订阅。
信号确定的设计方法
CopyRates要明确起始位置和排列顺序
在新K线的第一个Tick上,只读取一次收盘K线。
datetime g_lastBar = 0;
void OnTick()
{
datetime t = iTime(_Symbol, _Period, 0);
if(t == 0 || t == g_lastBar) return;
MqlRates r[];
ArraySetAsSeries(r, true);
if(CopyRates(_Symbol, _Period, 1, 2, r) != 2) return;
g_lastBar = t;
// r[0]是最近一根收盘K线,r[1]是它的前一根
}
要点有三个:起始位置设为1,把形成中的K线排除在获取范围之外;用 ArraySetAsSeries 指定排列顺序;获取失败时不更新 g_lastBar,在下一个Tick重试。如果忘记指定排列顺序,数组的第一个元素会是最旧的K线。
iBarShift在高周期上是个陷阱
引用高周期时,iBarShift 返回的是"包含该时刻的K线"。传入当前时间,通常返回的是形成中的高周期K线。
int s = iBarShift(_Symbol, PERIOD_H1, TimeCurrent(), false);
if(s < 0) return;
double closedH1 = iClose(_Symbol, PERIOD_H1, s + 1);
如果想要已收盘的高周期K线,就像这样指定再早一根的K线。
典型的重绘出现在"在低周期图表上绘制高周期数值"的指标中。如果给过去的每一根低周期K线都分配包含同一时刻的高周期收盘价,那么当时尚不存在的最终值就会被画到过去。图表上看起来每次都命中,但实时行情中无法做出同样的判断。
第4个参数 exact 设为 false 时,若没有对应的K线,会返回相近的K线。这会让数据缺失不易被察觉,因此建议同时检查所获取K线的时间。其他品种或其他周期的数据有时更新会滞后,所以要先核对是否为预期时刻的K线,再做判断。
防止重启时重复判断
上面代码中的 g_lastBar 会在EA重启后回到初始值。为避免对同一根收盘K线再次判断而重复入场,设计上还需要确认持仓以及最近一次的成交时间。
用户可以做的确认步骤
即使看不懂源代码,也可以用下面的方法做一定程度的验证。
- 用可视化模式观察:在测试器的可视化模式中,确认入场时间是否集中在K线开始附近。如果经常在K线中途成交,就可能用到了形成中的K线(平仓另当别论)。
- 改变建模方式进行对比:用相同的期间和相同的设置,分别尝试"仅开盘价""所有Tick""基于真实Tick的所有Tick"。如果入场次数或时间出现很大偏差,就要怀疑存在对K线内走势的依赖。
- 记录指标箭头:把箭头出现的时刻用截图等方式保存下来,几根K线之后再对照。如果位置变了或消失了,就是在重绘。
- 向发布方确认:询问是否以收盘K线判断,以及如何处理高周期数据。
这些都只是旁证,仅凭它们无法证明"不会重绘"。如果想试用指标,可以先用免费指标练习上述步骤,EA的安装请参考EA设置方法。
局限与注意事项
以收盘K线判断也有不利的一面。
- 入场会延迟:等待收盘的期间价格已经走远,可能在不利的位置入场。在急涨急跌的行情中,这个差距可能很大。
- K线开始时的成本:如果设计成订单集中在新K线的第一个Tick发出,就可能受到点差扩大的时段或跳空的影响。
- 无法防范引用未来数据的指标:像ZigZag这样事后形态会改变的指标,或需要后续K线才能确定的指标,取决于读取的位置,即使是收盘K线,数值也可能改变。
- 收盘K线也因经纪商而异:服务器时间或报价源不同,四个价格也会不同,因此同一个EA换了经纪商,判断也可能改变。历史数据事后被修正的可能性同样无法排除。
- 平仓发生在K线内部:即使入场判断基于收盘K线,止损和止盈也会在K线中途成交。这部分仍然取决于Tick的质量。
最重要的一点是:不重绘并不等于能盈利。我们的EA中,也有在历史数据验证中表现良好,但在模拟账户的前向测试中却是亏损的。是否使用收盘K线,只是信任验证结果的前提之一,并不代表未来的业绩。另外,是否使用收盘K线因EA的设计而异,选择EA时请逐一确认,并结合实测排行榜中的数字综合判断。与此相关的验证思路,我们整理在EA・MT5知识库中。
总结
- 形成中K线的数值在收盘前会变动,因此信号可能消失或改变
- 以收盘K线判断,判断依据就被固定下来,也不易受Tick生成方式的影响
CopyRates要明确起始位置和排列顺序,获取失败时重试iBarShift容易返回形成中的高周期K线,读取收盘K线时要把shift往前错开- 高周期数值的绘制,以及引用未来数据的指标,是重绘的典型例子
- 收盘K线存在延迟和成本问题,并不能保证盈利
相关文章
📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集
订阅后会立即收到订阅者专享合集的下载链接,内含本站 13 款 MT5 指标的已编译文件(.ex5)、源代码和使用指南。随后通过共 8 封邮件介绍外汇自动交易的本质、回测的正确解读方法和经纪商选择技巧(前 5 天每天 1 封,之后在订阅第 7、14、30 天各 1 封)。MQL5 Market 版(首发价,随销量分阶段涨价)涨价前也会通知您。在本站,只要拥有合作经纪商的真实账户,EA 即可免费使用。
※ 严格保护隐私。可随时取消订阅。