■超直感!MT4プログラミング講座■ 第13回 MQL基本関数・変数を覚えよう!

スポンサーリンク

こんばんは!キリンです。
昨日、faiさん(とあるMetaTraderの備忘秘録)にブログで私の講座を紹介していただきました。
TopGun公開時よりも数多くのアクセスがありました。
誠にありがとうございます。
今後とも精進していきたく思います。
さて、では前回の回答です。
またもばっちり正解を書いてくださった「りある」さん、
以前からブログを読んでくださっている「junky」さん
コメントありがとうございます!
(りあるさんとは、アメブロ引越し当初からのお付き合いですね。嬉しい限りです。)
また前回のコメントから正解を引用させていただきますね。
りあるさんより

string Array[5];
Array[0] = “Array[0]です”;
Array[1] = “Array[1]です”;
Array[2] = “Array[2]です”;
Array[3] = “Array[3]です”;
Array[4] = “Array[4]です”;
for(int i=3; i<5; i++){
Print(Array[i]);

for文を用いて、
初期値を3からi++で5未満までの繰り返し文を作ってらっしゃいます。
すばらしいっす!
ちなみに、このように書くこともできます。
for(int i=0; i<2; i++){ Print(Array[i+3]); } 配列の[ ]の中で足し算もできちゃうんです。 そして、junkyさんの発展を含んだ答え。

string Array[5];
Array[0] = “Array[0]です”;
Array[1] = “Array[1]です”;
Array[2] = “Array[2]です”;
Array[3] = “Array[3]です”;
Array[4] = “Array[4]です”;
for(int i=0; i<5; i++){ if(i==3){ Print(Array[i]); } if(i==4){ Print(Array[i]); } }

ifを使って、for文の中で表示させるものを選んでいます。
iを0⇒5未満までiを一つづつ増やしながら繰り返しをさせ、
i==3のときのみ、Array[i]を実行させる。
i==4のときのみ、Array[i]を実行させる。
といった動作ですね。これまた素晴らしい回答です。
今までの講義の内容が全て含まれています。
ここで、新しく登場した「==」の使い方のご紹介です。
i<5の場合は、iが5未満であれば true でした。 「変数iと特定の値(今回は5)が等しいか?」という条件文は、i == 5 と書きます。 i = 5でいいんじゃないの?と疑問に思われるかたもいらっしゃると思います。 ですが、この当たりはプログラミングのルールなんですね。 間違えやすいのでお気をつけてください。 ちなみに、i = 5 としてしまうと、変数iの値が5になってしまいます。 「iが5と等しいか?」 にはならないんです。 これらは、「比較演算子」と呼ばれるものになるのですが、 それについても近々お話させていただく予定です。 では、今回の講義です。


第13回 MQL定義済み基本変数を覚えよう!

今日はごくごく基本的なMQL定義済み基本関数のお話をします。
■MQL定義済み変数とは?
■どういったものがあるの?
■実際の使用例
■MQL定義済み変数とは?
string や int 等で定義する必要がなく、
あらかじめ変数として割り当てられているのが、
「MQL定義済み変数」です。
MQLの便利なところは、定義済み変数を用いることによって
Bit値やAsk値、Open値等を簡単に取得できることです。
■どういったものがあるの?
・Bid
売り値を割り当ててある(以降、「値を出す」という意味で「返す」と言います)
・Ask
買い値を返す
以下、配列として扱います
・Close[i]
i番目のローソク足でのクローズ値を返す
・Open[i]
i番目のローソク足でのオープン値を返す
・High[i]
i番目のローソク足での最高値を返す
・Low[i]
i番目のローソク足での最安値を返す
※ここでいうローソク足の順番は直近のものが0で左へ
 0,1,2,3、・・・・という形で移動していきます。
 新しいローソク足ができたら、そのローソク足が0本目になります。
 (以前の0のものは1になる)
■実際の使用例
Trading Systems ~経済的自由を得るために~
↑クリック
チャートの左上にこのように表示させるプログラムを作ってみましょう。
いつものようにスプリクトを使います。
スプリクトの使い方は第8回[リンクはこちら]をご覧いただければと思います。
第8回で作成した[test]というプログラムの中身を下のように変更します。

//+------------------------------------------------------------------+
//| test.mq4 |
//| Copyright Kirin 2010, MetaQuotes Software Corp. |
//| http://ameblo.jp/ftlabo-kirin/ |
//+------------------------------------------------------------------+
#property copyright “Copyright Kirin 2010, MetaQuotes Software Corp.”
#property link “http://ameblo.jp/ftlabo-kirin/”
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//—-
Comment(“Ask : “,Ask, “, Bid : “,Bid,” , Open : “,Open[0], ” Close : “,Close[0],” High : “,High[0],” , Low : “,Low[0] );
//—-
return(0);
}
//+------------------------------------------------------------------+

