图表秒验交易理念:信号指标法
用 MQL5 指标在图表上快速验证交易想法
为什么需要快速检验交易理念
在第六届自动交易锦标赛中,作者统计了 451 个参赛 EA,仅 316 个有有意义说明。最受欢迎的策略是图形结构、价格变动分析与趋势追踪,指标使用频率最高的是移动平均线(75次)、MACD(54次)与随机摆动(25次)。这反映出一个问题:大量交易者盲目套用规则与指标,缺乏对市场行为的真正理解。新人常被灌输‘标准信号+优化参数=赚钱’的误区,却很少思考指标背后的逻辑。要突破这一点,必须回到价格本身,通过视觉分析发现价格与指标间未被预期的相关性,而快速验证这些想法是提升认知的关键一步。
传统做法是编写一个 EA 并用历史数据测试,但 EA 测试涉及数据加载、订单模拟与复杂逻辑,耗时明显。对于初步想法,这种重量级流程会拖慢探索节奏。我们需要一种轻量、直观且能在一张图表上同时看到信号与结果的方案,这就是本文方法的价值所在。
方法核心:信号指标与余额指标分离
该方法建立在技术分析的基本假设上:价格反映一切,但静态图表无法告知未来。指标实质是价格的一阶导数(变化速率)的估计,趋势则是导数保持平稳的价格状态。要发现新相关性,应仔细研究价格及其派生物的行为。当发现一个有利相关性后,不必立即写 EA,而是先将其转化为指标信号:卖出为 -1,买入为 1。随后连接一个‘余额指标’,它在同一图表窗口或子窗口中根据信号虚拟开平仓,画出余额与净值曲线。
- 创建或改造指标,使其输出信号缓冲区:-1 卖开,1 买开,2 卖平,-2 买平,0 无信号
- 添加余额指标到图表,它读取信号缓冲区并计算固定手数下的余额/净值点位变化
- 直接在图表上分析信号成立与失效的情形,找出市场状态相关性
实操案例:锤线与射击之星模式
为演示方法,作者选择经典反转型烛形:锤线(买入)与射击之星(卖出)。定义规则如下:烛形极值超越前 5 根极值;实体不超过总高 50%;影线不超过 0%(即无反向影线);高度不小于前 5 根平均高度的 100%;收盘价位于 10 周期 SMA 另一侧。退出用价格回穿 SMA 实现。这些参数中,周期与阈值均可后续优化。
我们将计算类 CPivotCandlesClass 与绘图指标 PivotCandles.mq5 分离,符合良好编程习惯。信号缓冲区返回:1 买开、-1 卖开、2 卖平、-2 买平。编译后附加到图表,彩色箭头标出深浅红蓝买卖与平仓点。下一步用余额指标连接其信号缓冲区。
//+------------------------------------------------------------------+
//| PivotCandles.mq5 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_label1 "SlowMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrAliceBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_label2 "ChartSignal"
#property indicator_type2 DRAW_COLOR_ARROW
#property indicator_color2 clrLightSalmon,clrOrangeRed,clrBlack,clrSteelBlue,clrLightBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 3
#include <PivotCandlesClass.mqh>
double SMA[];
double Signal[];
double ChartSignal[];
double SignalColor[];
CPivotCandlesClass PivotCandlesClass;
int OnInit()
{
SetIndexBuffer(0,SMA,INDICATOR_DATA);
SetIndexBuffer(1,ChartSignal,INDICATOR_DATA);
SetIndexBuffer(2,SignalColor,INDICATOR_COLOR_INDEX);
SetIndexBuffer(3,Signal,INDICATOR_CALCULATIONS);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
return(0);
}
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[])
{
if (prev_calculated == 0) PivotCandlesClass.CleanupHistory();
int end_calc_edge = rates_total-1;
if (prev_calculated >= end_calc_edge) return end_calc_edge;
for(int i=prev_calculated; i<end_calc_edge; i++)
{
int signal = PivotCandlesClass.AnalizeNewCand
余额指标的实现与参数
余额指标 Balance.mq5 通过名称查找父指标句柄,读取指定信号缓冲区,按固定手数虚拟交易。输入参数包括:iParentName(父指标名,必填)、iSignalBufferIndex(信号缓冲索引)、iStartTime 与 iEndTime(计算区间)。它分离出 CBaseBalanceCalculator 类,用 FindIndicatorHandle 遍历图表找句柄,再逐根计算余额和净值。
配置时,将 Balance 附加到已有 PivotCandles 的图表,指定父名与信号索引(例如 3 号计算缓冲)。编译后子窗口出现余额直方图与净值线,零轴虚线辅助判读。重算仅需约一秒,远快于 EA 回测。
//+------------------------------------------------------------------+
//| Balance.mq5 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 3
input string iParentName = "";
input int iSignalBufferIndex = -1;
input datetime iStartTime = D'01.01.2012';
input datetime iEndTime = 0;
double Balance[]; double BalanceColor[]; double Equity[]; double Zero[];
double Signal[1]; int parent_handle;
CBaseBalanceCalculator calculator;
int OnInit()
{
SetIndexBuffer(0,Balance,INDICATOR_DATA);
SetIndexBuffer(1,BalanceColor,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,Equity,INDICATOR_DATA);
SetIndexBuffer(3,Zero,INDICATOR_DATA);
parent_handle = FindIndicatorHandle(iParentName);
if (parent_handle < 0) { Print("Error! Parent indicator not found"); return -1; }
return(0);
}
与其他验证方案对比
与完整 EA 回测相比,本方法省去订单管理、品种属性与滑点模拟,专注信号逻辑与价格响应,适合想法萌芽期。与单纯目视观察相比,它提供量化盈亏曲线,避免主观偏差。与策略测试器优化相比,它不支持参数扫描,但可即时切换周期与品种。对于神经网络或套利类复杂逻辑,信号指标法仍需简化为离散信号,不如直接写 EA 灵活。
- EA回测:功能全但慢,适合终验
- 目视观察:快但无度量
- 信号指标法:快且有曲线,适合初筛
常见坑与解决思路
用户评论中提到 OnCalculate 中 OHLC 数组值相同、时间返回 1971,通常因指标附加到不存在数据的时间帧或句柄错误。应确保父指标已编译且名称精确匹配。信号缓冲索引填错会导致余额指标读不到信号。另外,固定手数计算会夸大微小点值品种的波动,应结合点值理解曲线。局限性中的无 MM 可通过改 Calculate 类加入仓位比例轻松改善。
总结与延展
该方法以极快速度实现信号可视化与存款响应分析,虽有限制但优点突出。交易者可用此框架测试任何自定义形态、指标交叉或统计模式,再决定是否投入 EA 开发。原文附 PivotCandles 与 Balance 全套代码,读者可下载改造。理解价格行为远比套用标准更重要,这套工具正是桥梁。原文地址:https://www.mql5.com/ru/articles/505