以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4) ---- 关于MACD的顶底背离 (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=95109) |
-- 作者:sarz -- 发布时间:2016/3/24 22:16:14 -- 关于MACD的顶底背离 程序是逐K线模式下运行的。总体思路是:找到DIFF的拐点,再找拐点的最高/低价,再找出周期内diff的最大/小值,若此值不为拐点,则判读此极值时的价格和拐点价格是否形成顶底背离。写完之后发现某些背离没有判断出来,有可能是因为周期的设置局限了背离的判断,请各位前辈帮忙看看原因。 代码如下:
DIFF : EMA(CLOSE,12) - EMA(CLOSE,26); DEA : EMA(DIFF,9); MACD : 2*(DIFF-DEA), COLORSTICK; //DIFF底背离: //拐点到当前的周期数 BottumPointCount := BARSLAST( ( DIFF > REF(DIFF, 1) ) AND ( REF(DIFF, 2) > REF(DIFF, 1) ) ); //拐点最低价 BottumPointPrice := REF(LOW, BottumPointCount); //拐点DIFF值 BottumPointDIFF := REF(DIFF, 1); //周期内DIFF最小值 DIFFMin := LLV(DIFF, BottumPointCount + Term); //DIFF最小值到当前的周期数 DIFFMinCount := LLVBARS(DIFF, BottumPointCount + Term); //MACD最小值时的最低价 DIFFMinPrice := REF(LOW, DIFFMinCount); //若周期内有小于拐点的DIFF且股价高于拐点最低价 BottumFlag : DIFFMinCount > BottumPointCount AND DIFFMin < BottumPointDIFF AND DIFFMinPrice > BottumPointPrice AND DIFF > REF(DIFF, 1) AND REF(DIFF, 2) > REF(DIFF, 1), COLORGREEN; //DIFF顶背离: //拐点到当前的周期数 TopPointCount := BARSLAST( ( DIFF < REF(DIFF, 1) ) AND ( REF(DIFF, 1) > REF(DIFF, 2) ) ); //拐点最高价 TopPointPrice := REF(HIGH, TopPointCount); //拐点DIFF值 TopPointDIFF := REF(DIFF, 1); //周期内DIFF最D大值 DIFFMax := HHV(DIFF, TopPointCount + Term); //DIFF最大值到当前的周期数 DIFFMaxCount := HHVBARS(DIFF, TopPointCount + Term); //DIFF最大值时的最高价 DIFFMaxPrice := REF(HIGH, DIFFMaxCount); //若周期内有大于拐点的MACD,且股价低于拐点价,且当前点为拐点 TopFlag : DIFFMaxCount > TopPointCount AND DIFFMax > TopPointDIFF AND DIFFMaxPrice < TopPointPrice AND DIFF < REF(DIFF, 1) AND REF(DIFF, 1) > REF(DIFF, 2), COLORYELLOW; 其中,周期Term:缺省30,最小10,最大60,步长为2 |
-- 作者:jinzhe -- 发布时间:2016/3/25 9:10:48 -- 先问下拐点用户是如何定义的?有没有图片说明的? |
-- 作者:sarz -- 发布时间:2016/3/25 10:52:59 -- 只需要满足左右相邻各一根的diff值比中间的diff值高,则认为diff为底部拐点。顶部拐点同理。 |
-- 作者:jinzhe -- 发布时间:2016/3/25 10:59:02 -- 高低拐点到现在的周期数需要加一,不加一就是拐点后面的第一根k线位置 BottumPointCount := BARSLAST( ( DIFF > REF(DIFF, 1) ) AND ( REF(DIFF, 2) > REF(DIFF, 1) ) )+1;
还有高低拐点的diff值你这样写我不明白是为什么 组后这个周期内diff最小值是什么意思不明白,看不懂这个算法 [此贴子已经被作者于2016/3/25 10:59:52编辑过]
|
-- 作者:sarz -- 发布时间:2016/3/25 12:55:56 -- 因为只有走完拐点后的一根K线才能确定该点为拐点,因为是仅刷最后一根K线模式,所以默认当前点为拐点的下一个K线。 DIFFMin := LLV(DIFF, BottumPointCount + Term); 这句的目的是,找到此拐点到前term周期内的diff最小值,若最小值不为此拐点,再去判断拥有diff最小值的这根K线的LOW与拐点的LOW是否形成底背离。
|
-- 作者:jinzhe -- 发布时间:2016/3/25 13:24:47 -- 1.意思是以拐点之后的一根k线定义为拐点? 2找到此拐点到前term周期内的diff最小值. 不能这样写,要写成: DIFFMin := ref(LLV(DIFF, Term),bottumpointcount);
|
-- 作者:sarz -- 发布时间:2016/3/25 14:28:23 -- 2找到此拐点到前term周期内的diff最小值. 不能这样写,要写成: DIFFMin := ref(LLV(DIFF, Term),bottumpointcount); 您说的这部分我明白了。 1.意思是以拐点之后的一根k线定义为拐点? 这个并不是说把拐点后的一根K线定义成拐点,而是说,在逐k线模式下,必须走完了拐点后的一根k线,才能确定这根点是拐点。 思路是:先找到diff的拐点(右边),再找到从拐点算起一定周期(term)内的diff最小值(左边),判断这两个值之间的价格最小值,若左边的最小值比右边的最小值大,则形成底背离。 老师您看这样是合理的吗?
|
-- 作者:jinzhe -- 发布时间:2016/3/25 14:30:29 -- 那么拐点不是之后那一根,所以要按照我写的那样加个1,不然你的拐点是拐点之后的一根,而且我这样写也是在拐点之后一根k线确定拐点才成立的 |
-- 作者:sarz -- 发布时间:2016/3/25 14:41:12 -- 嗯,明白。谢谢老师,还想请教您,如果现在我想做些改动: 1.从找diff的拐点,去对比最低价,变成寻找价格的拐点,去对比diff值。 2.不仅需要寻找周期内价格最低点和当前拐点是否有背离,还要去寻找周期内每一个价格最低点的拐点和当前拐点是否有背离,这个循环应该加在哪? 另外,回复怎么插入图片啊?我上一张回复是有图片的,没显示,我是添加附件进去的。
|
-- 作者:jinzhe -- 发布时间:2016/3/25 14:56:08 -- DIFF : EMA(CLOSE,12) - EMA(CLOSE,26); //DIFF最小值到当前的周期数
基本上是diff和close的对换,然后改掉一点原本错误的地方即可 |