2016年2月29日月曜日

[MT4インジケータ]二つのATRを比較する。比較元のATRをシフトしたい。

いつもブログにコメントを頂けるstaplaさまより次のようなコメントをいただきました。

・[MT4インジケータ]二つのATRを比較する。
http://mt4program.blogspot.jp/2016/02/mt4atr.html
「このインジと少しだけ違う計算ができるとありがたいのですが、こちらにコメント
させていただきます。
例えば1時間足で、ATR8とATR25をそれぞれMT4の画面に表示しているとして、
ATR8÷ATR25の計算がこのインジですが、そうではなくて、
ATR8÷9時間前時点のローソク位置のATR25 という計算です。
理由は、短期ATRの計算に使っている期間を除外して、それより前のある時点における長い期間のATRの値との比率を見たいためです。」

ソースコードが公開されているなら、このような修正が簡単に行えます。
ちょっとやってみましょう。


//------------------------------------------------------------------
// 二つのATR 比率

#property copyright "Copyright 2016,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

#property indicator_level1 1

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

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

#property indicator_label1  "RATE"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrIndianRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input int AtrShortPeriod = 5;  // 短期ATR 移動平均期間
input int AtrLongPeriod = 20; // 長期ATR 移動平均期間

// バッファー
double rate[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
   // 短縮名を設定
   string shortName = "DATRR (";
   shortName += IntegerToString(AtrShortPeriod) + "," + IntegerToString(AtrLongPeriod) + ")";
   IndicatorShortName(shortName);

   int count = 0;
   SetIndexBuffer(count++, rate);

   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; i-- )
   {
      double atr2 = iATR(NULL, PERIOD_CURRENT, AtrLongPeriod, i + AtrShortPeriod) ;
      if( atr2 > 0 )
      {
         rate[i] = iATR(NULL, PERIOD_CURRENT, AtrShortPeriod, i) / atr2;
      }
   }

   return(rates_total - 1);
}

修正箇所は赤字の部分です。割り算の元となるATRを取得する際にiの値に、シフトしたい量を+します。今回の修正では、単純に短期ATRの期間分をずらしてみました。

結果を比較した画像がこちらです。
■二つのATRを比較する。上シフトなし 下シフトあり


なるほど。確かにシフトしたほうが波形のエッジが鋭くなっていてよりはっきり区別がつきやすいように思われます。

となると、たとえば24時間前のATRと今のATRを比較したりしたくなりますよね?
シフト量とATR移動平均期間は別に指定できた方がよさそうに思われます。
ということで、修正したソースを記事の最後にアップしておきます。

staplaさま、いつも有益な情報をありがとうございます。

MT4開発日記で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ
お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。



//------------------------------------------------------------------
// 二つのATR 比率 シフト機能付き

#property copyright "Copyright 2016,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

#property indicator_level1 1

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

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

#property indicator_label1  "RATE"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrIndianRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input int AtrShortPeriod = 5;  // 短期ATR 移動平均期間
input int AtrLongPeriod = 20; // 長期ATR 移動平均期間

input int ATrLongShift = 5;   // 長期ATRシフト量

// バッファー
double rate[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
   // 短縮名を設定
   string shortName = "DATRRS (";
   shortName += IntegerToString(AtrShortPeriod) + "," + IntegerToString(AtrLongPeriod) + "," + IntegerToString(ATrLongShift)+ ")";
   IndicatorShortName(shortName);

   int count = 0;
   SetIndexBuffer(count++, rate);

   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; i-- )
   {
      double atr2 = iATR(NULL, PERIOD_CURRENT, AtrLongPeriod, i + ATrLongShift) ;
      if( atr2 > 0 )
      {
         rate[i] = iATR(NULL, PERIOD_CURRENT, AtrShortPeriod, i) / atr2;
      }
   }

   return(rates_total - 1);
}