Excelで視覚化してみます。
ある期間の波形内で上下する場合にはレンジ相場です。その高値と安値を抵抗線として描くことが可能です。
これに線形のトレンド成分を付加すると、次のようになります。
この図形は上げトレンドですが、上側の線を更新しながら上昇していきます。
下げの線にはタッチせずに上昇しますが、安値抵抗線と離れすぎていて少々シグナルとしては大雑把すぎます。なお高値のラインが、実際の価格より後に描画されているのは、1本前までの高値を表示しているためです。
波形ですので、基本的には周期の1/2期間で高値と安値が表れます。そこで、高値安値の判定範囲を1/2+1としたらどうでしょうか?
前回安値のラインで跳ね返されて上昇していく図形となります。
これを描いたのが次のインジケータです。
通常インジケータを組む時には最新値を常に更新しますが、このインジケータでは確定した値のみ描画しています。現在高値安値を超えている場合はラインを超えてチャートが表示されるようにしています。
//------------------------------------------------------------------
// 高値 安値ライン表示インジケータ
#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をとったほうが、インジケータとして役立つ可能性があるという点などですね。
特定期間の高値安値は抵抗線として意識されやすい為、みなさまもこのプログラムを基本に高値安値を描画してみてください。何か見えてくるかもしれませんよー?