2015.07.21追記
改良版のプログラムが以後にいくつか乗っていますので、そちらも参考にしてみてください。単純にラインを引くだけなら、時間別に横線を引くやつの方が見た目が良いです^^;;
・MT4プログラムの小ネタ 時間別に横線を引く。/線の途中で色を変える。
・もっとわかりやすくしてほしい。MT4レンジインジケータを改造してみた。
・MT4インジケータ 各国の取引時間を表示する。
EURUSDを見ていると東京時間はうろうろした後、ヨーロッパ勢が参加すると一方方向に動き出す傾向があるように思われます。そこで、東京時間をブレイクした方向に取引する際わかりやすいようにグラフ上に線を引くインジケータを作ってみました。
入力パラメータであるStartHourとEndHourはサーバー時間ベースです。私が使用しているOANDAですと現在GMT+3で表示されていますので、3で9時を表して9で15時を表しています。
こうやって見ると確かにブレイク後しばらくはその方向動いているように思われます。
単純にブレイクした方向にポジションを持って2時間後に決済という戦略でも、そこそこ取れそうに思われます。長期では確認していませんが、ありかも?と思わせるグラフになりました。
なお、移動平均の方向も合わせて確認するのに「シンプルだけど効果あり!MT4でDrawSimpleLineインジケータを作ってみた。」で作成したDSLを合わせて表示しています。
東京時間ブレイクでポジションオープン、DSLを使って早めに切るのであれば短期差分の方向性が変わった際に手じまい、少し粘るなら短期長期がクロスした場合手じまいといった戦略でしょうか?ちょっと機会をみてEAで検証したいと思います。
FX-ONブログランキングにご協力よろしくお願いいたしますm(_ _ )m
//------------------------------------------------------------------
// 時間帯別レンジ表示
#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 1
#property indicator_label2 "LOW"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrIndianRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
// 入力パラメータ 開始サーバー時間
input int StartHour = 3;
// 入力パラメータ 終了サーバー時間
input int EndHour = 9;
// バッファー
double highBuffer[];
double lowBuffer[];
//------------------------------------------------------------------
//初期化
int OnInit()
{
// 時間足以下のみ有効
int priod = Period();
if( priod > PERIOD_H1 ) return INIT_PARAMETERS_INCORRECT;
if( StartHour < 0 || StartHour > 23 ) return INIT_PARAMETERS_INCORRECT;
if( EndHour < 0 || EndHour > 23 ) return INIT_PARAMETERS_INCORRECT;
if( StartHour == EndHour ) return INIT_PARAMETERS_INCORRECT;
SetIndexBuffer(0, highBuffer);
SetIndexBuffer(1, lowBuffer);
string short_name = "TR(";
short_name += IntegerToString(StartHour) + "," + IntegerToString(EndHour) + ")";
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[]) //スプレット
{
// 開始時間から終了時間までの高値安値を更新する。
double highValue = 0;
double lowValue = 100000;
for( int i = rates_total - prev_calculated - 1 ; i >= 0; i-- )
{
if( i < rates_total - 1 )
{
highValue = highBuffer[i + 1];
lowValue = lowBuffer[i + 1];
}
int hour = TimeHour(time[i]);
if( hour == StartHour && TimeMinute(time[i]) == 0 && TimeSeconds(time[i]) == 0 )
{
highValue = high[i];
lowValue = low[i];
}
else if( ( StartHour < EndHour && StartHour <= hour && hour < EndHour) ||
( StartHour > EndHour && (StartHour <= hour || hour < EndHour)))
{
bool changeFlag = false;
if( high[i] > highValue )
{
highValue = high[i];
changeFlag = true;
}
if( low[i] < lowValue )
{
lowValue = low[i];
changeFlag = true;
}
if( changeFlag )
{
// 高値安値が切り替わったので過去にさかのぼって更新する。
for( int j = i + 1; j < rates_total; j++ )
{
int currentHour = TimeHour(time[j]);
if( StartHour <= hour && currentHour < StartHour ) break;
if( StartHour > hour && currentHour < StartHour && TimeDay(time[j]) != TimeDay(time[i]) ) break ;
highBuffer[j] = highValue;
lowBuffer[j] = lowValue;
}
}
}
highBuffer[i] = highValue;
lowBuffer[i] = lowValue;
}
return(rates_total - 1);
}
指定範囲内の場合、高値安値を更新するというプログラムになっています。
処理の割にはコードが複雑になってしまいました。
ぱっとアルゴリズムが思い浮かばなかったため、かなりがりがり力技で対応しています。うーん修行が足りません。