2015年5月21日木曜日

心理の揺れ動きをみる! MT4インジケータ 移動平均かい離率


昨日の記事はあまり人気がありませんでしたねー。
私としては、EURUSDが前の日と逆に取引するだけでトータル+とか結構衝撃だったのですが・・・。タイトルがだめだったのかなぁとタイトル変えてみました(笑)
EURUSD 日足逆張りだけで+って知ってました? EAを使って検証する。

昨日の検証から1日スパンでは投資家みなさんの心理状況が影響するという仮定します。

みなさんが良く参考にしているのはやはり移動平均です。

移動平均からどんどん価格が離れていった場合、どう思うでしょう?そろそろ手じまいしておこうかな?とかもうそろそろ反転しそうかな?と思う人が増えていくと思いませんか?
そんな集団心理状況が分かりやすく表現されたのが移動平均かい離率だと思っています。

かい離率.PNG

移動平均かい離率もダイバージェンス現象の発生に着目です。赤枠で囲った部分ですが、価格の上値は更新しているのにかい離率は右下がりになっています。移動平均に対して買い進む人が少なくなっている状況が表れていると思われます。このような場合そろそろかな?と思っている人が増えているという集団心理状況の変化と考えています。

さて定番の移動平均かい離率・・・。当然MT4にあるだろうと思ってたら標準になくてショックです。まぁさすがにこのインジケータは少し探せばすぐ入手可能ですが、作ったところであっという間なのもありますし、この後少し改造したいと考え自作しました。

//------------------------------------------------------------------
// 移動平均かい離率

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

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

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

// かい離率
#property indicator_label1  "LINE1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

// 入力パラメータ 移動平均期間
input int Period = 21;
// 入力パラメータ 移動平均モード
input ENUM_MA_METHOD MaMethod = MODE_SMA;
// 入力パラメータ 対象価格
input ENUM_APPLIED_PRICE MaPrice = PRICE_CLOSE;

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

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

SetIndexBuffer(0, lineBuffer);
SetIndexDrawBegin(0, Period);

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 maValue = iMA(NULL, PERIOD_CURRENT, Period, 0, MaMethod, MaPrice, i);
if( maValue != 0 )
{
lineBuffer[i] = close[i] / maValue * 100 - 100;
}
}

return(rates_total - 1);
}