2015年8月6日木曜日

[MT4インジケータ]21本高値安値には意味がある?周期高値安値インジケータ

周期解析によると、大体21本周期で価格が動くことが多いことはわかります。ということは21本における高値安値を表示して、その範囲内はレンジ、更新したらトレンドと判別することはできないでしょうか?
Excelで視覚化してみます。
sinhighlow.png
ある期間の波形内で上下する場合にはレンジ相場です。その高値と安値を抵抗線として描くことが可能です。

これに線形のトレンド成分を付加すると、次のようになります。
sinhighlowtrend.png
この図形は上げトレンドですが、上側の線を更新しながら上昇していきます。
下げの線にはタッチせずに上昇しますが、安値抵抗線と離れすぎていて少々シグナルとしては大雑把すぎます。なお高値のラインが、実際の価格より後に描画されているのは、1本前までの高値を表示しているためです。

波形ですので、基本的には周期の1/2期間で高値と安値が表れます。そこで、高値安値の判定範囲を1/2+1としたらどうでしょうか?
sinhighlowtrend2.png
前回安値のラインで跳ね返されて上昇していく図形となります。

これを描いたのが次のインジケータです。
highlow.png

通常インジケータを組む時には最新値を常に更新しますが、このインジケータでは確定した値のみ描画しています。現在高値安値を超えている場合はラインを超えてチャートが表示されるようにしています。

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

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

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

#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

extern int Period = 13;

double highBuffer[];
double lowBuffer[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
//インジケーターバッファを初期化する。
SetIndexBuffer(0,highBuffer);
SetIndexBuffer(1,lowBuffer);
SetIndexDrawBegin(0, Period);
SetIndexDrawBegin(1, Period);

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];
}
//元となる値を計算する。
return(rates_total);
}
//+------------------------------------------------------------------+


正弦波という形にモデルを単純化して考えています。これは単純モデルでも役にたたないものは実際には役に立つわけがないからです。あといったん単純化して見える化すると考えがまとまりやすい事が多いです。
今回の場合は、波長の1/2をとったほうが、インジケータとして役立つ可能性があるという点などですね。

特定期間の高値安値は抵抗線として意識されやすい為、みなさまもこのプログラムを基本に高値安値を描画してみてください。何か見えてくるかもしれませんよー?