スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
メタバイザー
スポンサー広告  

メタトレーダー講義 第5回 ループと分岐 第1部
こんにちわ。FXボーイです。今回の講義はループと分岐です。
プログラミング独特の思考法を身につけないといけないので最初は大変ですが、インディケーターを作成する上で大変重要な知識になりますので、しっかりと理解してください。
それではCodersGuruさんの講義が始まります。



この文章はCodersGuruさんのMQL4Lesson4の訳文です。(翻訳しての転載に本人の許可はとってあります)                
                   メタトレーダー講義             
                   Coders'guru
                    www.forex-tsd.com                       
                         -5-
                    ループと分岐第一部

MQL4講座の第五回目の講義へようこそいらっしゃいました。

貴方が書いたプログラムの普通の流れのはステートメントからステートメントへと上から下へ実行していきます。(ステートメントとは、特定のアクションを実行または指定する言語エレメントです。while,if,for,else等)

ステートメントはコンピューターにある行動をしろと伝えるためのコード文です。

Print("hello world")
return 0;

最後についているセミコロンはシンタックスの重大な部分です。しかし、簡単に忘れてしまいまして、エラーの90%の原因がだいたいこのセミコロンのつけわすれになります。

しかし、上から下へと実行していくというケースには二つの例外がありまして、その例外にあたるのがループと分岐です。

貴方が書いた -人間が -決定する というこのようなプログラムは、環境が変わっている時にどのような反応をすればよいのでしょうか?このような場合、流れのコントローラーが、あるプログラムの部分から、他のプログラムへと飛び越します。そのような、飛び越しを起こすステートメントのことを、コントロールステートメントと呼ばれます。
そのようなコントロールにループと分岐があります。


               ループ
              --------


ループはあなたのプログラム区間をある決まった回数繰り返すことを命令します。
そしてこの繰り返しは、ある条件内に当てはまっている時は続き、ある条件に満たなくなった時に終わります。
ループが終わったとき、ループのコントロールを飛ばして、ループ区間の次のステートメントに移行します。

そしてMQL4では、二種類のループがあります。


forループ
-------


forループは最も簡単なループだと考えられています。なぜなら、すべてのコントロールエレメント(調整要素)が同じ場所に集まるからです。
forループはコード区間を決まった回数実行します。



int j;
for(j=0;j<15;j++)←コントロールエレメント(ループの動きを指定する要素)が同じ場所にきてますね。
print(j);


これはどのように働くのでしょうか?
forステートメントにはforキーワードが存在します。forの後のカッコ内の、セミコロンで分けられている三つの式がそのキーワードにあたります。

for(j=0;j<15;j++)

これらの三つの式は、前から順に初期値式、テスト式、インクレメント式になります。

j=0←初期値式    
j<15←テスト式
j++←インクレメント式 
ループ本体とは、ループの回数実行されるコードのことを言います。

Print(j);
↑が例における、15回実行されるコードなので、これがループ本体にあたります。

メモ:forステートメントは後にセミコロンがつきません。これは、forステートメントと、ループ本体はプログラムステートメントとして一緒の存在になるからです。

for(J=0;J<15;J++)
 ↑;がたしかについてないですね。

初期値式

初期値式は一回目の繰り返しの時しか実行されません。そしてループ変数に整数値(今回の例では0)を与えます。

ループ変数は、先ほどの例のように、前もってループ本体の外で宣言することもできます。

int j;

もしくは、下の例のように、ループのカッコ内で宣言することもできます。

for(int j=0;j<15;j++)

最初の例と上の例のコードはそれぞれの変数の範囲を除けば同じです。(変数の宣言と範囲については、変数講義のほうで詳しく説明します。)
外で宣言する方法は、コード全体の全ての文に変数を適応します。一方、括弧内での宣言は、forループだけに変数を適応させることになります。

下の例のようにコンマでforループを区切ることによって初期値式を増やして利用できるようになります。


int i;
int j;
for(i=0,j=0;i<15;i++)
print(i)


テスト式

テスト式は常に関係演算子をつかった関係式になります。(メタトレーダー講義第4回を参照なさってください。)

繰り返が行われている時はいつでも、繰り返しは続けるべきなのか止めるべきなのかの決定をするために評価している。もしも式の結果がtrue(真)ならば繰り返しは続けられるだろうし、false(偽)ならば繰り返しは止まるでしょう。

