优质指标如何有效应用于EA策略

第一部分:指标

为了追求盈利而非亏损,无论是专业交易机构还是个人投资者,都在不断研究和总结各种规律,并据此开发出技术指标。我们常常会发现某些指标图线看起来非常理想,于是自然想到要依据这些指标的变化来进行交易。

但这样做真的能赚钱吗?

能否盈利,关键在于这些指标是否存在“作弊”行为,即确认指标是否包含未来函数的计算。也就是说,指标是否会根据当前的K线数据,在计算后对历史K线上的标示进行修改。例如,原本显示卖出的信号,后来被改为买入信号(听起来确实令人担忧)。当然,EA特有的其他环节也会影响盈利,此处暂不讨论。

判断是否存在未来函数的方法主要有两种:

1. 白盒校验FXTM外汇平台(即查看源代码)

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

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_directory/experts/indicators目录内(*.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线上的数值被设为当前价格;反之,则设为“空”。经过循环处理后,肉眼便看到了变色线效果。

至此,我们可以轻松获取指标的当前信号状态!

下一步,就是将指标数值整合到EA中,实现自动化交易。

第三部分:EA编程逻辑

EA本质上是一个循环往复的过程,每当新的价格到来时运行一次。

EA作为计算机程序,并不了解当前的持仓状况或指标状态,除了计算外一无所知,所有逻辑都由编程者赋予。因此,编程者必须在脑海中建立一种综合状态的概念。

EA运行之初,首先需检查仓位情况,大致逻辑如下:

1. 查询当前持仓情况以及持仓单的方向。

2. 获取当前指标的数值。

3. 进行判断并执行相应操作。

持仓状态下:根据持仓单的方向,判断是否出现反向信号,若出现则平仓并反向入场;若未出现,则直接返回,等待下一次价格变动。

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

4. 其他细节处理

无论入场还是出场,在发出指令后应立即确认是否成功执行。若未成功,则立即放弃后续操作,直接返回,等待下一个价格到来时再次发出相同指令。

此外,需要说明的是,行情数据会自动更新。