基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2011年11月08日(火)

[MQL4]サーバー時間のズレに対応したテクニカル指標(9) [MQL4]



前回の続きです。

True Rangeのために、当日の高値と安値の差、前日の終値と当日の高値の差、前日の終値と当日の安値の差の3つのうち、一番大きな値を求めようということでした。

そのまま考えると、次のように書くことができます。

for(i=0; i<limit-1; i++)
{
double H=BufHigh[i], L=BufLow[i], C=BufClose[i+1];
BufTR[i] = H-L;
if(H-C > BufTR[i]) BufTR[i] = H-C;
if(C-L > BufTR[i]) BufTR[i] = C-L;
}

ささいなことですが、for文の繰り返し範囲が i<limit ではなく、i<limit-1 となっているのは、Cに前日の終値(i+1)が代入されるためです。

上記のプログラムはif文を使いましたが、if文を使わずに、MQL4の組込み関数を使って簡単に記述することもできます。

MQL4には二つの値の大きい方を返す関数MathMax()と小さいほうを返す関数MathMin()が用意されています。

これを使うと下のようにも書けます。MathMax()関数を2回使えば、3個の最大値を求めることができるわけです。

for(i=0; i<limit-1; i++)
{
double H=BufHigh[i], L=BufLow[i], C=BufClose[i+1];
BufTR[i] = MathMax(H-L, MathMax(H-C, C-L));
}

だんだん長くなってきましたが、全体のプログラムは次のようになります。

#property indicator_separate_window
#property
indicator_buffers 1
#property indicator_color1 Green

// 指標バッファ
double BufTR[];
double BufClose[];
double BufHigh[];
double BufLow[];

// 月曜0時に対する開始時間のズレ
extern int StartHour = 0;

// 初期化関数
int init()
{
IndicatorBuffers(4);

// 指標バッファの割り当て
SetIndexBuffer(0, BufTR);
SetIndexBuffer(1, BufClose);
SetIndexBuffer(2, BufHigh);
SetIndexBuffer(3, BufLow);

// 指標ラベルの設定
SetIndexLabel(0, "TR");

return(0);
}

// スタート関数
int start()
{
// 指標を表示させるバーの数
int limit = 100;

// 1日の開始時刻
datetime start_time = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))
+ StartHour * 3600;
if(StartHour > 0 && Hour() < StartHour) start_time -= 86400;
if(StartHour < 0 && Hour() >= StartHour+24) start_time += 86400;

// 前日の最後のバーの位置
int shift = iBarShift(NULL, PERIOD_H1, start_time) + 1;

// 1時間足の高値、安値配列
double BufHighH1[], BufLowH1[];
ArrayCopySeries(BufHighH1, MODE_HIGH, NULL, PERIOD_H1);
ArrayCopySeries(BufLowH1, MODE_LOW, NULL, PERIOD_H1);

BufClose[0] = Close[0];
BufHigh[0] = BufHighH1[ArrayMaximum(BufHighH1, shift, 0)];
BufLow[0] = BufLowH1[ArrayMinimum(BufLowH1, shift, 0)];

for(int i=1; i<limit; i++)
{
BufClose[i] = iClose(NULL, PERIOD_H1, shift);

// 1日の最後のバーの位置
int shift0 = shift;

// 欠けたバーの数
int last_hour = TimeHour(iTime(NULL, PERIOD_H1, shift));
int missing_hours = MathMod(StartHour - last_hour + 23, 24);
shift += 24 - missing_hours;

BufHigh[i] = BufHighH1[ArrayMaximum(BufHighH1, shift-shift0, shift0)];
BufLow[i] = BufLowH1[ArrayMinimum(BufLowH1, shift-shift0, shift0)];
}

for(i=0; i<limit-1; i++)
{
double H=BufHigh[i], L=BufLow[i], C=BufClose[i+1];
BufTR[i] = MathMax(H-L, MathMax(H-C, C-L));
}

return(0);
}

これをチャートに挿入すると次のようになります。

画像(450x333)・拡大画像(659x489)

では、ATRの最後の計算です。期間を定めて、BufTR[]の移動平均を取ります。

ここでは、さらにもう一つ指標バッファBufATR[]を用意します。

また、ATRの期間を後から変えられるようにextern をつけた外部変数 ATRPeriod を宣言しておきます。

init()までの部分は以下のようになります。

#property indicator_separate_window
#property
indicator_buffers 1
#property indicator_color1 Green

// 指標バッファ
double BufATR[];
double BufTR[];
double BufClose[];
double BufHigh[];
double BufLow[];

// 月曜0時に対する開始時間のズレ
extern int StartHour = 0;

// ATRの期間
extern int ATRPeriod = 14;

// 初期化関数
int init()
{
IndicatorBuffers(5);

// 指標バッファの割り当て
SetIndexBuffer(0, BufATR);
SetIndexBuffer(1, BufTR);
SetIndexBuffer(2, BufClose);
SetIndexBuffer(3, BufHigh);
SetIndexBuffer(4, BufLow);

// 指標ラベルの設定
SetIndexLabel(0, "ATR("+ATRPeriod+")");

return(0);
}

BufATR[]に期間ATRPeriodの移動平均を計算するプログラムは簡単に考えれば、次のようになります。

例えば、ATRPeriod=4の場合、

BufATR[i] = (BufTR[i]+BufTR[i+1]+BufTR[i+2]+BufTR[i+3])/4;

という計算になりますが、ここの[i]から[i+3]まで変化しながら足し合わせる部分にfor文を使って記述します。

全体のプログラムは次回紹介します。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 16時05分


ページのトップへ ページのトップへ

Sponsor AD

2011/11

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

値動きのヒストグラムからわかること

値動きのヒストグラムからわかること

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.