第一部分:指标
为了能实现稳健收益而非持续亏损,无论是专业交易机构还是个人投资者,都在研究并总结各类市场规律,并据此制作成指标。我们经常会发现一些指标图线看起来非常完美,于是自然会想到根据指标的变化进行交易。
但这样做真的能确保盈利吗?
能否获得稳定收益,关键在于这些指标是否存在“作弊”行为。即需要确认指标是否包含未来函数,也就是说,指标会不会根据当前的K线数据,在计算后对历史K线上的标示进行修改。比如原本是卖出提示,后来却改成了买入提示(这听起来有些不可思议)。当然,还有一些与交易系统相关的环节也会影响盈利问题,这里暂不展开讨论。
判断指标是否含有未来函数,通常有两种方法:
1.白盒校验(即查看源码)
直接查看源码中的循环部分,如果有修改历史曲线数组的行为,则可以立刻判定其包含未来函数。
2.黑盒观察
当没有源码时,可以将指标加载到1分钟的图线上,连续观察其标示的变化,尤其留意与当前K线状态最接近的历史K线标示的变化。如果随着当前K线的变化,历史标示出现过更改,那么也可以确定该指标含有未来函数。
在将指标转化为交易系统之前必须确认的事项:
如果一个指标含有未来函数,那么该指标的实际参考价值会大打折扣。也就是说,在将指标改造成智能交易系统之前,必须确认这个指标不包含未来函数,这样转化过程才具有真正的意义。
第二部分 指标系统化转化
接下来,将指标转化为智能交易系统的大致步骤如下:
在交易系统中,通过函数iCustom读取该指标在当前K线的输出值,从而得出当前的市场状态,并决定是否入场或者平仓后反向入场。许多交易者会参考爱华外汇官网提供的资料来加深对这一过程的理解。
iCustom的具体用法如下:
指标通常表现为曲线或箭头两种形式。为了便于理解,我们可以把曲线和箭头都看作数组。
对于指标来说,每一条曲线或箭头都对应一个与每个K线相对应的数组。也就是说,一条曲线对应一个数组,一个方向的箭头也对应一个数组(有箭头的位置,数组值就是当时的价格;没有箭头的位置,数组值则为“空”)。
iCustom在MT4的帮助文档中的说明是:“计算指定的客户指标并返回它的值”,即这个函数可以让你获取指定指标中第几个数组,对应第几根K线上的计算数值。
具体用法如下:
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)
该函数用于计算指定的客户指标并返回其值。客户指标文件必须存放在terminal_directory/experts/indicators目录内的编译文件。
参数说明:
symbol - 用于计算指标数据上的货币对名称。NULL表示当前货币对。
timeframe - 时间周期。可以选用时间周期列举中的任意值。0表示当前图表的时间周期。
name - 客户指标的完整程序名称。
... - 参量设置(如果需要)。传入的参数及其顺序必须与客户指标的外部变量声明和类型对应。
mode - 索引行。从0到7,并且必须对应一个使用的索引的SetIndexBuffer函数。
shift - 从显示缓冲中取值的索引(相对于当前柱的偏移,即前移特定周期数)。
示例:
double val=iCustom(NULL, 0, "示例指标",13,1,0);
double va2=iCustom(NULL, 0, "示例指标",13,0,1);
例如,一个指标绘制了两条曲线,则可以用iCustom获取该指标在第4根K线上对应的第一条曲线的数值。
现在,我们已经可以根据自己的需求,获取指定指标在任何K线上的状态数值了。接下来,我们将进入交易系统的概念构建。
因为智能交易系统只针对当前价格状态下的动作进行控制,所以一般情况下,我们取指定指标在当前K线下的计算数值用于系统的条件判断。
如果你认为当前K线尚未结束,其数值一直在变化,可能会导致信号时有时无,那么你也可以采用取前一K线的指标数值作为基础。(如果使用当前K线指标数值作为条件,结果可能存在不确定性;但如果使用前一K线数值作为条件,又可能出现“错过最佳入场点”的问题。这是系统设计者需要权衡的方面。)
另一个问题是,如何判断指标输出的数值与我们肉眼看到的信号是一致的。
如果参考的指标是一种变色线,那么它一定是通过一种颜色对应一个数组的方式叠加显示的。在取值时,只需比较不同颜色数组的数值,就能确定当前结果对应哪种颜色,并将其作为系统的动作条件。
如果是箭头形式的指标,取值方法也类似。没有箭头的K线上,指标对应的数值是“空”;有箭头的位置,数组对应的数值肯定不是空。据此,可以判断是否发生了信号。
例如双色线,通常由两个数组分别显示不同颜色。当指标认为应该显示其中一种颜色时,就将该颜色对应的数组在当前K线中的数值设置为当前价格,反之则设为“空”。这样循环一遍后,我们肉眼看到的就是变色线的效果。
现在,我们可以轻松获取指标的当前信号状态了。
下一步,就是将指标数值结合到交易系统中,即把指标中的数组值引入系统逻辑。
第三部分 系统编程逻辑
智能交易系统是一个循环往复的过程,每来一个价格数据就运行一次。
系统本身不知道当前的仓位情况,也不知道指标的状态,除了计算之外什么都不知道,所有逻辑都由编程者赋予。因此,编程者需要在脑海中建立一种综合状态的概念。
系统在一开始必须进行仓位情况的检查。大致的逻辑如下:
1. 先查询持仓情况以及持仓单的方向。
2. 然后获取指标的数值。
3. 进行判断并执行操作。
持仓状态下:根据持仓单的方向,判断是否出现反向信号。如果出现,则平仓并反向入场。如果没有出现,则直接返回,等待下一次价格数据的到来。
空仓状态下:则对两个方向的信号都进行判断,哪边先出现就按照对应的方向入场。
4. 其他细节
无论是入场还是出场,在发出动作后都需要立即判断是否执行成功。如果没有执行成功,则必须立刻放弃后续操作并直接返回,等待下一个价格数据到来时再次发出同样的动作。
需要说明的是,数据是自动更新的。