下面这段代码能取到上一个macd峰值,但是我还需要取到上上一个macd峰值,请大神帮忙看看该怎么写:diff:=ema(close,12)-ema(close,26);
dea:=ema(diff,9);
macd:=(diff-dea)*2;
a:=barslast(filter(diff=hhv(diff,barslast(diff<dea)),barslast(diff<dea)));
tt:=a+1;
ztt:=ref(tt,tt)+tt;
kk:=ref(diff,ztt-1);
msgout(1,STKNAME()&'macd前高:'&numtostr(kk,3));
你这个峰值是怎么定义的? 从你这个代码去理解的话,思路不是很明确。 你用文字描述下你这个思路我看下吧。
每一次diff金叉dea然后再死叉dea就构成一次diff大于dea的区间,在该区间内最大的diff值就是我需要取到的的峰值,如下面截图中红圈标注的位置就构成了若干个峰值。我需要取到当前周期之前的上两个diff的峰值,并且获取到峰值所属的bar距离现在的周期。
此主题相关图片如下:wx20201106-205840@2xsde.png
input:p(26,20,100,8),s(12,5,40,4),m(9,2,60,6);
DIFF :=EMA(CLOSE,S) - EMA(CLOSE,P);
DEA :=EMA(DIFF,M);
MACD1 :2*(DIFF-DEA), COLORSTICK;
macdjc:=cross(diff,dea),NODRAW;//macd金叉
macdsc:=cross(dea,diff),NODRAW;
DRAWICON(macdjc,h,1);
DRAWICON(macdsc,l,1);
M1:=SUMBARS(macdsc,1);//最近一次死叉位置
M2:=SUMBARS(macdsc,2);
maxValue1:ref(HHV(diff,BARSLAST(macdjc)+2),M1-1);//最近一次金叉到死叉之间diff最大值
maxValue2:ref(HHV(diff,BARSLAST(macdjc)+2),M2-1);//上上一次金叉到死叉之间diff最大值
maxValue3:HHV(diff,BARSLAST(macdjc)+2);//如果当前是macd红柱,则最近一次最大值用这个取
recentHigh1:=ref(HHVBARS(diff,BARSLAST(macdjc)+2),M1-1);
recentHigh2:=ref(HHVBARS(diff,BARSLAST(macdjc)+2),M2-1);
recentHigh3:=HHVBARS(diff,BARSLAST(macdjc)+2);
len1:recentHigh1+M1-1;//最近一次金叉到死叉之间的diff最大值到当前的位置
len2:recentHigh2+M2-1;//上上一次金叉到死叉之间的diff最大值到当前的位置
len3:recentHigh3;
这里的统计要分情况。
如果当前是绿柱:
len1,len2 分别是2次最大值距离现在的位置
maxValue1,maxValue2 分别是2次的最大值
如果当前是红柱,把当前的红柱统计在内的话。
此主题相关图片如下:temp.png
也就是从金叉位置到光标位置就是第一个diff最大值所在位置。
那么:
len2,len3 分别是2次最大值距离现在的位置
maxValue2,maxValue3 分别是2次的最大值
遇到一个新的难题,识别连续两次或三次的顶背离的公式该怎么写?我用macd的两个峰值和相对应位置的close值可以判断是否是顶背离,例如:
顶背离:=maxValue1<maxValue2 and ref(close,len1)>ref(close,len2);
但是下面的代码却不能每次都命中连续顶背离都情况:
Jcount:=count(顶背离,sumbars(macdsc,3));
连续顶背离:=顶背离 AND macdsc and COUNT(Jcount=2,21)=1;
你的思路大致是怎样的?顶背离的代码能理解,但是就是你连续顶背离的判断方式我从你代码没推测出来。
大致思路就取前n个macd死叉位置起到当前时间内判断出现了几次顶背离,并且两个顶背离是相连的。
例如:
前5个死叉位置是60,在当前时间到前60个周期内,判断出现了2次顶背离,一次在第5个死叉位置,一次在第3个死叉位置,这两次顶背离中间隔着一个非顶背离的第4个死叉,就不算是连续顶背离;但如果是第3和第4个死叉的位置都命中了顶背离,则判断是在第4个死叉位置属于连续顶背离
顶背离:maxValue1<maxValue2 and ref(close,len1)>ref(close,len2) and macdsc;
连续背离:顶背离 and ref(顶背离,M2-1);//M2是前面定义的一个变量
DRAWICON(顶背离,h,1);
DRAWICON(连续背离,l,2);
这样试下呢。
效果如下:
此主题相关图片如下:temp.png
连续顶背离的识别按您讲的方法可以识别了,还有一个问题,如何过滤掉像下图红圈位置标注的持续时间只有2天的macd金叉?这种噪音会干扰指标的判断
此主题相关图片如下:20210201-dx1ddd.png