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

スポンサーサイト

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

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

今回バーのことがたくさん出てきますが、バーの概念が難しいので、これより先に、補講のバーの方から先に目を通して頂いた方が良いかもしれません。
尚、海外ではローソク足ではなくバーチャートを使われていることが多いので、記述はすべてバーチャートを基準としたものになっています。
ローソク足とほとんど変わらないので読み進めて頂く際にバーとでてきたらローソク足と置き換えて考えて頂くと、ローソク足を普段使っている方はわかりやすいと思います。
それでは今回もよろしくお願いいたします。

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


初めてのインディケーター第三部の講義によくいらっしゃいました。
前回の授業では、初めてのインディケーターのコードを1行1行学んでいき、dinit()関数まで到達しました。

前回の授業でどういう構造になっているかをしっかり理解されてこの講義に辿りつかれていることを願っています。

今日は、start()関数とその中身を勉強します。そしてついに、私たちは初めてのインディケーターをコンパイルし、起動させることになるでしょう。

準備はいいですか? コードを一行一行みていきましょう。

私たちのコード

//+------------------------------------------------------------------+
//| 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(1);
}
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+

____________________________________________________________________


int start()
 {...
  return(0);
 }

以前に言ったように、プログラミングの役割はstart()関数の大括弧の中であり、9割を占めます。
なぜならMQL4のなかでもっとも重要な特別関数だからです。

init()関数やdenit関数と対照的に、start()はターミナルクライアント(メタトレーダーのメイン画面)によって一回しか呼び出されません。しかし、メタトレーダーターミナルクライアントに新しいティックが届けられると、そのたびごとにstart()関数が呼び出されることになります。
start()関数はすべてのMQL4の特別関数と同じように整数値を返します。0の意味はエラーがないということで、何かの数字が出てくるとその意味は、何かエラーが生じたということになります。

____________________________________________________________________

int counted_bars=IndicatorCounted();

ここで私たちはcounted_barsをintegerタイプの変数と定めました。そして、IndicatorCounted()関数の返却値をcounted_bars変数に割り当てました。

int IndicatorCounted()

この関数は私たちのインディケーターが計算した足(バー)の総数をintegerタイプの値で返します。

貴方のインディケーターは最初にこの値を0と数えるでしょう。なぜなら、まだインディケーターはどのバーも算出していないからです。そしてその後、それはチャートに表示されるバー(ローソク足)の総数の-1になります。(後述のbars関数をごらんください。)
____________________________________________________________________
  if (counted_bars<0) return(-1);

一つ前の、IndicatorCounted()関数のコード文を使うことで、私たちはcounted_barsの数を取得しました。
この数はもしエラーが何も起こらなければ、0からそれ以上の数になります。もし0よりも小さい数がでてきたら、それはエラーが起こったことを示しており、start()関数をreturnステートメントを使うことによって終了させなければなりません。(上述のようにreturnに0以外の値が返されるとエラーとしてみなされます。)
____________________________________________________________________
 if (counted_bars<0) counted_bars--;

ここでcounted_barsが0以上であるか確かめます。
もし0以上であるのならば、その数から数字を1減らします。
これは何故かというと、最後のバーをもう一度数えなおしたいからです。

私たちはデクレメント演算子(第4回講義の演算子と式をご覧ください。)を使用して、counted_barsの値からを引きます。

メモ:counted_barの式を以下のようにかくこともできます。

counted_bars=counted_bars-1;
____________________________________________________________________

 int pos=Bars-counted_bars;

ここではposを私たちのループ計算(この講義のあとでのwhileループをご覧ください)が働くであろう回数の値を持つように宣言しています。。これはチャートのバーの総数からcounted_barsを減算することで得られ、バーの総数はBars()関数を使うことで取得します。
ここはBars()関数と、その兄弟について述べるいい機会だと思うのでそのことについて触れていきます。

MQL4の定義済み変数

Ask,Bid,Bars,Close,Open,High,Low,Time,VolumehはMQL4は定義済み変数と名付けていますが、関数です。何故これは関数なのか証明していきましょう。

変数の意味は、メモリーの空間という意味で、そのデータタイプをあなたが特定します。
関数の意味は、ある実行を行い、それによって得られた結果の値を返すことです。たとえばBarsはチャート上の足(バー)の数を集めて、その値を返します。 これは変数なのでしょうか?

また他の観点からも、これらは変数でないことを証明することができます。
もしあなたがこのコード文を記述しコンパイルすると:

Bars=1:

このようなエラー文がでてくるでしょう。'Bars'-unexpected token
これはなぜなら、変数ではないので、値を割り振ることができないからです。

他の証明。次のコード文は適応され、コンパイルでエラーは発生しません。

Alert(Bars(1));

設定値を変数に受け渡すことはできません。設定値は関数にのみ受け渡すことができます。

長々とすみませんでした。それではすべての関数について議論を進めていきましょう。

int Bars

この関数は現在のチャートの足の総数を数え、integerタイプの値としてそれを返します

double Ask

この関数は(エキスパートアドバイザーで使います)現在の通貨における最新の買値をdoubleタイプの値で返します。

double bid

