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

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

 

著書のご紹介

2011年10月25日(火)

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

まずは、前回説明した週明けの開始時刻を基準にした日足データの終値、高値、安値を表示させるプログラムです。

#property indicator_separate_window
#property
indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Blue
#property indicator_color3 Red

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

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

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

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

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

return(0);
}

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

画像(450x257)・拡大画像(800x457)

このチャートだけでは、プログラムが正しいかどうかよくわからないと思うので、データウィンドウに各指標値を表示させて、1時間足のデータと見比べながら確認してみてください。

これで新しい日足データの4本値のうち、始値以外のデータが算出できました。

今回は、ついでに始値も求めてみましょう。

始値はどうすればよいかということですが、直前の終値に注目します。for文中に1日前以前の終値が求められているので、その1バー後の始値を1日の始値とすればOKです。

具体的には次の行をBufClose[i]を求める行の前に書くだけです。

BufOpen[i-1] = iOpen(NULL, PERIOD_H1, shift-1);

shiftの位置が1時間足チャートにおける1日の終わりのバーの位置なので、その一つ後(shift-1)が次の日(i-1)の始めのバーの位置となります。iOpen()を使って始値を求め、それをBufOpen[i-1]に代入します。

なお、BufOpen[]の配列は、BufClose[]などと同じように宣言してあるもとのします。

これで、新しい日足チャートの4本値が得られました。これを使うと、サーバー時間がズレていてもだいたい同じ日足データが得られるので、同じようなテクニカル指標を計算することができます。

次回はその応用例としてATRのプログラムを作成してみます。

Posted at 15時34分 パーマリンク


2011年10月18日(火)

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

今回は、週明けの開始時刻を基準にした1日の範囲の中での最高値と最安値を求めるプログラムを追加していきます。

まずは、1日の高値と安値を指標値として表示させるために、BufHigh[]とBufLow[]という指標バッファを追加します。以下に初期化関数init()までの部分を示します。

#property indicator_separate_window
#property
indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Blue
#property indicator_color3 Red

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

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

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

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

return(0);
}

注意する点は、表示させる指標値が3個なので、

#property indicator_buffers 3

とすることです。あとは、BufHigh、BufLow用SetIndexBuffer()SetIndexLabel()がそれぞれ追加されています。

これで、BufHigh[]、BufLow[]に値を代入すればチャートに表示されるようになりました。

では、次に最高値、最安値を求める方法ですが、ここでは配列の要素の中の最大値と最小値を求めるMQL4の関数を使ってみます。

その前に1時間足の高値、安値のデータを配列に代入しておきます。これはArrayCopySeries()という関数を使います。引数には、配列名、4本値の種類、通貨ペア名、タイムフレームを取ります。

BufHighH1[]、BufLowH1[]という配列に1時間足の高値、安値をそれぞれコピーするプログラムは下のようになります。

double BufHighH1[], BufLowH1[];
ArrayCopySeries(BufHighH1, MODE_HIGH, NULL, PERIOD_H1);
ArrayCopySeries(BufLowH1, MODE_LOW, NULL, PERIOD_H1);

ここで、BufHighH1[]、BufLowH1[]は、最新のバーがBufHighH1[0]、1本前のバーがBufHighH1[1]に対応する時系列配列です。High[]やLow[]と同じように扱うことができます。

配列の最大値、最小値を求める関数としてArrayMaximum()ArrayMimimum()を使います。

これらの関数は、配列名、データの個数、データの最初のインデックスという3つ引数を取り、その中のデータの最大値、あるいは最小値のインデックスを返します。

まずは、最新のバーにおける高値、安値ですが、shiftが前日の終値の位置なので、0から始まってshift-1までのshift個のデータの中から最大値、最小値を求めます。

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

次に過去のバーにおける高値、安値を求めます。これはfor文中の記述になるので、shiftの値に注意する必要があります。

shiftの値はfor文に入った時点では、その日の終値の位置になっています。そしてfor文の最後では、shift += 24 - missing_hours; としてその前の日の終値の位置になります。

高値、安値を求める際には、この最初のshift最後のshiftの両方の値が必要となります。そこで、最初のshiftを別の変数、ここでは int shift0 = shift; として記憶させておきます。

そして、for文の最後で、shift0からshift-shift0-1までのshift-shift0個のデータの中から最大値と最小値を求めます。

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

全体のプログラムは次回紹介します。今回出てきた関数をどこに追加すればよいか考えてみてください。

Posted at 17時06分 パーマリンク


2011年10月11日(火)

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

前回の続きです。

週末のバーと週明けのバーの間に欠けたバーがある場合の処理についてです。

具体例を考えてみましょう。

StartHour=6の場合、週末のバーの時間が5であれば問題ありません。問題となるのは、4以下の場合です。

週末のバーの時間が4であれば、1本バーが欠けているということで、missing_hours=1週末のバーの時間が3であれば、2本欠けているのでmissing_hours=2となればいいわけです。

週末のバーの時間はTimeHour(iTime(NULL, PERIOD_H1, shift))で取得できるので、これをlast_hourとすると、missing_hours = StartHour-last_hour-1となります。

以上を条件文として記述すると、

int missing_hours = 0;
int last_hour = TimeHour(iTime(NULL, PERIOD_H1, shift));
if(last_hour < StartHour-1) missing_hours = StartHour-last_hour-1;

と書けます。

但し、この記述は、StartHour>0の場合はうまくいきますが、StartHour<0の場合、ちょっと問題があります。

例えば、StartHour=-3、last_hour=19の場合、条件式が19<-4となり、成立しないため、欠けたバーの数はカウントされません。

この場合、別の条件式を書いてもいいのですが、よーく考えると、逆に簡単に書けたりもします。

int last_hour = TimeHour(iTime(NULL, PERIOD_H1, shift));
int missing_hours = MathMod(StartHour - last_hour + 23, 24);

上の式でMathMod(x,y)という関数は、xをyで割った余りを返します。

例えば、StartHour=6, last_hour=4の場合、MathMod(6-4+23, 24)=1となりますし、StartHour=-3, last_hour=19の場合も、MathMod(-3-19+23, 24)=1となります。

ここまでの全体のプログラムは以下のように書けます。

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

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

return(0);
}

以上のプログラムが、サーバー時間のズレに対応させるための骨格にあたる部分です。プログラムも骨格をしっかり作っておけば、その肉付けは比較的簡単にできるようになります。

次回は今回のプログラムで定めた1日の範囲の中での最高値と最安値を求めるプログラムを追加していきます。

Posted at 15時23分 パーマリンク


過去の記事へ

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

Sponsor AD

シストレナビモバイル

シストレナビモバイル
ケータイでバーコードを読み取りアクセス(詳細はこちら

プロフィール

豊嶋久道

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

活動状況・Website

ToyolabFX
Toyolab FX-手ぶらで為替取引
FXトレーディング研究所。
FXメタトレーダー入門
FXメタトレーダー入門
最先端システムトレードソフト使いこなし術。
FXメタトレーダー実践プログラミング
FXメタトレーダー実践プログラミング
システム開発過程を段階的に学ぶ。

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          

PHOTO

Excelでヒストグラムの作成

Excelでヒストグラムの作成

カテゴリーリスト

最近の記事

スポンサードリンク

検索


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

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

RSS1.0

[Login]


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