如何将指标成功转化为EA

第一部分:了解指标

为了能在交易中实现盈利而非亏损,无论是专业交易者还是个人投资者,都在不断研究和总结各种规律,并将其制作成指标。我们常常会发现一些指标图线看起来非常完美,于是自然会想到根据指标的变化进行交易。

但这样做真的能赚钱吗?

能否盈利,我们需要判断这些指标是否存在作弊行为,即确定指标是否包含未来函数。简单来说,未来函数会让指标根据当前的K线数据,在历史K线上修改标示结果。例如,原本显示“卖出”的信号,可能会被改为“买入”。(这听起来确实令人担忧。当然,还有一些EA特有的因素也会影响盈利,这里不再赘述。)

判断指标是否含有未来函数,通常有两种方法:

1. 白盒校验(即查看源代码)

直接查看源码中的循环部分。如果存在修改历史曲线数组的行为,则可以立即断定该指标含有未来函数。

2. 黑盒观察

当没有源码时,可以将指标加载到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)

该函数用于计算指定的客户指标并返回其值。客户指标必须编写在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运行的第一步,通常是检查当前的仓位情况。大致的逻辑如下:

1、先查询持仓情况以及持仓单的方向。

2、然后获取指标的数值。

3、进行判断并执行操作。

在有持仓的情况下:根据持仓单的方向,判断反向信号是否出现。如果出现,则平仓并反向入场。如果没有出现,则直接返回,等待下一次价格更新。

在空仓状态下:则对两个方向的信号都进行判断,哪个方向的信号出现,就按哪个方向入场。

4、其他细节

无论是入场还是出场,在执行动作后都要立刻判断是否成功执行。如果没有成功,则必须立即放弃后续操作并直接返回,等待下一个价格到来时再次尝试发出同样的动作。