MT4编程实战:巧用指标构建外汇EA策略
在MT4编程中,如何将好用的指标应用到外汇EA上,是许多交易者关心的问题。本文将深入探讨这一过程,帮助您理解并实现指标EA化。
第一部分:指标
为了提升盈利概率,无论是专业机构还是个人交易者,都在研究各种交易规律并制作成指标。我们常会发现一些指标图线看起来非常完美,于是自然会想到依据指标的变化来进行交易。
但这样做真的能盈利吗?
能否盈利,关键在于这些指标是否存在“作弊”行为,即是否包含未来函数。未来函数是指指标在计算时,会依据当前K线的价格变动,对历史K线上的信号进行修改,比如将原本的卖出信号改为买入信号。这听起来有些不可思议,但确实存在。当然,还有其他EA特有的因素会影响盈利,这里暂不讨论。
判断指标是否含有未来函数,通常有两种方法:
1. 白盒校验(查看源码)
直接检查源码中的循环部分,如果存在修改历史曲线数组的行为,则可以断定含有未来函数。
2. 黑盒观察
如果没有源码,可以将指标加载到1分钟图线上,持续观察其信号变化,重点关注与当前K线状态最接近的历史K线上信号是否出现更改。若历史信号随当前K线变化而改变,则也说明存在未来函数。
在将指标EA化之前,必须确认指标不含未来函数,否则EA化将失去意义。
第二部分 指标EA化
接下来,我们介绍指标EA化的基本思路:
在EA中,通过iCustom函数读取指标的当前K线输出值,从而判断当前状态,决定是否入场或平仓反向入场。
iCustom函数的具体用法:
指标通常以曲线或箭头形式显示。我们可以将曲线和箭头视为数组,每条曲线或每个方向的箭头对应一个数组。数组的值对应每个K线的数据,有箭头的K线数组值为当时价格,无箭头则为“空”。
MT4帮助文档对iCustom的描述是:“计算指定的客户指标并返回其值”。该函数可以让您获取指定指标的第几个数组在第几根K线上的计算数值。
具体函数原型如下:
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)
该函数会计算指定的客户指标并返回其值。客户指标文件(*.EX4)必须放置在 terminal_directory\experts\indicators 目录下。
参数说明:
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线上的计算数值用于条件判断。
如果认为当前K线尚未结束,数值可能变化,导致信号反复,则可以选择取前一K线的指标数值作为判断基础。不过,使用当前K线数值可能带来不确定性,而使用前一K线数值可能错过最佳入场点,这是程序设计者需要权衡的问题。
另一个问题是,如何确保指标输出数值与肉眼所见信号一致。例如,若指标是变色线,通常由多个数组叠加显示不同颜色。我们只需比较不同颜色数组的数值,即可判断当前颜色,并作为EA的执行条件。
如果是箭头信号,同样提取数值:无箭头的K线对应数组值为“空”,有箭头则非空。利用这一特性,即可判断信号是否发生。
比如双色线指标,由两个数组分别显示不同颜色。当指标信号为某颜色时,将该颜色对应数组在当前K线的数值设为当前价,另一数组设为“空”。如此循环,视觉上便呈现变色线效果。
现在,我们可以轻松获得指标的当前信号状态,接下来就是将其整合到EA中。
第三部分 EA 编程逻辑
EA本质上是一个循环过程,每个新价格到来时运行一次。
EA是计算机程序,并不了解您的仓位或指标情况,只能执行编程者赋予的逻辑。因此,编程者必须建立综合状态的概念。
EA开始时,首先检查仓位情况,大致逻辑如下:
1. 检查当前持仓情况与持仓方向。
2. 获取指标的当前数值。
3. 根据持仓状态判断并操作。
持仓状态下:根据持仓方向,判断反向信号是否发生。若发生,则平仓并反向入场;若未发生,则直接返回,等待下一价格触发。
空仓状态下:则需检查多空两个方向的信号,哪个方向先触发,Rock官网就按哪个方向入场。
4. 其他细节:
无论入场还是出场,发出指令后必须立即确认交易是否成功执行。若未成功,则应放弃后续操作并直接返回,等待下一个价格信号再重复指令。
另外,价格数据会自动更新,EA会随每次价格变动自动执行相应逻辑。
