2016年2月15日月曜日

[MT4インジケータ]二つのATRを比較する。

マルチバーATRにおいて、staplaさんより次のコメントをいただきました。

「[MT4インジケータ」ATR君・・ほしい値はそこじゃない!複数バーを使ったATRを表示する。 の このインジを使ってみました。赤い線が立ち上がり青い線を上抜くときにローソク足もトレンドが発生するように見えますが、奇麗に上抜けしなかったり2本の線が重なることもありこれという基準が見つけられませんでした。 2本の線でATRを出すアイデアは面白いのですが、2本の線を別々の期間のATRとして、かつ2つのATRの比率を3つ目の線として表示できたら、短期ATRが長期ATRを上回る時の変化が視覚的にわかりやすいのではないでしょうか。 例えば、ATR5とATR20を表示して。さらにATR5÷ATR20の結果をライン表示する、などです。」

アイデアありがとうございます。
マルチバーATRは、好きな時間長のATRを表示するためのインジケータですので、長い時間のATRは短い時間のATRを必ず含んでしまいます。

そこで、通常のATRにおいて、移動平均期間が異なる二つを比較するインジケータを作成してみました。(通常のATRにおいては、表示しているチャートの1本の足におけるATRの単純移動平均を表示しています。)

■二つのATRを比較する EURUSD1H


上側がATRそのものを表示した物で、下が短期ATR/長期ATRです。クロス位置となる1のラインにレベルを引いています。

こう見ると、
・短期ATRが長期ATRを追い越すと短期的な値動きの開始
・短期ATRがピークアウトするといったんの終了
・短期ATRが長期ATRを下回っている場合、直線的に一定方向(横方向もあり)

という特徴があるように思われます。なるほど確かに参考になりそうな気がしてきました。
アイデアをいただきましたstaplaさんありがとうございます。

ソースコードはブログ最後に貼ってあります。また、FX-ONに登録しておきました。

二つのATRを比較する
二つのATRを比較する
二つのATRを比較する | fx-on.com

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_buffers 2

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

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

#property indicator_label2  "LONG"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrAqua
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

input int AtrShortPeriod = 5;  // ATR1期間
input int AtrLongPeriod = 20; // ATR2期間

// バッファー
double atr1[];
double atr2[];

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

   int count = 0;
   SetIndexBuffer(count++, atr1);
   SetIndexBuffer(count++, atr2);

   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-- )
   {
      atr1[i] = iATR(NULL, PERIOD_CURRENT, AtrShortPeriod, i);
      atr2[i] = iATR(NULL, PERIOD_CURRENT, AtrLongPeriod, i);
   }

   return(rates_total - 1);
}
//------------------------------------------------------------------
// 二つの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) ;
      if( atr2 > 0 )
      {
         rate[i] = iATR(NULL, PERIOD_CURRENT, AtrShortPeriod, i) / atr2;
      }
   }

   return(rates_total - 1);
}

5 件のコメント:

  1. ありがとうございます。

    返信削除
    返信
    1. はーい。こちらこそアイデアありがとうございます。

      削除
  2. このインジを、日経平均の日足で短期7 長期80に設定すると、ボラティリティの拡大がわかりやすかったです。

    返信削除
  3. このインジと少しだけ違う計算ができるとありがたいのですが、こちらにコメント
    させていただきます。
    例えば1時間足で、ATR8とATR25をそれぞれMT4の画面に表示しているとして、
    ATR8÷ATR25の計算がこのインジですが、そうではなくて、
    ATR8÷9時間前時点のローソク位置のATR25 という計算です。
    理由は、短期ATRの計算に使っている期間を除外して、それより前のある時点における長い期間のATRの値との比率を見たいためです。

    返信削除
    返信
    1. プログラム的にさらっと修正するのであれば、
      double atr2 = iATR(NULL, PERIOD_CURRENT, AtrLongPeriod, i);

      double atr2 = iATR(NULL, PERIOD_CURRENT, AtrLongPeriod, i + AtrShortPeriod);

      とiの値にAtrShortPeriodとしていただければOKです。

      削除