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

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

 

2011年11月14日(月)

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



サーバー時間のズレに対応したATRもいよいよ大詰めです。

最後にTRの移動平均を取る部分は指標値を平滑化させるためによく行う方法です。

単に平均を取る単純移動平均(SMA)であれば、for文を使って次のように書くことができます。

for(i=0; i<limit-ATRPeriod; i++)
{
BufATR[i] = 0;
for(int j=0; j<ATRPeriod; j++) BufATR[i] += BufTR[i+j];
BufATR[i] /= ATRPeriod;
}

これで、iからATRPeriod個だけ過去に遡った範囲で、BufTR[]の移動平均を計算させることができます。

なお、iの範囲がlimit-ATRPeriodになっているのは、最初のATRPeriod-1個のバーでは、移動平均を算出するためのデータが揃っていないからです。正確にはlimit-1-(ATRPeriod-1)=limit-ATRPeriod ということです。

このように配列に対して移動平均を取る場合、組込み関数iMAOnArray()を使うこともできます。

それを利用すると、もっと簡単に

for(i=0; i<limit-ATRPeriod; i++)
{
BufATR[i] = iMAOnArray(BufTR, 0, ATRPeriod, 0, MODE_SMA, i);
}

と書くことができます。またMODE_SMAの部分をMODE_EMAに変えると、EMAで平滑化することもできます。

以上まとめると、ATRのプログラムは次のようになります。

#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);
}

// スタート関数
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));
}

for(i=0; i<limit-ATRPeriod; i++)
{
BufATR[i] = iMAOnArray(BufTR, 0, ATRPeriod, 0, MODE_SMA, i);
}

return(0);
}

チャートに挿入するとこんな感じです。

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

上が普通のATRで、下がサーバー時間のズレに対応したATRです。

このローソク足チャートとしては、普通のATRの方が正しいのですが、1週間を5本の足で表すのであれば、下のATRの方が正しいということになります。

この連載はこれで終わりの予定だったのですが、今回作成したATRは、ローソク足の日付とずれてくるので、チャート上ではあまり意味がありません。実際にはEAに組み込んで使うことが多いでしょうから、次回はEAに組み込む例についてご紹介します。


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




Posted at 17時56分


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

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

ランダムウォークとランダムトレード(2)

ランダムウォークとランダムトレード(2)

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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