トレンドラインを攻略したいので色々な視点から攻め込んでいます。
トレンドラインの引き方は難しいです。
実体ベースで引くのか、ヒゲベースで引くのか、それとも全体的にある程度効いているラインで引くのか、人によって使い方はまちまちです。
ラインの始点と終点がズレればそのラインの角度が変わり、相場の見え方が変わってしまいます。
ヒゲを含めた移動平均線でフラクタルを表現することで、その辺の煩わしさをカバー出来るのでは無いかと思い、このインジケーターを作ってみました。
フラクタル同士でトレンドラインを結び、ラインブレイクや押し目戻りを狙いやすくなるかと思います。
画像中のライン一番上が高値MAで一番下が安値のMAです。
真ん中のラインは高値と安値の中間のラインです。
中間ラインがどっちかのラインに寄っていればその方向にトレンドが出ていると判断することも可能です。
チャートにMAしか表示させないことで非常にシンプルになり、ノイズに惑わされにくくなりますので、結構良いんじゃないのかと思っています(´・ω・`)
また、MAですので平均のブロックとしてチャートを見つめる事も可能です。
下記にコードとファイルを設置しておきますので、ご活用下さいませ。
//+------------------------------------------------------------------+ //| MAFractals.mq4 | //| Copyright 2019, Greeds Inc. | //| https://fxtrading.greeds.co.jp | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, Greeds Inc." #property link "https://fxtrading.greeds.co.jp" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 5 #property indicator_color1 Gold #property indicator_color2 Red #property indicator_color3 Blue #property indicator_color4 Red #property indicator_color5 Blue //buffer double BufMA[]; double BufMAUpper[]; double BufMALower[]; double BufUpperFractas[]; double BufLowerFractals[]; input int MAPeriod=5; double latestUpper=0; double latestLower=100; double beforeUpper=0; double beforeLower=100; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { SetIndexBuffer(0,BufMA); SetIndexStyle(0,DRAW_LINE,0,1); SetIndexLabel(0,"MA"); SetIndexBuffer(1,BufMAUpper); SetIndexStyle(1,DRAW_LINE,0,1); SetIndexLabel(1,"Upper"); SetIndexBuffer(2,BufMALower); SetIndexStyle(2,DRAW_LINE,0,1); SetIndexLabel(2,"Lower"); SetIndexBuffer(3,BufUpperFractas); SetIndexStyle(3,DRAW_ARROW,0,1); SetIndexArrow(3,119); SetIndexLabel(3,"UpperFractas"); SetIndexBuffer(4,BufLowerFractals); SetIndexStyle(4,DRAW_ARROW,0,1); SetIndexLabel(4,"LowerFractals"); SetIndexArrow(4,119); return(INIT_SUCCEEDED); } int changedBars(int rates_total, int prev_calculated) { if (prev_calculated==0)return rates_total; return rates_total - prev_calculated + 1; } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int i,nCountedBars; i=0; nCountedBars=IndicatorCounted(); //---- check for possible errors if(nCountedBars<0) return(-1); //---- last counted bar will be recounted if(nCountedBars<=2) i=Bars-nCountedBars-3; if(nCountedBars>2) { nCountedBars--; i=Bars-nCountedBars-1; } while(i>=2) { BufMA[i]=MA(i,PRICE_MEDIAN); BufMAUpper[i]=MA(i,PRICE_HIGH); BufMALower[i]=MA(i,PRICE_LOW); //----Up and Down Fractals //----5 bars Fractal if(MA(i,PRICE_HIGH)>MA(i+1,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+2,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-1,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-2,PRICE_HIGH)) { UpperProcess(i,PRICE_HIGH); } if(MA(i,PRICE_LOW)<MA(i+1,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+2,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-1,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-2,PRICE_LOW)) { LowerProcess(i,PRICE_LOW); i--; continue; } //----6 bars Fractal if((Bars-i-1)>=3) { if(MA(i,PRICE_HIGH)==MA(i+1,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+2,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+3,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-1,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-2,PRICE_HIGH)) { UpperProcess(i,PRICE_HIGH); } if(MA(i,PRICE_LOW)==MA(i+1,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+2,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+3,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-1,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-2,PRICE_LOW)) { LowerProcess(i,PRICE_LOW); i--; continue; } } //----7 bars Fractal if((Bars-i-1)>=4) { if(MA(i,PRICE_HIGH)>=MA(i+1,PRICE_HIGH) && MA(i,PRICE_HIGH)==MA(i+2,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+3,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+4,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-1,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-2,PRICE_HIGH)) { UpperProcess(i,PRICE_HIGH); } if(MA(i,PRICE_LOW)<=MA(i+1,PRICE_LOW) && MA(i,PRICE_LOW)==MA(i+2,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+3,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+4,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-1,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-2,PRICE_LOW)) { LowerProcess(i,PRICE_LOW); i--; continue; } } //----8 bars Fractal if((Bars-i-1)>=5) { if(MA(i,PRICE_HIGH)>=MA(i+1,PRICE_HIGH) && MA(i,PRICE_HIGH)==MA(i+2,PRICE_HIGH) && MA(i,PRICE_HIGH)==MA(i+3,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+4,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+5,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-1,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-2,PRICE_HIGH)) { UpperProcess(i,PRICE_HIGH); } if(MA(i,PRICE_LOW)<=MA(i+1,PRICE_LOW) && MA(i,PRICE_LOW)==MA(i+2,PRICE_LOW) && MA(i,PRICE_LOW)==MA(i+3,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+4,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+5,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-1,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-2,PRICE_LOW)) { LowerProcess(i,PRICE_LOW); i--; continue; } } //----9 bars Fractal if((Bars-i-1)>=6) { if(MA(i,PRICE_HIGH)>=MA(i+1,PRICE_HIGH) && MA(i,PRICE_HIGH)==MA(i+2,PRICE_HIGH) && MA(i,PRICE_HIGH)>=MA(i+3,PRICE_HIGH) && MA(i,PRICE_HIGH)==MA(i+4,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+5,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i+6,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-1,PRICE_HIGH) && MA(i,PRICE_HIGH)>MA(i-2,PRICE_HIGH)) { UpperProcess(i,PRICE_HIGH); } if(MA(i,PRICE_LOW)<=MA(i+1,PRICE_LOW) && MA(i,PRICE_LOW)==MA(i+2,PRICE_LOW) && MA(i,PRICE_LOW)<=MA(i+3,PRICE_LOW) && MA(i,PRICE_LOW)==MA(i+4,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+5,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i+6,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-1,PRICE_LOW) && MA(i,PRICE_LOW)<MA(i-2,PRICE_LOW)) { LowerProcess(i,PRICE_LOW); i--; continue; } } i--; } return(0); } //+------------------------------------------------------------------+ double MA(int index,int mode) { return iMA(NULL,0,MAPeriod,0,MODE_SMA,mode,index); } void UpperProcess(int index,int mode) { Print("upper"); BufUpperFractas[index]=MA(index,mode); beforeUpper=latestUpper; latestUpper=BufUpperFractas[index]; } void LowerProcess(int index,int mode) { Print("lower"); BufLowerFractals[index]=MA(index,mode); beforeLower=latestLower; latestLower=BufMALower[index]; }