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

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

 

2011年10月04日(火)

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



前回の問題です。

StartHourがプラスの場合でもマイナスの場合でも、時刻がStartHourの前後のどちらかでstart_timeを1日ずらさなくてはいけません。そのプログラムを考えてみてください。

こういうロジックも一度に考えては混乱してしまいます。StartHourがプラスの場合とStartHourがマイナスの場合とに分けて考えましょう。

StartHourがプラスの場合、StartHourの時刻になって初めて日が変わればよいので、StartHourより前の時刻では、start_timeを1日分遅らせる必要があります。

start_timeのデータは秒単位なので、1日を秒に換算すると、24*60*60=86400 となります。なので、これを一つの条件文として表すと、

if(StartHour > 0 && Hour() < StartHour) start_time -= 86400;

と書けます。

次にStartHourがマイナスの場合、実際の時刻はStartHour+24なので、StartHour+24の時刻になった時点で日を変える必要があります。つまり、StartHour+24以降の時刻では、まだ日は変わっていないところを強制的に次の日に変えるということから、今度はstart_timeを1日分を進める必要があります。
これを条件式で書くと、

if(StartHour < 0 && Hour() >= StartHour+24) start_time += 86400;

となります。

この2行をstart_timeを計算をした直後に記述すればよいということになります。なお、この二つの条件を同時に満たすことはないので、二つの目の条件文の前にelseを付ける必要はありません。

全体のプログラムは以下のようになります。

#property indicator_separate_window
#property
indicator_buffers 1
#property indicator_color1 Green

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

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

// 初期化関数
int init()
{
// 指標バッファの割り当て
SetIndexBuffer(0, BufClose);

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

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;

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

return(0);
}

では、今回の問題です。

上のプログラムでは、shiftとして前日の最後のバーの位置を求めた後、24本ずつ過去に遡って、日足の終値のバーの位置を決定しています。

1日にちゃんと24本のバーが揃っていれば問題ありませんが、業者によっては、6時から開始する場合でも、週末が4時代で終わっているケースがあります。すると、5時代のバーが抜けていることになるので、そのまま24を引いていくと、1時間ずれてしまうことになります。

そこで、週末に欠けたバーの数を missing_hours とすると、

shift += 24 - missing_hours;

のように、24から引かなくてはいけません。

では、missing_hours はどのようにして計算すればよいでしょうか?

ヒントは、for文の中のshiftが1日の終値のバーの位置を表していますが、そのバーの時刻がチャートの開始時刻の1時間前になっているかどうかを判別することです。

shiftの位置におけるバーの時刻データはiTime(NULL, PERIOD_H1, shift)で取得できるので、さらにそのデータをTimeHour()関数に渡せば、shiftの位置におけるバーの時間のデータが取得できます。

これを使うことでmissing_hoursの計算ができると思います。

プログラムについては次回解説しますので、ちょっと考えてみてください。


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




Posted at 15時52分


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

Sponsor AD

2011/10

            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 31          

プロフィール

豊嶋久道

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

PHOTO

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

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

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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