文系人間のためのシステムトレーダー養成所 メタトレーダー講義第11回 初めてのインディケーター第2部
--------

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2009-03-20

メタトレーダー講義第11回 初めてのインディケーター第2部

この文章はCodersGuruさんのMQL4Lesson4の訳文です。(翻訳しての転載に本人の許可はとってあります)         
                      MQL4講座       
                     Coders'guru                               
                      www.forex-tsd.com                          
                           -11-
                 初めてのインディケーター
                 第2部



初めてのインディケーターの第2回目の講義へようこそ。
前回の講義では、私たちは何もコード文をかきませんでした。それはなぜなら、操作ガイドが私たちのためにコードを書いてくれていたからです。ありがとう!

今日は、私たちのプログラムがより役立つものになるように操作ガイドが作ってくれたコードに少し文章を追加していきましょう。
その後、コード文の1行1行説明していきます。

さぁ記述しましょう!

追加するコード

追加するコードは前回のコード文に太字の蒼黒色で描き込みます。

//+------------------------------------------------------------------+
//| my_first_indicator.mq4 |
//| Codersguru |
//| http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Codersguru"
#property link "http://www.forex-tsd.com"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{

//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
string shotr_name="Your first indicator is running!";
IndicatorShortName(short_name);



//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int
counted_bars=IndicatorCounted();
//----check for possible errors
  if (counted_bars<0) return(-1);
//----last counted bar will be recounted
  if(counted_bars>0) counted_bars--;

  int pos=Bars-counted_bars;
  
  double dHigh , dLow , dResult;
  Comment("hi! I'mhere on the main cart windows!");


//----maincaluculation loop
  while(pos>=0)
   {
      dHigh=High[pos];
      dLow=Low[pos];
      dResult=dHigh - dLow;
      ExtMapBuffer1[pos]=dResult ;
      pos--;
    }

return(0);
}
//+------------------------------------------------------------------+

____________________________________________________________________

どのように動くの?

コード文を書いたらそのあと、そのコード文を説明していきます。もしそのコード文に取り上げるべきトピックス(テーマを決めて行うべき学習)がないのなら、その時はコード文を直接説明します。しかしほとんどの時間は、いくつかの一般的なトピックスを議論するために立ち止まることになります。

それでは、コードを1行1行解明していきましょう。
//+------------------------------------------------------------------+
//| my_first_indicator.mq4 |
//| Codersguru |
//| http://www.forex-tsd.com |
//+------------------------------------------------------------------+


コメント:

最初の五行のコード(灰色のコードです)はコメントになります。
コンパイルが無視するであろうコード文を書くためには、コメントを使用します。
コメントを書くべき理由はたくさんの理由があります。
    ・コード文をきれいにするため
    ・著作権や、制作日等を記述するため
    ・コード文をよりわかりやすくするため
    ・私たちにあなたのコードがどのように動くかを説明するため。
    ・etc...

コメントは2種類書くことができます。

1行コメント:  1行コメントは"//"で始まり、終わりには改行を使います。

複数文コメント:複数文コメントは"/*"で始まり、"*/"で終わらせます。これによって1行以上のコメント
         がかけるようになります。

MQL4操作ガイドはプログラム名著作名リンクを記入したデータを取り入れ、それらをコメントとし私たちのプログラムの先頭に記述します。
____________________________________________________________________

#property copyright "Codersguru"
#property link "http://www.forex-tsd.com"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red



propertyコマンド

貴方が注目したように、これらの文はすべて"#property"から始まっています。これはなぜなら、プリプロセッサコマンドのうちの一つである、propatyコマンドと呼ばれているものだからです。

プリプロセッサーはコードを読み込む前にそれらを実行できるようにするためにコンパイラーに渡す取扱い説明書です。

propertyコマンドは、MQL4に内蔵され、予め定義された定数でコンパイル制御と呼ばれています。
役割は、あなたのプログラムの特性を指定するものです。
例えば、あなたのインディケーターは、メインチャートウィンドウもしくはセパレートウィンドウのどちらに現わしますか?プログラムの作成者は誰ですか?といったものです。

メモ:プリプロセッサーの文の終わりはセミコロンの記号ではなく、改行でおこなってください。

