で作成した、インジケータです。
期間の異なる二つのATRを比較して、価格の行き過ぎを検知します。
初期状態では、1時間足を想定して、長期が36、短期を6としています。この場合36時間足のATRに対して6時間足ATRを比較する形になります。
36時間分の値動きを6時間である程度達成したら、そのあたりで値動きいっぱいじゃない?っていう感じを検出するインジケータです。
いつも見る時間足に合わせて調整してみてください。
日足だと20/5(月/週)など、3倍から6倍の値で、何かしら意味のありそうな範囲に調整してみるのがお勧めです。
とはいっても、全然調査していませんので、使えるかどうかわかりませんが、通常の相場においては、このラインが一定以上行き過ぎている場合は、反発が起きることが多い気がします。画像でいう右から3番目のラインでも、下降トレンドでの、小反発の前に発生しています。方向転換するしないにしろいったん気にするラインということなのかもしれません。
FX-ONにも登録しました。
複数バー同士のATRを比較して値動きの行き過ぎを検知する
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_maximum 1
#property indicator_minimum 0
//バッファーを指定する。
#property indicator_buffers 1
//プロット数を指定する。
#property indicator_plots 1
//TEMA ATR
#property indicator_label1 "ATR Rate"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrAqua
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
input int LongPeriod = 36; //長期期間
input int ShortPeriod = 6; //短期期間
input double smoothEma = 0.8; //平滑化EMA
// 比率
double rate[];
//------------------------------------------------------------------
//初期化
int OnInit()
{
if( LongPeriod <= 0 || ShortPeriod <= 0 || LongPeriod < ShortPeriod) return (INIT_PARAMETERS_INCORRECT);
//インジケーターバッファを初期化する。
int count = 0 ;
SetIndexBuffer(count++, rate);
string short_name = "MATRR( " + IntegerToString(ShortPeriod)+"," + IntegerToString(LongPeriod)+")";
IndicatorShortName(short_name);
IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, (double)ShortPeriod / (double)LongPeriod);
IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, (double)ShortPeriod / (double)LongPeriod * 2);
IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, (double)ShortPeriod / (double)LongPeriod * 3);
IndicatorSetDouble(INDICATOR_LEVELVALUE, 4, (double)ShortPeriod / (double)LongPeriod * 4);
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[]) //スプレット
{
// 最終計算時間
static datetime lastCalculate = 0;
//元となる値を計算する。
for( int i = (rates_total - prev_calculated - 1); i>=0 ; i-- )
{
// ShortPeriod + LongPeriod +ひとつ前の終値が必要
if( i >= (rates_total - LongPeriod - ShortPeriod - 1) )
{
rate[i] = 0;
continue;
}
double beforeClose = close[i + ShortPeriod];
double nowHigh = high[ArrayMaximum(high, ShortPeriod, i)];
double nowLow = low[ArrayMinimum(low, ShortPeriod, i)];
double shortAtr = MathMax(MathMax( nowHigh - beforeClose, beforeClose - nowLow), nowHigh - nowLow);
beforeClose = close[i + LongPeriod + ShortPeriod];
nowHigh = high[ArrayMaximum(high, LongPeriod, i + ShortPeriod)];
nowLow = low[ArrayMinimum(low, LongPeriod, i + ShortPeriod)];
double longAtr = MathMax(MathMax( nowHigh - beforeClose, beforeClose - nowLow), nowHigh - nowLow);
if( longAtr > 0 )
{
rate[i] = smoothEma * shortAtr / longAtr + (1 - smoothEma) * rate[i + 1];
}
}
return(rates_total - 1);
}