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

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

 

2011年09月20日(火)

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



サーバー時間のズレに対応したテクニカル指標について、今回から具体的にプログラムの作成を行っていきます。

まずは、以下のプログラムを雛形として考えます。

#property indicator_separate_window
#property
indicator_buffers 1
#property indicator_color1 Green

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

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

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

return(0);
}

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

BufClose[0] = Close[0];
for(int i=1; i<limit; i++)
{
BufClose[i] = Close[i];
}

return(0);
}

これはサブウィンドウ上に終値を表示させるだけのMQL4のカスタム指標プログラムです。ここで、指標バッファやその割り当てなど基本的な書き方の説明は省略します。

注意する点は、指標バッファにデータを代入する順番とその個数です。

指標データは過去から現在の方向に計算されることが多いので、

for(int i=limit-1; i>=0; i--) 

という風に、チャートの左端から右端の方向に順番に代入する繰り返しで記述することが多いです。しかし、このプログラムでは、現在から過去に遡る形で指標値を求めていくので、1から始めてlimit-1まで繰り返す書き方にしています。

i=0の場合だけfor文の前に記述しているのは、4本値が変化する現在のバーと、過去のバーでは、処理の内容が異なってくるからです。

またlimitにはチャート全体のバーの数を代入せずに、具体的な数値(ここでは100)を入れています。深い意味はありませんが、プログラムを挿入するチャートとデータを参照するチャートのタイムフレームが異なっているので、簡単のため固定値にしてあります。

EAでiCustom()関数を使ってこのカスタム指標プログラムを利用する場合、チャート全体の指標値は必要ないので、limitには必要な個数だけ指定すればよいでしょう。

では、このプログラムを元にして、サーバー時間のズレに対応した終値が表示されるように修正していきましょう。

■サーバー時間のズレを変数として宣言

まず、サーバー時間のズレを外部変数 StartHour として宣言しておきます。例えば、6時に始まる場合
extern int StartHour = 6;
のように初期値として6を代入しておきます。

■現在の日付の開始時刻を求める

次に、現在の日付でのサーバーの開始時刻を求めます。つまり、現在の日付でStartHourで指定した時刻を時刻データとして求めるわけです。

この求め方は色々ありますが、現在のサーバー時刻 TimeCurrent()から日付の文字列に変換する関数TimeToStr()を使ってTimeToStr(TimeCurrent(), TIME_DATE)とすると、現在の日付だけが文字列として変換されます。これをさらにStrToTime()関数で時刻に再変換すると、現在の日付の0時における時刻データが得られます。

時刻データは秒単位なので、それに StartHour*3600 を加えることで、現在の日付の6時の時刻データが得られます。
int start_time = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)) + StartHour * 3600;


■前日の終値のバーの位置を求める

ある時刻におけるバーの位置は iBarShift()という関数で求めます。パラメータには通貨ペア名、タイムフレーム、時刻を指定します。同じ通貨ペア、1時間足のチャート、時刻を前に求めたstart_timeとすると、iBarShift(NULL, PERIOD_H1, start_time)と書けます。

これが現在の日付の開始時刻におけるバーの位置なので、それに1を加えることで1時間足チャートの前日の終値を示すバーの位置となります。
int shift = iBarShift(NULL, PERIOD_H1, start_time) + 1;


■サーバーの開始時刻を基準にした終値を求める

for文の繰り返しの中で、前日の終値の位置から24時間ずつ過去に遡っていき、それそれの終値を求めます。1時間足の終値はiClose()関数を利用して取得します。iShift()と同じくiClose(NULL, PERIOD_H1, shift)と書くと、1時間足のチャートの shiftという位置での終値を取り出せます。これを
BufClose[i] = iClose(NULL, PERIOD_H1, shift);
のようにBufClose[i]に代入すれば、前日の終値がBufClose[i]に代入されます。

ただこのままではshiftが変化しないので、すべてのBufClose[i]に同じ値が代入されます。そこで、繰り返す度にshiftの値を24時間分シフトさせる必要があります。ここでは、1時間足のバーに抜けがないと仮定して単純に24を加えていくことにします。
shift += 24;

以上でチャートの開始時刻を起点とした日足の終値が表示されることになります。

全体のプログラムは次回の記事でお見せしますので、それぞれの修正箇所を雛形プログラムのどこに追加すればよいかを考えてみてください。


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




Posted at 13時37分


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

Sponsor AD

2011/9

        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.