この関数は(エキスパートアドバイザーで使います)現在の通貨における最新の売値をdoubleタイプの値で返します。

メモ:例えば、USD/JPY=98.27/98.31だとしたら、左の値がbidプライス(売値)で次の値がaskプライス(買値)となります。

double Open[]

この関数は指定されたバーの始値の値をdoubleタイプの変数で返します。
始値は、バーの期間(日足、週足、月足、一時間足等)での始値になります。
例: Open[0]は最新のバーの始値を返します。

double Close[]
この関数は指定されたバーの終値の値をdoubleタイプの変数で返します。
終値は、バーの期間での(日足、週足、月足、一時間足等)終値になります。
例: Close[0]は最新のバーの終値を返します。

double High[]

この関数は指定されたバーの高値の値をdoubleタイプの変数で返します。
高値は、バーの期間での高値になります。
例: High[0]は最新のバーの高値を返します。

double Low[]

この関数は指定されたバーの安値の値をdoubleタイプの変数で返します。
安値は、バーの期間での安値になります。
例: Low[0]は最新のバーの安値を返します。

double Volume[]

この関数はその期間内でのバーの出来高(取引された総量の平均)をdoubleタイプの変数で返します。
期間は普通、日足で考えられます。
例: Volume[0]は最新のバーの出来高を返します。

int Digits

この関数は小数点以下の桁数をintegerタイプの値を返します。(普通は4)

double point

この関数は通貨の足の最小単位をdoubleタイプの変数を返します。(普通は0.0001)

detetime time[]

この関数は指定した足の開始した時間の値をdatatimeの値を返します。
例: Time[0]は最新の足の始まった時間を戻します。

____________________________________________________________________

double dHigh, dLow, dResult;
私たちは後で使うことになる三つのdoubleタイプの変数を宣言しました。コンマで区切ることによって同じ行で三つの変数を宣言をしたこのやり方を覚えておいてください。

____________________________________________________________________

Comment("hi! I'mhere on the main cart windows!");


このコード文はComment関数をつかって、"Hi!I'm here on the main chart window"という文章をメインチャートの左上に表示させます(図1参照)
Comment関数には似たような関数が二つあります。

void Comment(...)

この関数は受け渡された値(どのようなデータタイプでも構いません)をチャートの左上の角に表示します(図1参照)

void Print(...)

この関数は受け渡された値(どのようなデータタイプでも構いません)をexpert logに表示します(図2参照)

void Alert(...)

この関数は受け渡された値(どのようなデータタイプでも構いません)をdialog boxに表示します(図3参照)
図1コメント
図1コメント
keikokuke.png
図2expert log
図3警告
図3dialog box

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


さぁついに、私たちのインディケーターを描くための値を算出するためのループの記述をみていくことになりました。
私たちがExtMapBuffer1[]に割り当てた値はすべて、チャートに描かれます(なぜなら私たちはこの配列をSetIndexBuffer関数によって描かれるバッファーに割り当てたからです)

ループを記述する前に、私たちはループが行われるべき回数をチャート上のすべてのバーの総数からcounted_barsを引くことによって算出しなくてはなりません。
ループが実行されるべき回数のことをLoop変数とよび、今回の私たちの例ではpos変数と名付けています。

私たちはloop変数を算出された最新のバーとして使用しています。たとえばHigh[pos]はposバーの中での高値が返されるでしょう。

ループ本体では、dHigh変数にわりあてた最新のループ変数の高値をわりあてます。

また、dLow変数には最新のループ変数の安値をわりあてています。
dHighからdLowを引いた結果がdResult変数に割り当てられます。

それから、dResultを描画するバッファーの配列であるExtMapBuffer1[]に割り当てることでインディケーターラインを描きます。

ループの最後の行はデクレメント式で、ループ変数であるposからループが機能するたびに1をひきます。そしてこの変数が-1に達したら、このループは終了されます。
____________________________________________________________________

最後に私たちはインディケーターをコンパイルすることができます。F5をおすか、fileメニューのCompileを選択してください。
そうすると実行可能なファイルである"My_First_indicator.ex4"を発生させます。そしてそれはあなたのterminal clientから読み込むことができます。

インディケーターを読み込むために、まずF4をクリックしてterminal clientを呼び出してください。それから、NavigatorウィンドウでMy_First_indivatorを見つけて、それをチャートに取り付けてください。(図4参照)

メモ:このインディケーターはあまり使えないかもしれません。しかし、最高値と最安値の差はマーケットのボラティリティを知る上で助けになります。
図4
図4 My_First_Indicator

初めてのインディケーターは楽しんでいただけたでしょうか。また、次回は初めてのエキスパートアドバイザーを講義でとりあげるので準備をしておいてください。


Coders'Guru

今回もお疲れ様でした。 これでインディケーター作成に関する基礎知識は備わったと思いますので、書籍メタトレーダー入門を読むとより深い理解ができると思います。


今回も最後まで読んでくださいましてありがとうございました。



押していただけると大変嬉しいです。よろしくお願いします。手間のかからないようにクリックしても別窓で表示されるようにしてみました。
人気ブログランキングへ



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

コメントの投稿

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

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