神说:打开走势图看到的就是走势。程序不是神,程序该怎么看?程序得能自动找到合适最低价和最高价才行。
有人说,在大的周期图表上画笔,把最后一笔看做当下走势。这是一种方法。
还有一种比这个简单,而且比缠论的笔更准确的辨认高低点。那就是ZigZag算法,这是MT4软件中附带的一个计算走势波峰波谷的算法。
利用此算法,找到最后一段向上或向下的走势就是我们要研究的对象。
ZigZag算法
3个输入参数:
- depth: 计算深度(k线数量),是指在从当前k线往前depth根k线内找最高价或最低价,包含当前k线
- deviation: 偏离点数,是指当前k线最低价与在depth范围内找到的最低价的差值大于deviation时,就放弃该最低价;在depth方位内找到最高价与当前k线最高价的差值大于deviation时,就放弃该最高价。deviation是个整数,对于外汇其单位是点数(不是微点数);对于股票其单位是分。
- backstep: 回探柱数(k线数量),是指当在depth范围内找到最低价时,从当前k线往前的backstep根k线范围内,如果有之前找到的最低价且该价格大于新的,那就把之前的价格删掉;当在depth范围内找到最高价时,从当前k线往前的backstep根k线范围内,如果有之前找到的最高价且该价格小于新的,那就把之前的价格删掉;backstep中不包含当前k线。这个参数的使用使得zigzag算法修改了之前的结果,这是称之为“未来函数”的原罪。要求backstep必须小于depth。
2个输入数组:
k线的最高价数组和最低价数组,这两个数组的长度必须相同。
3个输出数组:
高低价混合数组、高价数组和低价数组。这三个数组长度与输入数组的长度相同。
逻辑说明:
先将3个输出数组清零。然后,
-
从第depth根k线开始循环,直到最后一根:
- 在从当前k线开始往前depth根k线范围内,找到最低价,如果该最低价已经用过就放弃;否则记住该最低价。
- 检查该最低价是否偏离,是则放弃,否则在backstep范围内检查低价数组中是否存在更高的最低价,有就清零,没有就过。
- 如果该最低价就是当前k线最低价,那就放到低价数组中,不是就不放。
- 在从当前k线开始往前depth根k线范围内,找到最高价,如果该最高价已经用过就放弃;否则记住该最高价。
- 检查该最高价是否偏离,是则放弃,否则在backstep范围内检查高价数组是否存在更低的最高价,有就清零,没有就过。
- 如果该最高价就是当前k线的最高价,那就放到高价数组中,不是就不放。
-
将待找类型whatfor归0,第一个折点未确认之前待找类型不知道是啥。(0:未知,1:顶,-1:底)
-
将前低价、前低价索引,前高价、前高价索引变量都置0。
-
从第1根k线开始循环,直到最后一根:
- 待找类型未知时,检查高价数组、低价数组的当前位置上谁有值就把该值存入混合数组对应位置,且将待找类型置为反向标识,高价数组有值时置-1,低价数组有值时置1。
- 待找类型=1时,先检查低价数组对应位置上是否非0,高价数组对应位置上为0,且该低价比前低价更低,则将混合数组中前低价索引值置0,前低价、前低价索引变量改为当前低价数组的值和索引;接着检查高价数组对应位置非0,且低价数组对应位置为0时,混合数组的对应位置置高价数组中的值,前高价、前高价索引变量改为当前高价数组的值和索引,最后whatfor改为-1。
- 待找类型=-1时,先检查高价数组对应位置上是否非0,低价数组对应位置上为0,且该高价比前高价更高,则将混合数组中前高价索引值置0,前高价、前高价索引变量改为当前高价数组的值和索引;接着检查低价数组对应位置非0,且高价数组对应位置为0时,混合数组的对应位置置低价数组中的值,前低价、前低价索引变量该为当前低价数组的值和索引,最后whatfor改为1。

注:
对于外汇,在4小时、1小时、15分钟周期图表上找到最后一段,对应的在15分钟、5分钟、1分钟周期图表上进行走势分解。
对于股票,在日线、1小时、15分钟周期图表上找到最后一段,对应的在15分钟、5分钟、1分钟周期图表上进行走势分解。