プログラム入門 その2

ここでは、「プログラム入門 その2」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
最終的に、移動平均線のクロスによる自動売買のプログラムを完成させる予定ですが
いきなり自動売買のコードを書くことは難しいので、これから3段階に分けて
解説したいと思います。
1段階目で移動平均線をチャートに表示させるインディケーターを作成する
2段階目で移動平均線のクロスで売買シグナルを表示させるインディケーターを作成する
3段階目で売買シグナルに基ずく売買を自動で行うプログラム(EA)を作成する

今回は1段階目の移動平均線をチャートに表示させるインディケーターを作成したいと思います。



プログラム

#property indicator_chart_window
#property indicator_buffers 1

//---- バッファー
double Buf0[];


//初期化
int init()
{
//---- バッファのインディケータへの割り当て
SetIndexBuffer(0,Buf0);

//---- インディケータの種類の設定
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, Red);

return(0);
}

//処理
int start()
{
int i, limit = Bars-IndicatorCounted();

for(i=limit-1; i>=0; i--)
{
Buf0[i] = (Close[i]+Close[i+1]+Close[i+2]+Close[i+3])/4;
}

return(0);
}



まず始めの2行の#から始まる行はプログラム全体にかかわる設定です。

#property indicator_chart_window
は、チャート上に表示させることを示しています。

別のウィンドウに表示させる場合は、
#property indicator_separate_window
と記入します。

次の
#property indicator_buffers 1
は、使用するバッファーの数を記入します。
今回は、移動平均線を1つ表示させるので「1」と入力します。
バッファーとは簡単にいうと「一時的にデータを蓄えておく記憶装置や記憶領域のこと」です。

次の
double Buf0[];
では変数を入力しています。
変数とは、文字や数字とかを入れておく箱のようなものです。
さらに、変数はを定義しなければいけません。
型とは、その変数に入る値のことで「整数」・「実数」・「文字」等があります。
今回の「double」は「実数」の事をあらわしています。
「整数」と「実数」の違いは小数点が付くか付かないかの違いです。
小数点が付くものは「実数」(double)で入力します。

今回のdouble Buf0[];「Buf0」という名前の変数は「実数(小数点が付く)」の型をしています
ということになります。また、これを変数の宣言といいます。
さらに「Buf0」という名前の変数の後ろに「[]」が入力されていますがこれにもきちんと意味があります。

変数の中には配列変数というものがあります。
5日間の移動平均線を表示したい場合、変数は5個必要になります。
配列変数を使用しない場合は

double Heikin0; //当日の移動平均を代入する変数
double Heikin1; //1日前の移動平均を代入する変数
double Heikin2; //2日前の移動平均を代入する変数
double Heikin3; //3日前の移動平均を代入する変数
double Heikin4; //4日前の移動平均を代入する変数

のように入力します。
5日くらいなら問題なさそうですが、200日でしたらどうでしょう?

double Heikin0; //当日の移動平均を代入する変数
double Heikin1; //1日前の移動平均を代入する変数
double Heikin2; //2日前の移動平均を代入する変数
double Heikin3; //3日前の移動平均を代入する変数
double Heikin4; //4日前の移動平均を代入する変数
double Heikin5; //5日前の移動平均を代入する変数
double Heikin6; //6日前の移動平均を代入する変数
double Heikin7; //7日前の移動平均を代入する変数
double Heikin8; //8日前の移動平均を代入する変数


double Heikin199; //199日前の移動平均を代入する変数

変数の宣言だけでも大変な作業になってしまいます。
そこで配列変数を使用します。

double Heikin[200];

この一行で 「double Heikin0;」 ~ 「double Heikin199;」 まで宣言したのと同じことになります。
さて今回のコードを見てみると、double Buf0[];となっています。
配列変数の宣言をしているのですが数値が入っていない為何個の変数を用意するのかわかりません。
これは、チャート上では、
・過去に何個のデータがあるかわからない
・時間が経てば次々に増えていく
ので配列の数が決められないからです。