例では、ループの本体はj<15がtrueの間は i (Print(i))を出力し続けるでしょう。
i<15というのは、j=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14の時です。
そしてi15に到達したとき、ループはとまり、コントロールがループ区間を通過して、ループ区間の後のステートメントにいくでしょう。

インクレメント式
インクレメント式はループ変数(例ではjがループ変数)を1ずつ増やしていきます。
それはループの式の中で最後の段階として扱われます。初期値式でループ変数への処理がおわったら。テスト変数で条件が満ているかテストされ、ループ本体が実行されます。

このフローチャートがforループのフローチャートになります。
loop.png



初期値式のように、forループ本体の中に、一つ以上のインクレメント式もコンマで区切って挿入することができます。


int i;
int j;
for(i=0,j=0;i<15;i++,j++)
print(i);


でも、テスト式は一つだけしか使えません。(テスト式はfor(a;b;c)のうちのbです。一つ目の;から初まり、二つ目の;の前がおわりになります。コンマではなく、セミコロンで初期値式、テスト式、インクレメント式をわけているのを注目してください。上の例ではi<15がテスト式です。)

他にインクレメント式で注目しておくべきことは、ループ変数をふやすだけではなく、ループ変数をデクレメント(一つずつ減らす)する操作を行うこともできることです。例をみてください。


int i;
for(i=15;i>0;i--);
Print(i);


上の例では、iの初期値が15に設定されてループが始まります。そしてループする時に1ずつ減っていき、テスト式によってi>0であるかどうかチェックされます。
上の例では、15.14,13,12,11,10,9,8,7,6,5,4,3,2,1.が結果として生み出されるでしょう。

ループ本体の複数ステートメント

今までの例では、一つのステートメント(Print)しか使っていませんでしたが、例外もあります。
ループ本体を大括弧で区切ることによって複数のステートメントを使うことができるのです。例をみてください。

for(int i=1;I<=15;i++)
{
Print(i);
PlaySound("alert.wav");
}


上のループ本体のコードには二つのステートメントが含まれます。プログラムは最初のステートメント(Print)を実行し、そのあと二つ目のステートメント(Play Sound)を、ループが実行されるたびに実行するでしょう。
すべてのステートメントの後に、セミコロンを入れるのを忘れないでください。

Breakステートメント


forループ(whileループでもswitchiループでも)の中にキーワードがあると、ループの実行は終了し、ループ区間の後のステートメントにスキップします。



for(int i=0;i<15;I++)
{
if(i==10)
break;
Print(i);
}

上の例では、i10に届くまでループが実行され、10になるとbreakキーワードがループを終わらせるでしょう。ですので、上のコードが生み出す値は0,1,2,3,4,5,6,7,8,9になります。

continueステートメント

breakステートメントは実行の流れをループの外に持っていきましたが、continueステートメントはループの一番上に戻させます。
例えば


for(int i=0;i<15;I++)
{
if(i==10)continue;
Print(i);
}


上の例ですと、i10になるまでループを実行し、10になったら、continueキーワードがiの10回目を出力せずに、ループの先頭にループを戻します。つまり、上のコードが生み出す値は:0,1,2,3,4,5,6,7,8,9,11,12,13,14.になります。

最後に
もし貴方が望むなら、いくつかあるいはすべての式をforループから外すことができます。例えば
for(;;)
このループはテスト式がつねにtrue(真)であるというwhileループと似ています。
いまからwhileループについて説明しますね。


whileループ
---------


forループは普通、何回ループを実行するか分かっている時に使います。
もしあなたが何回ループを実行したいのか分からない時はどうしたら良いのでしょうか?
そのような時はwhileループを使用すればいいのです。

whileループはforループのようにテスト式があります。それでも、初期値式や、インクレメント式がありません。

これが例です。


int i=0
while(i<15)
{
Print(i);
i++;
}

この例で、あなたは次のことに注目してください。
    ・このループ変数は宣言と初期化がループ前に行われています。whileループでは、forループ
     のように宣言もしくは初期化を括弧内で行うことはできません。
    ・ここのi++ステートメントは誤解されがちなのですが、インクレメント式ではありません。しかし、
     whileループ本体には必ず何かのループ変数を変えるステートメントが存在します。そうでなければ、
     ループが終わることは永遠にないのですから。

上の例はどのように実行されるのか?

whileステートメントはテスト式しか含まれません。そして、それはすべてのループでチェックするでしょう。もしそれtrue(真)ならループは続くでしょうし、それがfalse(偽)ならループは終わり、コントロールはループセクションの次のステートメントへと移動するでしょう。

