ZigZagから天井と底値の値を取得して、同じ価格帯に天井or底が2つ以上ある場合にサポート・レジスタンスラインとして線を引くコードを書きました。
課題としてはほぼ同じ価格帯で複数の線が引かれることです。似た値で複数のラインが引ける場合は平均値を出してラインを一本にするなどできればいいと思います。
ZigZagの天底の値の取得方法は前回の記事で確認してみてください。→ZigZagの天底の値の取得方法[MT4][EA][備忘録]
<スポンサーリンク>
void RegistanceSupportLine() { //---Zigzag--------------------------------------------------------------// int m,n; m=0; n=0; double Top[20]; double Bottom[20]; int tPosition[20]; int bPosition[20]; for(int i=0;i<=500;i++) { double Zg=NormalizeDouble(iCustom(NULL,0,"ZigZag",12,5,3,0,i),5); if(Zg!=0 && Zg==NormalizeDouble(High[i],5)) { Top[m]=Zg; tPosition[m]=i; m++; if(m>=20)break; } if(Zg!=0 && Zg==NormalizeDouble(Low[i],5)) { Bottom[n]=Zg; bPosition[n]=i; n++; if(n>=20)break; } } //---Zigzag--------------------------------------------------------------// //---Line--------------------------------------------------------------// int Line; double Highest_p=High[iHighest(NULL,0,MODE_HIGH,500,1)]; double Lowest_p =Low[iLowest(NULL,0,MODE_LOW,500,1)]; double SR_Line[20]; int c; c=0; for(double p=Lowest_p;p<=Highest_p;p+=20*Point) { Line=0; for(int a=0;a<=20;a++) { if((p)<Bottom[a] && Bottom[a]<(p+20*Point)) Line=Line+1; } for(int b=0;b<=20;b++) { if((p)<Top[b] && Top[b]<(p+20*Point)) Line=Line+1; } if(Line>=2) SR_Line[c++]=p; } //---Line--------------------------------------------------------------// ObjectsDeleteAll(0,0,OBJ_HLINE); for(int j=0;j<=20;j++) { if(SR_Line[j]!=0) { ObjectCreate("SRL[j]",OBJ_HLINE,0,0,SR_Line[j]); } }
今回は具体的なコードの説明はしていません。なにか質問があればコメントでお願いします。