さらに、外部で宣言した数値なしの配列の最初の値、つまり、Buf0[0] は常に一番最新のバーでの値になります。
そして、Bu0f[1]は1つ前のバー、Buf0[2]は二つ前のバーでの値ということになります。
新しいバーが出ると、同じようなルールで配列の値がすべて置き換わります。

次に、
int init()
{

SetIndexBuffer(0,Buf0);

return(0);
}
の処理ですが
int init()で始まる部分は前回やりましたが、起動時に1回だけ処理を行います。
何を処理しているかと言うと
SetIndexBuffer(0,Buf0);
という処理を行っています。

実は配列を定義して計算結果を代入するだけではインディケータは表示されません。
SetIndexBuffer() という関数で、配列を実際のインディケータに割り当ててやる必要があります。

また、表示する線の色や線種をSetIndexStyle()という関数で指定します。
この関数は5つのパラメータがあります。

SetIndexStyle(index, type, style, width, clr)

それぞれのパラメータの意味は

index : インディケーターの番号(0,1,2,3,4,5,6,7)
type : インディケーターの種類(DRAW_LINE, DRAW_SECTION, DRAW_HISTOGRAM, DRAW_ARROW, DRAW_ZIGZAG, DRAW_NONE)
style : ラインの種類(STYLE_SOLID, STYLE_DASH, STYLE_DOT, STYLE_DASHDOT, STYLE_DASHDOTDOT)
width : ラインの幅(1,2,3,4,5)
clr : ラインの色(Black, Red, Blue ・・・)

です。
今回は
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, Red);
インディケーターの番号は「0」、インディケーターの種類は「線」、ラインの種類は「実線」、ラインの幅は「1」、ラインの色は「赤」を指定しています。

この処理は最初に1回行えばいいのでint init()内に入力しています。

さて、肝心の移動平均線を表示させる処理内容ですが

int start()
{
int i, limit = Bars-IndicatorCounted();

for(i=limit-1; i>=0; i--)
{
Buf0[i] = (Close[i]+Close[i+1]+Close[i+2]+Close[i+3])/4;
}

return(0);
}

のように入力されています。
また一行づつ見ていきましょう。

int i, limit = Bars-IndicatorCounted();
は、「i」と「limit」という変数の宣言を行っています。
両方とも型は「整数」なので、intを使用します。
同じ型の場合は「,」で区切って宣言することが可能です。
さらに「limit」には初期値としてBars-IndicatorCounted()が代入されています。
Barsは予め定義されている特別な変数でチャート上のバーの総数をあらわします。
また、IndicatorCounted()は、過去の変化しなかったバーの数を返す関数です。
つまり、limitには現在のチャート上のバーの総数から過去の変化しなったバーの数を引いた値が代入されています。

さて、次の行のfor(i=limit-1; i>=0; i--)ですが
for「{ 」~「 }」内を条件が満たすまで繰り返し処理を行います
今回の場合、
変数「i」に変数「limit」から「1」を引いた数を代入する。
変数「i」が「0」以上だったら ←これが条件
Buf0[i] = (Close[i]+Close[i+1]+Close[i+2]+Close[i+3])/4;を計算する。
最後に「i--」(i=i-1)を計算する。
上記の4つを繰り返し処理します。

この処理の中で一番重要なのはBuf0[i] = (Close[i]+Close[i+1]+Close[i+2]+Close[i+3])/4;の部分です。
Closeは予め定義されている特別な変数で終値をあらわします。
現在のバーの終値はClose[0],1つ前のバーの終値はClose[1],2つ前のバーの終値はClose[2]というように入力します。
今回の場合は、


Buf0[2] = (Close[2]+Close[3]+Close[4]+Close[5])/4;
Buf0[1] = (Close[1]+Close[2]+Close[3]+Close[4])/4;
Buf0[0] = (Close[0]+Close[1]+Close[2]+Close[3])/4;

というように計算されていきます。

次回は第2段階の移動平均線のクロスで売買シグナルを表示させるインディケーターを作成します。
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://fxsk.blog105.fc2.com/tb.php/75-1240a034
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。