例では、ループはi16に届くまで実効するでしょう。i<15=falseになった時にループは終了します。

whileループのフローチャートがこちらになります。
whileflow.png


先ほど私は、whileループとforループは似ているといいましたね。これらは似た特徴があります。

1.breakステートメントやcontinueステートメントを使うことができます。
2.ループ本体に、ステートメントを1つで使うことも、2つ以上で使うこともできます。2つ以上で使う場合
 は、大括弧でくぎってください。
3.for(;;)while(true)は同じです。

楽しんで頂きましたでしょうか。これで今回の講義は終了になります。

それでは。
Coders'guru


メタバイザーによる補足説明
さて、このループと分岐はプログラミング未経験者には結構戸惑う箇所だと思う。
私も最初ここを理解するのに3日くらいかかった。

このループはインディケーターを作成する上で必須の知識になるのだが、それでは具体的にどのように使うのか?
それが大事なところだ。今からそのことについて具体的に説明していこう。
mama.png
この図を見て欲しい。これは2日の移動平均線と、ローソク足の番号を振った画像だ。
メタトレーダーでは、ローソク足に番号を割り振っており、一番右端(現在のローソク足)のローソク足は0という決まりがある。それから順に左に一つずれると1,2,3,4,5......のように続いており、画面一番左のローソク足は22番のローソク足ということになる。

移動平均線の算出方法について確認しておこう。
22番目の移動平均線の値=(23番目のローソク足の終値+22番目のローソク足の終値)÷2
になるし、
21番目の移動平均線の値=(22番目のローソク足の終値+21番目のローソク足の終値)÷2
になる。
20番目の移動平均線の値=(21番目のローソク足の終値+20番目のローソク足の終値)÷2

とこのようにローソク足に対応する数だけ移動平均線を算出することで、全ての移動平均線の値が算出され、上の図の白い移動平均線の値が描画されるようになる。

上のような式をプログラムで書くと次のようなコードになる。
for(int i=22;i<0;i--)
Buf1[i]=(Close[i+1]+Close[i])/2

まず、for(int i=22;i<1;i--)の説明だが、これは、ローソク足の番号を22からスタートして(int i=22)、ステートメント(Buf1[i]=(Close[i+1]+Close[i])/2)を実行したら、ローソク足の番号を一つ減らし(i--)、(現在ローソク足の番号は21)また一つ減らしたローソク足の値でステートメントを実行したら、ローソク足の番号を一つ減らし(現在ローソク足の番号は20)、そのローソク足の値でステートメントを実行・・・・・・・を繰り返していき、ローソク足の値が1未満(つまり0)になれば計算を終了する(i<1)という計算をしている。

さて、続いてステートメントを詳しく見ると、
Buf1[i]=(Close[i+1]+Close[i])/2
これは、例えば現在ローソク足の値が22の時は
Buf1[22]=(Close[23]+Close[22])/2
となり、22番目の移動平均線の値=(23番目のローソク足の終値+22番目のローソク足の終値)÷2
と全く同じだ。

この計算式が終わると、先ほど説明したループによって、つぎのローソク足の値は一つ減らされた21になるので、
Buf1[21]=(Close[22]+Close[21])/2
21番目の移動平均線の値=(22番目のローソク足の終値+21番目のローソク足の終値)÷2
ということになる。
これをローソク足の数が0になるまで繰り返していくのが、ループ文だ。

このように、値を変えて同じ計算を繰り返していくことで、チャート上に、直線としてインディケーターが描画されるというわけ。

もしかりに、for文をつかわないで
Buf[0]=(Close[0]+[Close1])
と既述したらどうなるか。答はこちらだ。
ma1.png
つまり、最新のローソク足しかインディケーターを既述しないという結果になってしまう。
まぁ、それでも良いならいいのだが。

とりあえず今回の補足説明は以上だ。while文には触れなかったが、for文さえしっかりつかえれば
こまることはない。

大分長くなってしまったが、寝てないだろうな?ボブ。


何か質問や意見があれば、メタバイザーの放課後まで遊びに来てほしい。 

それではまた会おう。お疲れ様。

人気ブログランキングに参加している。
にほんブログ村 為替ブログ FX システムトレード派へ
もしよろしければ応援してほしい。 どうもありがとう。

ちなみにブログをやっているメタトレーダー仲間は から見ることができる。


最後まで読んでくれたことに感謝している。
メタバイザー
メタトレーダー講義   0

:システムトレード - :株式・投資・マネー


http://metavicer.blog61.fc2.com/tb.php/66-0dd22674
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。