指标转EA实战教程:从验证到编程全解析
第一部分:指标验证
为了提升交易盈利能力,无论是专业机构还是个人投资者,都在不断研究和总结市场规律,并据此开发各种技术指标。我们常会看到一些指标曲线在图表上表现近乎完美,于是自然希望依据这些指标进行交易决策。
但这样的做法真的能带来盈利吗?
能否盈利,关键在于指标是否存在作弊行为,即确认指标是否使用了未来函数。所谓未来函数,是指指标在计算时,可能会根据当前的K线数据,对历史K线上的信号进行修改。例如,原本显示卖出信号的K线,经过计算后可能被更改为买入信号,这无疑会误导交易者。当然,还有其他一些与EA相关的因素可能影响盈利,此处暂不展开。
判断指标是否包含未来函数,通常有两种方法:
1. 白盒校验LMAX官网(即查看源代码)
直接检查源代码中的循环部分,如果存在对历史曲线数组进行修改的语句,则可以立即确认存在未来函数。
2. 黑盒观察
在无法获取源代码的情况下,可以将指标加载到1分钟图表上,连续观察其信号标示的变化,尤其关注与当前K线最接近的历史K线信号是否发生改变。如果随着当前K线的更新,历史K线上的信号出现变动,则同样可以判定存在未来函数。
将指标EA化之前,必须确认以下事项:
如果一个指标含有未来函数,则该指标的实际参考价值有限。因此,在将指标转换为EA之前,务必先验证指标不含未来函数,这样EA化才有实际意义。
第二部分 指标EA化的实现
接下来,我们介绍指标EA化的基本思路:
在EA中,通过iCustom函数读取指定指标的当前K线输出值,进而判断当前市场状态,决定是否开仓或平仓并反向开仓。
iCustom函数的具体用法:
指标通常以曲线或箭头两种形式展示。这里我们可以将曲线和箭头都视为数组,以便更好地理解。对于指标而言,每条曲线或每个方向的箭头都对应一个独立的数组,数组中的数值与K线一一对应。例如,有箭头的K线位置,数组值为当时的指标数值;无箭头的K线位置,数组值为“空”。
MT4帮助文档中对iCustom函数的描述是:“计算指定的客户指标并返回其值”。通过该函数,我们可以获取指定指标的某个数组在指定K线上的计算数值。
具体函数原型如下:
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)
该函数用于计算指定的客户指标并返回其值。客户指标必须存放在terminal_directoryexpertsindicators目录下,文件格式为*.EX4。
参数说明:
symbol:指定计算指标所使用的货币对名称,NULL表示当前货币对。
timeframe:时间周期,可选用时间周期枚举值,0表示当前图表的时间周期。
name:客户指标的完整程序名称。
...:参数设置(如有需要),传递的参数及其顺序必须与客户指标中外部变量的声明顺序和类型一致。
mode:索引行,取值范围从0到7,必须与指标中使用的SetIndexBuffer函数所定义的索引相对应。
shift:从显示缓冲区获取值的索引,即相对于当前柱的偏移量。
示例:
double val=iCustom(NULL, 0, "示例Ind",13,1,0);
double va2=iCustom(NULL, 0, "示例Ind",13,0,1);
例如,一个指标画了两条曲线,我们可以通过iCustom获取该指标在第4根K线上第一条曲线的数值。
现在,我们已经能够根据需求获取任意指标在任意K线上的状态数值。接下来,我们需要进入EA编程的概念。
由于EA仅对当前价格状态下的操作进行控制,因此通常我们仅获取指标在当前K线上的计算数值,作为EA的条件判断依据。
如果担心当前K线尚未结束,其数值会实时变化,可能导致信号时有时无,那么我们可以采用前一K线的指标数值作为判断基准。不过,使用当前K线数值作为条件可能面临结果不确定的问题,而使用前一K线数值则可能错过最佳入场时机,这需要编程者在设计时综合考虑。
另一个常见问题是如何将指标输出的数值与我们肉眼看到的信号保持一致。如果参考指标是变色线,通常是通过多个颜色数组叠加显示。我们在提取数值时,只需比较不同颜色数组的数值,即可确定当前显示的颜色,并以此作为EA的操作条件。
若是箭头类指标,同样获取其数值,无箭头的K线对应的数组值为“空”,而有箭头的K线数组值则非空,据此判断信号是否触发。
例如,双色线指标会定义两个数组分别显示不同颜色。当指标判定应显示某种颜色时,会将对应颜色数组在当前K线上的数值设为当前价格,另一数组则设为“空”。如此循环运行,最终呈现为变色线效果。
现在,我们已经能够轻松获取指标的当前信号状态,下一步就是将这些信号融入EA中,即获取指标数组的数值。
第三部分 EA编程逻辑
EA本质上是一个循环往复的过程,每当价格更新时,EA会运行一次。EA本身并不了解当前的持仓状态或指标状态,除了计算之外,它只执行编程者赋予的逻辑。因此,编程者需要在脑中构建一种综合状态的概念。
EA启动后,首先应检查持仓情况。大致的逻辑如下:
1、查询当前持仓情况以及持仓单的方向。
2、获取指标的数值。
3、根据持仓状态进行判断和操作。
持仓状态下:根据持仓单的方向,判断反向信号是否触发。如果触发,则平仓并反向开仓;如果未触发,则直接返回,等待下一次价格更新。
空仓状态下:则对两个方向的信号都进行判断,哪一方向触发,就按该方向开仓。
4、其他细节
不论开仓还是平仓,在执行动作后,应立即判断该动作是否正确执行。如果未能成功执行,则必须放弃后续操作并直接返回,待下一次价格更新时再次尝试执行。