link:
このプロパティーはあなたのウェブサイトのリンクをしていするものです。操作ガイドの2ステップめで記入したものが表わされます(詳しくは前回の講義をご覧ください。)
データタイプはstringになります。

copyright:
プログラムの著作者の名前です。link propertyと同じように、操作ガイドのステップ2で記入したものが表示されます。
データタイプはstringです。

stacksize
すべてのスレッド(ソフトウェアの実行単位)のために割り当てられたメモリーの大きさ。整数値で表わされる。初期設定値は16384。データタイプはintegerです。

indicator_chart_window:
このプロパティーを指定すると、あなたのインディケーターはメインチャートウィンドウ(図1参照)に描かれるようになります。貴方はインディケーターを二つのオプションのうちから一つを選ばなくてはなりません。このpropertyを使ってメインチャートウィンドウに描くか、それとも indicator_separate_windowのpropertyをつかって、セパレートウィンドウに表示させるかです。同時に二つを使用することはできません。
データタイプはvoidを使用しますつまり、何も値をとらないということです。

indicator_separate_window:
このpropertyをセットすると、あなたのインディケーターはseparate window(図1参照)に描かれます。セパレートウィンドウのとる範囲を二つのpropertyを使うことによって指定することができます。indicator_minimumを使って最小値を指定し、indicator_maximumを使って範囲の最大値を指定することができます。
そして、indicator_levelNのpropertyを使うことによってインディケーターのレベルの範囲も指定できます。インディケーターに割り当てられた数字がNになります。

indicator_chart_windowindicator_separate_windowの二つのpropertyはvoidのデータタイプです。voidは何も値を取ることがないことを示し、ただそれを書き込んでください。

今回のプログラムでは、セパレートウィンドウにインディケーターを割り振ります。
#property indicator_separate_window

chartwindow.png
                      図1



indicator_minimumu
このpropertyによって、セパレートウィンドウの目盛の最小値を決めることができます。これはウィンドウの底辺になります。具体的にいうと
#property indicator_minimum     0
#property indicator_maximum     100
ここではウィンドウの底辺を0に、天井を100(indicator_maximumをご覧ください)に指定しました。そのようなわけで、もしこのコード文を書き入れると、私たちのインディケーターが描かれるセパレートウィンドウ目盛範囲は0から100になります。
データタイプはintegerになります。

indicator_maximum:
このpropertyにより、セパレートウィンドウの目盛の最大値を決めることができます。これはウィンドウの天井になります。値はindivator_minimumの値よりも大きくなくてはなりません。データタイプはintegerになります。

indicator_levelN
このpropertyにより、インディケーターの範囲内でレベルを指定することができます。その範囲は、indicator_minimumuと、indicator_maximumuで作りだした範囲内に収めなくてはなりません。つまり、indicator_levelNの値は、indicator_minimumよりも大きく、indicator_maximumの値よりも小さくなくてはならないということです。
Nは、レベルを指定しているインディケーターナンバーで、1から8までの値しかとれません。(なぜなら、プログラムでは、8つのインディケーターバッファーしか使用することが許されていないからです。ですので、indicactor__levelは、使っているNの数それぞれにレベルを指定することができます。)例えば
#Property indicator_minimum   0
#Property indicator_maximum   100
#Property indicator_level1     10   //最初のインディケーターバッファーレベルの指定
#Property indicator_level2     65.5  //二度目のインディケーターバッファーレベルの指定

このpropertyのデータタイプはdoubleになります。

indicator_buffers:
このpropertyを使用することにより、ラインを描くために割り当てたメモリー空間(配列)の数を指定します。数を指定(1の範囲で)するときに、私たちはMQL4に「私のインディケーターラインを描くためにメモリー空間を割り当てておくれ」と伝えていることになります。

私たちのプログラムでは、ひとつのバッファーしか使いません。
#property indicator_buffers 1
これは私たちが一つのラインしか使わないからです。
(ラインとは指標の線のことを指し、MACDやストキャスティクスなら2本、RSIなら一本といったことになります。MACDやストキャスティクスならindicator_bufferは2になります。)

