外汇交易中技术指标转化为EA智能交易系统的方法
第一部分:指标
为了在交易中实现盈利而非亏损,无论是专业交易商还是个人投资者,都在不断研究和总结各种规律,并将其制作成指标。我们常常会发现一些指标图线看起来非常完美,于是自然而然地想到要根据这些指标的变化来进行交易。
但这样做真的能赚钱吗?
能否盈利,关键在于这些指标是否存在作弊行为。也就是说,我们需要确定指标是否包含未来函数,即指标是否会根据当前的K线数据,在计算后对历史K线上的指标标示进行修改。例如,原本是卖出信号,却改变为买入信号(这听起来有点不可思议,但确实存在)。当然,还有一些EA特有的因素也会影响盈利,这里暂不赘述。
判断指标是否含有未来函数,有两种常用方法:
1. 白盒校验(即查看源码)
直接检查源码中的循环部分,如果存在修改历史曲线数组的行为,则可以立即断定该指标包含未来函数。
2. DLSM外汇黑盒观察
在没有源码的情况下,可以将指标加载到1分钟的图线上,持续观察其标示的变化,尤其注意与当前K线状态最接近的历史K线标示是否发生变动。如果随着当前K线的变化,历史标示出现过更改,那么也可以确定该指标含有未来函数。
在指标EA化之前,必须确认的事项:
如果一个指标含有未来函数,那么这个指标的意义就大打折扣。也就是说,在将指标转化为EA之前,我们必须确认该指标不包含未来函数,这样指标EA化才有实际价值。
第二部分:指标EA化
接下来,我们将大致介绍指标EA化的做法:
在EA中,通过iCustom函数读取该指标的当前K线输出值,从而得出当前状态,并据此决定是否入场或平仓后反向入场。
iCustom的具体用法:
指标通常以曲线或箭头两种形式呈现。在这里,我们可以将曲线和箭头都视为数组,这样更容易理解。
对于指标而言,每条曲线或箭头都对应着与每根K线相关的数组。也就是说,一条曲线对应一个数组,一个方向的箭头也对应一个数组(有箭头的位置数组值为当时的价格,无箭头的位置数组值为空值)。
iCustom在MT4帮助中的描述是:“计算指定的客户指标并返回其值”,即该函数可以让你获取指定指标中特定数组在特定K线上的数值。
具体参数如下:
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)
该函数用于计算指定的客户指标并返回其值。客户指标(*.EX4文件)必须编写在terminal_directoryexpertsindicators目录内。
参数说明:
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线中的数值设置为当前价格;反之,则设置为空值。如此循环往复,你看到的便是变色线。
现在,我们可以轻松获取指标的当前信号状态了!
下一步,就是将其结合到EA中,即把指标中的数组值引入EA逻辑。
第三部分:EA编程逻辑
EA本质上是一个循环往复的过程,每一次价格变动都会触发一次运行。
EA本身是计算机程序,它无法感知你的仓位状况,也无法理解指标的含义,除了计算之外,它什么都不了解,一切行为都由编程者赋予。因此,编程者需要在脑海中建立一个综合状态的概念。
在EA的起始阶段,必须先进行仓位检查。基本逻辑如下:
1. 首先查看当前持仓情况和持仓单的方向。
2. 然后获取指标的数值。
3. 根据判断进行相应操作。
在持仓状态下:根据持仓单的方向,判断是否发生反向信号。如果反向信号出现,则平仓并反向入场;如果未出现,则直接返回,等待下一次价格变动。
在空仓状态下:则需要对两个方向的信号都进行判断,哪个方向先出现信号,就按哪个方向入场。
4. 其他细节
无论是入场还是出场,在执行动作后必须立即确认是否正确执行。如果没有成功执行,则应立刻放弃后续操作并直接返回,等待下一个价格触发时再次尝试相同的动作。
另外需要说明的是,数据是自动更新的。
