2015年11月19日木曜日

[MT4インジケータ]13本高値安値にトレンド成分を追加してみた。


昨日の記事からの流れで、、21本高値安値には意味がある?周期高値安値インジケータで作成した高値安値のインジケータにSMA成分を追加したラインを描画するインジケータを作成してみました。簡易版ということで、期間は固定値を採用しています。

現在サインとして有効そうなポイントを紹介します。まだ私も研究中ですので、よろしければ皆様も使ってみていただいて、有効そうなポイントを教えていただけると嬉しいです。インジケータ作成のモチベ上がります^^

トレンドが終了しそうになると、トレンド側高値安値を連続して超えてきます。チャートのキャプチャでいくと、左側に下げ終わりの症状が発生しています。拡大するとこんな感じです。トレンド高値である青い点線を価格が上回っています。この場合トレンドが終了した可能性が高そうです。



次に少しだけレンジっぽい動きをした後、上に移動し始めますが、すぐにトレンド安値の下に価格が来ます。拡大するとこんな感じです。上昇トレンドは終了した可能性があります。


最後にトレンド高値での反転を確認したので下げトレンド確定!といった形です。拡大するとこんな感じです。


昨日の記事で紹介したプログラムでは、期間の判定をWavelet周期解析した結果を反映させています。もう少し長期周期に合わせた高値安値ラインを出しています。
今回のプログラムは21本SMAとベースに13本高値ラインを計算しています。21本SMAはEURUSD1時間足でのホモダインベース周期解析の平均値です。なぜ13本なのかは記事頭で紹介しました過去記事をご覧ください。

ブログランキングにご協力よろしくお願いいたしますm(_ _ )m
にほんブログ村 為替ブログへ
にほんブログ村


プログラムはこちらから




//------------------------------------------------------------------
// 高値 安値ライン表示インジケータ+トレンド補正
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

//バッファーを指定する。
#property indicator_buffers 6

//プロット数を指定する。
#property indicator_plots   6

#property indicator_label1  "HIGH"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "LOW"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrIndianRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

#property indicator_label3  "CENTER"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrYellow
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2

#property indicator_label4  "HIGH TREND"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrAqua
#property indicator_style4  STYLE_DOT
#property indicator_width4  1

#property indicator_label5  "LOW TREND"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrIndianRed
#property indicator_style5  STYLE_DOT
#property indicator_width5  1

#property indicator_label6  "CENTER TREND"
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrYellow
#property indicator_style6  STYLE_DOT
#property indicator_width6  1

extern int Period = 13;

extern int MaPeriod = 21;

double highBuffer[];
double lowBuffer[];
double centerBuffer[];

double highTrendBuffer[];
double lowTrendBuffer[];
double centerTrendBuffer[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
   //インジケーターバッファを初期化する。
   SetIndexBuffer(0,highBuffer);
   SetIndexBuffer(1,lowBuffer);
   SetIndexBuffer(2,centerBuffer);
   SetIndexBuffer(3,highTrendBuffer);
   SetIndexBuffer(4,lowTrendBuffer);
   SetIndexBuffer(5,centerTrendBuffer);
   SetIndexDrawBegin(0, Period);
   SetIndexDrawBegin(1, Period);
   SetIndexDrawBegin(2, Period);
   SetIndexDrawBegin(3, MaPeriod);
   SetIndexDrawBegin(4, MaPeriod);
   SetIndexDrawBegin(5, MaPeriod);
   
   string short_name = "HIGHLOW(" + IntegerToString(Period) + ")";
   IndicatorShortName(short_name);
   
   return(INIT_SUCCEEDED);
}


//------------------------------------------------------------------
//計算イベント
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[])            //スプレット
{
   for( int i = (rates_total - prev_calculated - 1); i >= 0 && !IsStopped(); i-- )
   {
      if( i >= rates_total - Period ) continue;
   
      int highest = iHighest( NULL, PERIOD_CURRENT, MODE_HIGH, Period, i + 1);
      int lowest = iLowest( NULL, PERIOD_CURRENT, MODE_LOW, Period, i + 1);
      
      highBuffer[i] = high[highest];
      lowBuffer[i] = low[lowest];
      centerBuffer[i] = (highBuffer[i] + lowBuffer[i] ) / 2;
      
      double maNow = iMA(NULL, PERIOD_CURRENT, MaPeriod, 0, MODE_SMA, PRICE_MEDIAN, i); 
      int targetIndex = (int)MathMax(highest, lowest);
      
      double maBefore = iMA(NULL, PERIOD_CURRENT, MaPeriod, 0, MODE_SMA, PRICE_MEDIAN, targetIndex); 
      
      highTrendBuffer[i] = highBuffer[i] + maNow - maBefore;
      lowTrendBuffer[i] = lowBuffer[i] + maNow - maBefore;
      
      centerTrendBuffer[i] = (highTrendBuffer[i] + lowTrendBuffer[i] ) / 2;
      
      
   }
   //元となる値を計算する。
   return(rates_total);
}
//+------------------------------------------------------------------+