indicator_colorN:
私たちは8つのラインをインディケーターに使用することができますが、indicator_colorNのpropertyを使用することによって、それぞれのラインの色を指定することができます。Nは、indicator_bufferで定めたラインナンバーに対応します。(今回はindicator_bufferでNをに指定したのでindicator_colorのN以外取ることができません。)
あなたのインディケーターのユーザーは、この色をインディケータープロパティから変更することができます。(図2参照)
私たちのプログラムでは、インディケーターラインの色は赤に設定しています。
"#property_indicator_color1 Red
このデータタイプはcolorをとります。
____________________________________________________________________

colorpro.png
                     図2

____________________________________________________________________

double ExtMapBuffer1[];

配列:

私たちの人生は、普通似た目的も人たちが集まりグループを形成します。プログラミングでも、同じタイプのデータ項目が一緒になってグループを作る必要があります。この仕事を配列を使うことによっておこないます。(こうすることで、例えば50あるintegerタイプの変数をいちいち宣言しないで済むようになります。)
配列は一覧表と大変よく似ています。あなたは表の中に分類分けした項目を集め、そしてその項目を行数を指定することで利用します。配列の中での行数はインデックスと呼ばれます。


使用する配列を宣言するためには以下のようにおこないます
int my_array[50];
ここでは、配列をintegerタイプだと宣言しました。そして、その配列には50項目のintegerタイプの変数を持つことができます。

項目のインデックスを使用することで、配列の中のそれぞれの項目を利用することができます。
My_array[10]=500;
ここでは、配列の中の項目番号(インデックス)10のものを500と指定しました。(My array[10]は自然とintegerタイプになります。)

同じ列の配列の宣言を同時に行い初期化することもできます。
int my_array[5]={1,24,15,66,500}:

私たちのプログラムではこのコード文をつかいました。
double ExtMapBuffer1[];

ここでは、私たちはdoubleタイプの配列と宣言しています。これは、配列をチャートに描くための値を算出するために使うことになります。(今回のコードの一番最後の方に書かれているExtmapBuffer1=dResult;で値の結果がつねにdoubleであると指定して、割り振っていることになります。)

____________________________________________________________________________________________

int init()
{
}


特別関数

関数はコードのひとかたまりで、機械のように材料を投げ込まれると、製品を生み出す働きをします。(詳しくは第7回講義―関数をご覧ください。)
MQL4は3つの特別な関数があります。
init():
全てのプログラムはその他のどの関数よりも前に、この関数から起動します。ここには貴方の変数の初期値を入れなければなりません。
start();
ここが最も働く場所になります。新しいティックが受け取られるたびにあなたのプログラムは関数を呼び出します。
deinit();
これは、プログラムが終了される前に呼び出される最後の関数になります。ここでは貴方が望めばどのような処理でも行うことができます。
____________________________________________________________________
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
string shotr_name="Your first indicator is running!";
IndicatorShortName(short_name);




Custom indicator function:

今回の講義ですべてのインディケーター関数の解説を行うことはできませんが、次の講義ではその詳細とともにすべてを取り上げたいと思います。ですので、今回は私たちが作っているプログラムに出てくるもののみを取り上げたいと思います。

SetIndexStyle
____________________________________________________________________________________________
void SetIndexStyle(int index,int type,int style=EMPTY,int width=EMPTY,color clr=CLR_NONE)
____________________________________________________________________________________________

この関数は描かれるラインのスタイルを指定します。

この関数のインデックス(項目番号)設定値の範囲は0~7です。(なぜなら配列は0から始まり、ライン数の限界は8本と決まっているからです。)そしてSetIndexStyleを使用してラインのスタイルを指定していきます。(今回は、ラインは一本だけなので、必然的にインデックスは0です。1から始まるのではなく0から始まることに注意してください。)

type設定値はラインの形の種類を決定するもので、以下のtype定数から一つ選ぶことができます。
DRAW_LINE(ラインで描く)
DRAW_SECTION(セクションで描く)
DRAW_HISTOGRAM(棒グラフで描く)
DRAW_ARROW(マークで描く)
DRAW_NONE(何も描かない)
初期設定値はDRAW_LINEになります。

