メッシです。
前回は変数に関して説明しましたが、今回は条件分岐を扱っていきたいと思います。
※前回の内容はこちらからどうぞ → 第3回 FX初心者でも作れるEA(自動売買)の自作方法とは?今さら聞けない基礎的なことから解説
条件分岐というのは、ある条件が成立した時だけある処理を行うというものになるのですが、この条件分岐を使用することで条件によって成り立たせる処理を変えることができるようになります。
ということで今回は条件分岐に関して解説していきますね。
目次
条件分岐とは?
ある条件が成立した時にだけある処理を行うというように先ほど説明しましたが、もし○○なら△△を行うといったことが可能になります。
例えば「MAがクロスしたら発注する」、「レートがある所まで下がったら注文する」といったことができるようになるわけです。
条件分岐のコードの入力の仕方は?
条件分岐は if を用いて入力するのですが、入力の仕方の基本は以下です。
1 2 3 4 |
if(条件) { 処理; } |
ifの後に()を付け、()の中に条件を入力します。
条件の例としては、「MAがクロスしたら」、「レートがある所まで下がったら」、「+2σにタッチしたら」などのような条件になりますが、この辺はどういうEAを作りたいのかによって変わってきますね。
それからifの下の{}の中に条件が成り立つ場合の処理を入力するのですが、例えば「発注する」というような処理を入力することになります。
コードの入力に関して注意することは?
条件分岐のコードを入力する際に気を付けることがあるので、押さえておきましょう。
・if の行の最後にはセミコロンを付けないが、処理の後ろにはセミコロンを付ける
・{ を入力したら、必ず }で閉じる
if の行の最後にはセミコロンを付けないが、処理の後ろにはセミコロンを付ける
注意することとして、前回までの内容であれば、行の最後に ; セミコロンを付けてきましたが、条件分岐の if に関しては行の最後にセミコロンを付けません。
if() の後ろにセミコロンは付けませんが、処理の後ろにはセミコロンを付けるので気を付けて下さい。
※これはこういうものだとして覚えるしかないので、慣れましょう。
{ を入力したら、必ず }で閉じる
条件分岐の{}に限ったことではないですが、基本的にはカッコを入力したらカッコで閉じることを忘れないようにしましょう。
なぜかというと、EAを作成するにあたってカッコを複数入力することになっていくので、最終的にカッコの数が合わないとエラーになってしまうからです。
例えばエラーになってしまう多い例として、以下のケースがよく見られます。
カッコの入力を忘れないコツとして、始まりのカッコを入力したらすぐに閉じるカッコも入力してしまうことです。
そのあとにカッコの中にコードを入力する癖をつけると、カッコの入力忘れをせずに済みます。
実際に条件分岐のコードを入力してみよう
先ほど説明したことを踏まえ、if を使って条件分岐のコードを入力してみましょう。
条件分岐が成立する場合
変数abcが10よりも小さい時には、「変数abcは10よりも小さいです」というように表示させたいとします(※ただし、変数には5を代入するものする)。
そのような条件分岐のコードはどうなるのかというと、以下のようになります。
例1
1 2 3 4 5 6 7 8 9 10 |
void OnTick() { int abc = 5; if(abc < 10) { Print("変数abcは10よりも小さいです"); } } |
int abc = 5; は、abcを変数として宣言し、5を代入している
if(abc < 10) は、abcが10よりも小さい時にはという条件を出している
Print(“変数abcは10よりも小さいです”); は、if の条件を受けての処理をPrintによって表示するということ
※前回はabcを変数として宣言し、宣言したabcに5を代入する場合を、2つの int abc; と abc = 5; で入力しましたが、int abc = 5; といった感じで1つの入力にまとめることもできます。
どちらでも同じ意味になりますので、好みで入力してもらって構いませんが、ここでは省略した入力で進めていきます。
上記の入力をコンパイルしてエラーが無ければ、MT4のナビゲータのエキスパートアドバイザからチャートにドラッグ&ドロップしてみましょう。
そうすると、ターミナルに「変数abcは10よりも小さいです」と、表示されるはずです。
条件分岐が成立しない場合
先ほどは、変数abcに5を代入し、10より小さい時という条件だったので処理がなされましたが、条件が成立しない場合はどうなるのか見ていきましょう。
先ほどの if文と条件を変えず、変数abcに代入する数字だけを変えてみたいと思います。
代入する数字を5から11に変えてみます。
そうすると、条件分岐のコードは以下になります。
例2
1 2 3 4 5 6 7 8 9 10 |
void OnTick() { int abc = 11; if(abc < 10) { Print("変数abcは10よりも小さいです"); } } |
int abc = 11; は、abcを変数として宣言し、11を代入している
if(abc < 10) は、abcが10よりも小さい時にはという条件を出している
Print(“変数abcは10よりも小さいです”); は、if の条件を受けての処理をPrintによって表示するということ
コンパイルしてMT4のターミナルを見てみると、結果は何も表示されないはずです。
なぜターミナルに何も反映されないのかと言うと、変数abcに11を代入しましたが、if文の条件が10よりも小さい時という条件になっているので、変数abcが10よりも大きいために処理が実行されなかったということになります。
OnTickの中のコードと外のコードの違いについて
ここまで「もし○○なら△△を行う」といった条件分岐のコードの入力は、void OnTickの中(下)に入力してきました。
先ほど例1の条件分岐が成立した場合のコード(下を参照)を見てみると、void OnTick の下にコードを入力していますよね。
void OnTick の中にコードを入力することがどういうことを意味しているのかというと、ローソク足が動く度に(ティックが更新される度に)入力した内容が実行されるという意味合いを持ちます。
逆を言えば void OnTickの外にコードを入力すると、一度実行されてからは、ローソク足が動いても(ティックが更新しても)入力した内容が実行されないということです。
少々難しいと思いますので、例を見ながら理解していきましょう。
例として int abc = 0; が void Ontick の上、つまり外に入力されているコードを見ていきます。
例3
1 2 3 4 5 6 7 8 9 10 11 12 |
int abc = 0; void OnTick() { if(abc > 5) { abc = 0; } Print("abcは",abc); abc = abc + 1; } |
この入力したコードをコンパイルし、MT4にドラッグ&ドロップすると結果がどうなるのかというと、以下のように表示されます。
0から始まり、ティックが更新される度に(ローソク足が動く度に)0→1→2→3→4→5と表示され、5まで表示されるとまた0が表示されているはずです。
つまり、0~5までが繰り返し表示されます。
※void OnTick の中にコードを入力するとどうなるのか、試しに int abc = 0; を void OnTick の中に入力して実行してみます
例4
1 2 3 4 5 6 7 8 9 10 11 |
void OnTick() { int abc = 0; if(abc > 5) { abc = 0; } Print("abcは",abc); abc = abc + 1; } |
コンパイルしてMT4にドラッグ&ドロップしてみると、以下のように表示されます。
先ほどはティックが動く度に0~5までが順番に表示されていましたが、void OnTick の中に int abc = 0; を入力すると、ティックが動く度に毎回0しか表示されません。
では、例3のコードを一つ一つ解説していきますね。
まずは、最初に(1回目)ティックが更新された時に実行される内容の解説から。
① int abc = 0; は、abcを変数として宣言し、abcに0を代入 → void OnTick の外に入力しているため、最初に0が代入された後は、ティックが更新しようがしまいがその後は0は代入されません
② if(abc > 5) は、abcが5よりも大きい時ならという条件を出している → abcが5よりも大きい時は、if(abc>5)の下にある{}の処理(つまりabc= 0; の処理)が実行されることになる
③ abc = 0; は、ifの条件を受けて5よりも大きい時は0を代入するという処理 → 最初に int abc = 0; で0を代入しているため、abcは5よりも小さく、条件をクリアしないので実行されない
④ Print(“abcは”, abc); は、条件分岐の結果を表示 → 考え方として Print(“abcは”); と Print(abc); に分けることができ、Print(“abcは”); は、カッコの中のabcをセミコロンで挟んでいるのでそのままabcとして表示されるが、Print(abc); のabcは、セミコロンで挟まれていないため代入された結果が表示される(※ Print(abc); の方は、最初に int abc = 0; で0を代入しているので、0が表示される)
⑤ abc = abc + 1; は、abcに1を足す → 1回目のティックの更新で最後にabcに1を足して終了になります(※つまり、次にティックが更新されると、今度はabcが1になって始まるということです)
要するにローソク足が動いて1回目にティックが更新されると、①から⑤までの流れが1回実行されるということになります。
そしてまたローソク足が動いてティックが更新されると、②から⑤までが実行されることになり(①は void OnTick の外に入力しているため、1回目のティックの更新でしか実行されない)、ただし次は②のabcが1の状態から始まるということです。
abcが1の状態で始まるとどうなるのか、もう一度例3のコードを見ながら考えて見ましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
int abc = 0; void OnTick() { if(abc > 5) { abc = 0; } Print("abcは",abc); abc = abc + 1; } |
先ほど2回目のティックの更新の時は、②から⑤を繰り返すと説明しましたね。
つまり、
②の if(abc > 5) は、abcが5よりも大きい時ならという条件を出しているので、変数abcは1であることからその下の③の abc = 0; の処理は実行されない。
そしてabcは1なので、④の Print(“abcは”, abc); は、abcは1というように表示される。
最後に⑤で abc = abc + 1; で、abcにまた1が足され、abcが2になって終了になる。
ということになります。
このようにabcの値がプラス1ずつ増える処理が繰り返されることになりますが、abcが6になる状況になると、実行される処理が変わってきます。
なぜなら、if(abc > 5) の条件があるからです。
6になった状態でティックが更新されると②の if(abc > 5) の条件を満たすことになるわけなので、そうなると③のabc = 0; の処理が実行されることになります(※5までは if の条件を満たしていないので、abc = 0; の処理はされなかったということ)。
つまり、6になるはずだったabcの値が0に上書きされることになり、④の Print(“abcは”, abc); は、abcは0 と表示されるわけです。
そしてabcが0まで戻ると、ティックが更新される度に同じことをまた延々と繰り返すことになり、abcは0→abcは1→abcは2→abcは3→abcは4→abcは5→abcは0→… というようにMT4のターミナルに表示されるわけですね。
では、今度は少し数字を変えて例を見て見ましょう。
例5
1 2 3 4 5 6 7 8 9 10 11 |
int abc = 1; void OnTick() { if(abc > 10) { abc = 1; } Print("abcは",abc); abc = abc + 1; } |
この入力したコードをコンパイルし、MT4にドラッグ&ドロップすると結果がどうなるのかというと、以下のように表示されます。
1から始まり、ティックが更新される度に(ローソク足が動く度に)1→2→3→4→5→6→7→8→9→10と表示され、10まで表示されるとまた1が表示されていると思います。
※例3で解説したように例5も同じ原理でなので、説明は割愛します
※ちなみに abc = abc + 1; は abc++; と言ったように省略することもできます。
abc– ; であれば abc = abc -1; になりますが、こう省略して入力する形式は便利ですし、1を足したり引いたりする頻度は今後も多く出てくるので覚えておきましょう。
複数条件分岐
複数条件分岐というのは、ifの条件が成り立たない場合に別の処理を行うことです。
ここまでの例として挙げてきた条件分岐の例は、いずれもif文の条件が成り立たなかった時は処理がされませんでしたね。
そこでここからは、if文の条件分岐が成り立たなかった場合に別の処理を行う例を見ていきたいと思います。
その場合、if文に else を組み合わせることによって、もし○○なら△△を行う、そうでなければ□□を行うという処理ができるようになります。
複数条件分岐の使い方
まずは、例として次のコードを見てみましょう。
例6
1 2 3 4 5 6 7 8 9 10 |
int abc = 0; void OnTick() { if(abc < 10) { Print("abcは10より小さい",abc); } } |
これはabcが10より小さい場合は、「abcは10より小さい」ということを表示するコードですが、abcが10以上の時は条件が当てはまらなく、処理されませんよね。
その場合の処理をするには、先ほども説明したように else を使います。
では、else を使ってabcが10以上の時に処理がされるコードを見てみましょう。
例7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
int abc = 0; void OnTick() { if(abc < 10) { Print("abcは10より小さい",abc); abc++; } else { Print("abcは10です",abc); abc = 0; } } |
コンパイルしてMT4にドラッグ&ドロップしてターミナルを見てみると、以下のような表示になるはずです。
「abcは10より小さい0」 ~ 「abcは10より小さい9」 まで表示され、10になると 「abcは10です10」 と表示されているはずです。
その後はまた0に戻り、また同じ表示を繰り返していると思います。
これはどういうことなのかというと、ifの条件式が成り立つ時には条件が成り立つ処理が実行され、ifの条件式が成り立たない時にはelse以下の条件が成り立たない時の処理が実行されることになります。
このことを踏まえて例7のコードを詳しく解説していきますね。
まずは、if文が成り立つ場合
① abcを変数として宣言し、0を代入している → 変数の宣言と0の代入を void OnTick の中に入力してしまうと、ティックが更新する度に実行されてしまって毎回abcが0になってしまうため、void OnTickの外に入力している。
② abcが10より小さい時にはという条件を出している
③ ifの条件を受け、abcが10より小さい場合の時には、Print(“abcは10より小さい”,abc); の処理がされる → ダブルクォーテーションで挟んでいるものは文字列としてそのまま表示されるが、右側のabcの方はダブルクォーテーションで挟んでいないので、ティックが更新される度に表示される数字が変わる
④ abcに1を足す命令文
つまりabcが0から始まり、ティックが更新しても10より小さい間は、③と④が処理されることになります。
ここまでがティックが更新されてabcが9になるまでの処理になり、10以上の時に処理される⑤と⑥はスルーされるということです。
ここからはif文が成り立たない場合、つまりabcが10になった時の処理の解説になります。
※①~④先ほどと同じ解説になるので、割愛
⑤ ②の条件が成り立たないことを受け、Print(“abcは10です”,abc); の処理がされる → つまり abcは10です10 が表示されることになる
⑥ abcに0を代入し直す命令文
つまり、abcが10になると if(abc < 10) が当てはまらなくなるので、③と④の処理は行われずに else 以下の処理が行われることになります。
Printで10を表示してabcに0を代入し直すので、abcは0に戻ります。
そして、0になったことによってif文の条件がまた成り立つことになり、次のティックの更新で③と④の処理が行われます。
複数条件分岐の使い方に分岐を追加する場合
先ほどはif文を一つ入力し、その条件に当てはまる処理か、もしくは当てはまらない処理のどちらかを表示しましたね。
つまりif文の条件に当てはまれば、abcは10より小さいというifの条件が処理され、if文の条件に当てはまらなければ、abcは10ですというelseの処理がされたわけです(下図はイメージ)。
図1
では今度は、下図のように条件が3つある場合はどうすればいいでしょう。
図2
条件が3つ以上あるときは、else if を使うことで条件の処理をすることができます(※ちなみにこの else if は、何度も使うことができるので、条件が何個あっても処理することが可能です)。
下は else if の書き方の基本になります。
図2のケースのコードの入力はどうなるのかというと。以下のようになります。
例8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
int abc = 0; void OnTick() { if(abc < 5) { Print("abcは5より小さい",abc); abc++; } else if(abc < 10) { Print("abcは10より小さい",abc); abc++; } else { Print("abcは10です",abc); abc = 0; } } |
コンパイルしてMT4にドラッグ&ドロップしてみると、ターミナルには以下のように表示されるはずです。
では、例8のコードを解説していきますね。
① abcが5より小さい時にはという条件を出している
② Print(“abcは5より小さい”,abc); の処理がされる → abcが0から4の時だけ処理される
③ abcに1を足す命令文 → abcが0から4の場合に1が足される
④ abcは10より小さい時にはという条件を出している → ①の条件が成り立たなかった場合に条件が出される
⑤ Print(“abcは10より小さい”,abc); の処理がされる → abcが5から9の時にだけ処理される
⑥ abcに1を足す命令文 → abcが5から9の場合に1が足される
⑦ Print(“abcは10です”,abc); の処理がされる → abcが10になった時にだけ処理される
⑧ abcに0を代入し直す命令文 → abcが10の場合に0が代入される
こういったように else if を使用することで、複数条件お分岐に分岐を追加することができるわけですね。
if文を入れ子にする場合
ここからは、if文の中にif文を入力し、条件の中にさらに条件分岐を使うことに関して説明していきたいと思います。
早速どんなものなのか入れ子を使った例を見てみましょう。
例9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int abc = 0; void OnTick() { if(abc > 10) { if(abc < 20) { Print("abcは10より大きくて20より小さいです",abc); } } Print(abc); abc++; } |
このコードをコンパイルし、MT4にドラッグ&ドロップしてみると、ターミナルには以下のように表示されるはずです。
では、コードの解説をしていきましょう。
① abcが5よりも大きい時にという条件を出している
② abcが10よりも小さい時にはというもう一つの条件分岐を出している → ①で条件が成り立った時にだけ②のもう一つの条件が出される
③ Pring(“abcは5より大きくて10より小さいです”); の処理がされる → ①でabcが5よりも大きい時、かつ②でabcが10よりも小さい時の条件が成り立った時だけ処理される
④ abc(abc); が処理される → ①と②の条件とは関係無く、毎回abcの値は表示される処理
⑤ abcに1を足す命令文 → ①と②の条件とは関係無く、毎回1が足される処理
このような感じでif文を入れ子にすることも可能です。
入れ子に関しては、次の記事で解説していく「演算子」でまたお話しますので、今回はイメージをつかんでもらえればOKです。
まとめ
今回は条件分岐に関して解説してきましたが、ボリュームが多くなってしまったこともあり、一回で落とし込むのは難しいと思います。
読むだけでは落とし込めないので、実際にコードを入力して理解度を深めてもらえればと思います。
More from my site

利益を上げ続けるために
逆算して身に付けていく3つのポイントとは?
Midas FX公式メルマガでは一つ一つポイントを絞ってわかりやすくお伝えしています
さらに「Trade Workbook」&「レンジブレイクアウト攻略法」で
より具体的なスキル(手法やマルチタイムフレーム分析力)を身に付けることが可能です
※「Trade Workbook」と「レンジブレイクアウト攻略法」は
メルマガ登録後すぐ手に入ります
Midas FX公式メルマガ登録【今なら無料】
この記事へのコメントはありません。