まず、Comment()の使い方の説明です。
・Comment(string text)
textの中身をチャートの左上に表示させる関数
上で動作した例をご紹介しましたが、このように表示されるんですね。
動作としては、Print()とさほど変わりません。
さらに、今までにも説明させていただきましたが、
文字列を繋ぎ合わせるときは[ , ]もしくは[ + ]でくっつけます。
string型の”test “という値と int型の a (= 1) をくっつけるときは、
“test “,a
とするんですね。
この場合の出力は
test1
となります。
それを繰り返したものが、
“Ask : “,Ask, “, Bid : “,Bid,” , Open : “,Open[0], ” Close : “,Close[0],” High : “,High[0],” , Low : “,Low[0]
なんですね。
実際にメタエディター上でみると、テキストには色の区別がされるので分かりやすいです。
(緑色になる)
(念のためにですが、” ”で囲えば文字列になります。
 ” ”外に文字を打つと関数か変数として扱われます)
Trading Systems ~経済的自由を得るために~
↑クリック
今回のスプリクトを実行することで、
AskやBid,Close[0]などの値を画面上に出すことができると思います。
お分かりいただけましたでしょうか?
ちょっと実践的になってきましたねっ!
楽しみになってきました。
では、最後に簡単な問題です。
最新のローソク足から3本前のクローズ値を得たい場合には、
どうすればいいでしょうか?
最後までお読みくださりまして、ありがとうございます。
ではでは~♪

コメント

  1. りある より:

    SECRET: 0
    PASS:
    今日も頑張ります。
    3本前の終値なので、" Close : ",Close[0],の配列部分をClose[3]とすれば、
    3本前の終値を表示できると思います。
    質問なのですが、Close[0]は、最新のBarの終値になるんですよね?
    最新のBarはtickで動いているので固定値ではなくて、常に変動した値を表示するということでしょうか?

  2. junky より:

    SECRET: 0
    PASS:
    これは日本語の問題なんですが、自分の感覚では現在値を含めて3本目ということで・・・
    Close[2]
    だと解釈しましたが・・・
    あ、前回の自分のつたないプログラム動くんですね(笑)
    分岐を考えると、elseを必ず入れなきゃいけないんじゃないかって思ってました、初めのころは。

  3. junky より:

    SECRET: 0
    PASS:
    文字のサイズや色やフォントを変えたりするにはどうしたらいいのでしょうか?
    あと、表示場所を任意のトコにする方法とか?
    ムズかしいでしょうかぁ?

  4. SECRET: 0
    PASS:
    >junkyさん
    すばらしいっす!
    私の意図している回答でした!
    前回のも動作しますよー。
    素晴らしい回答でした^^
    コメントありがとうございます!

  5. SECRET: 0
    PASS:
    >junkyさん
    ちょっと調べてみましたが、
    おそらくなさそうですね。
    任意の場所に表示は、
    ObjectCreate()関数で可能ですが、
    おそらく意図されているものと違う動作になるかと・・・。
    コメントでの場所の表示の変更はできないですね。

  6. りある より:

    SECRET: 0
    PASS:
    こんばんは。
    Close[2] が答えでしょうか?
    FXメタトレーダーの書籍では、意図として3本前のバーは、現在の変化しているバーは含まない記載だったと思います。
    これだと1本前のバーと言った時、それは現在のバーを表すことになるのでは?
    大事なところなので、詳しい説明をお待ちいしてます。
    日本語は難しいですね。

  7. SECRET: 0
    PASS:
    >りあるさん
    ご指摘ありがとうございます・・・。
    おっしゃる通りで、表示中のローソク足から考えると3本前だとclose[3]です。
    私の日本語の落ち度でした。
    本当に助かります。
    修正しておきます。

  8. ホネクス より:

    SECRET: 0
    PASS:
    string Array[5];
    Array[0] = "Array[0]です";
    Array[1] = "Array[1]です";
    Array[2] = "Array[2]です";
    Array[3] = "Array[3]です";
    Array[4] = "Array[4]です";
    for(int i=0; i<5; i++)
    if(i==3||i==4)Print(Array[i]);
    前回の回答をもうすこしコンパクトにするとこんな感じになりますね
    if(i==3||i==4)Print(Array[i]);
    この文の意味は 
    もしiが3又はiが4の時Print(Array[i]);をするという意味ですねif()やfor()などで実行されるコマンドが一つの場合
    {}で囲む必要はありませんが囲んでもなんら問題はありません
    for()の支配下にif()がありそのifの支配下にprint()があると理解していただければよろしいのではないかなと思います。

  9. いぞぎんちゃく より:

    「i番目のローソク足でのクローズ値を返す」

    このローソク足って時間は日足ですか? 4時間足とかはないんですか??

タイトルとURLをコピーしました