MT4编程:技术指标转化为智能交易系统指南

第一部分:指标

为了追求盈利而非亏损,无论是专业交易机构还是个人投资者,都在不断研究和总结市场规律,并将其制作成技术指标。我们常会看到一些指标图形看起来十分完美,于是自然想到依据指标信号进行交易。

但这样做真的能盈利吗?

能否盈利,关键在于这些指标是否存在“作弊”行为,即指标是否包含未来函数。也就是说,指标会不会依据当前K线数据,在计算后改写历史K线上的信号标识。例如,原本显示卖出信号的位置,后来被改为买入信号(这听起来有些不可思议)。当然,其他EA特有的环节也可能影响盈利,此处暂不展开。

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

1. 白盒校验CWG Markets法(即查看源码)

直接检查源码中的循环部分,若存在修改历史曲线数组的代码,则可断定含有未来函数。

2. 黑盒观察法

在无法获取源码的情况下,可将指标加载到1分钟图表,持续观察其信号变化,尤其关注与当前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 - 从显示缓冲中获取值的位移量(相对当前柱向前推移的K线数量)。

示例:

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. 其他细节

无论开仓还是平仓,发出指令后都必须立即检查执行是否成功。若未成功,应立刻放弃后续操作并直接返回,等待下一价格到来时再次尝试。

另外,所有行情数据均自动更新,无需人工干预。