style設定値は、ラインを描く時の線種を設定するものです(点線とか太い線とか)以下のstyle定数から選ぶことができます。
STYLE_SOLID(通常の線をかく)
STYLE_DASH(ダッシュの線を書く   ― ― ―)
STYLE_DOT(ドットの線を書く      ・・・・・・・・・)
STYLE_DASHDOT(ダッシュとドットの線を書く  ― ・ ― ・ ― ・)
STYLE_DASHDOTDOT(ダッシュの後にドットが二つ続く線をかく   ― ・ ・ ― ・ ・ ― ・ ・)
初期設定値はSTYLE_SOLIDになります。線の太さ(width)が2以上の時は設定できないので気を付けてください。

width設定値は線の太さを決めるもので1から5までの範囲で選択できます。初期設定値はになります。

clr設定値はラインの色をきめるものです。それはcolor変数の値をとります。初期設定値はになります。

私たちのラインに関するコード
SetIndexStyle(0,DRAW_LINE);
インデックスは0に指定しました。これは私たちは第一の(そして唯一の)ラインに指定したことになります。

そしてラインの形のタイプをDRAW_LINEに指定しました。その他のstyleの設定は、何も記述していないので初期設定(STYLE_SOLID,1,黒)に設定されることになります。ただしここでラインの色は、#property indicator_buffers 1で赤に設定されているため赤が表示されます。ちなみにDRAW_LINRも初期設定値に設定されているため、 SetIndexStyle(0,DRAW_LINE);は記述しなくても同じ結果が得られます。
SetIndexStyleは、 SetIndexStyle(インデックス(ラインの指定),type,style,width,color) のように記述するので、ラインのスタイルをあらかじめ指定したい場合には以下のように記述します。

SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_DOT,1,Blue);

コンマで区切っていくことを忘れないでください。


SetIndexBuffer:
____________________________________________________________________________________________
bool SetIndexBuffer(int index,double array[])
____________________________________________________________________________________________
この関数は、インディケーターを描くインディケーターバッファーの値に割り当てる配列を指定します。

この関数はバッファーのインデックスをとります。0というのは最初のバッファーで、1というのは二つ目ということになります。そのあと、配列の名前をとります。
今回はラインが一つしかないので、必然的に配列のインデックスは最初のバッファーである0になります。
もしその関数が成功すればtrueが帰ってくきますし、falseが帰ってきたらば成功ではなかったことになります。
私たちのプログラムでは、算出値をとどめておく配列はExtMapBuffer1になります。
そして私たちはただ一つのインディケーターバッファーを持っています。(#property indicator buffers 1)ですので、これが、割り振られたバッファーです。

IndicatorShortName
____________________________________________________________________________________________
void Indicator ShortName(string name)
____________________________________________________________________________________________

この関数はチャートウィンドウ左上の角(図3)に表示される文章を指定します。
私たちのプログラムでは、string変数を宣言し、その値を"Your first indicator is runnning"と割り振りました。それからその変数をIndicatorShortName関数に受け渡します。

string shotr_name="Your first indicator is running!";
IndicatorShortName(short_name);



shortname.png
                          図3
____________________________________________________________________
return(0);

これがinit()関数の戻り値であり、関数の終着点になります。そして次のstart()関数の実行へとプログラムを渡します。
____________________________________________________________________________________________


int deinit()
{

//----

//----
return(0);
}
denit()関数について新しく言うことはありません。

次の回に残りのコードについて解説しようと思います。
楽しんでいただけましたでしょうか。

それでは。
Coders'Guru


本日もお疲れ様でした。
ようやく実践にはいってきて楽しいですね!
まず自分でコードを作って、そのコードと見比べながら読み進めていき、バッファー0の意味がわからなかったら1にしてやってみるとか試行錯誤しながらやっていくとより詳しく理解できるのではないかとおもいます。

質問等ございましたらできる限り答えられるように努力いたしますのでお気軽にどうぞ。

インディケーターが自分の手で作れるようになるためにも頑張りましょう^^

本日もありがとうございました。



押していただけると大変嬉しいです。よろしくお願いします。
人気ブログランキングへ




theme : FXでシステムトレード
genre : 株式・投資・マネー

コメントの投稿

管理者にだけ表示を許可する

承認待ちコメント

このコメントは管理者の承認待ちです
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。