【MQL5パラダイス 第4回】EAに「決断」をさせよう!if文で相場の分かれ道をナビゲート
みなさん、こんにちは!パイナップルです。
前回の第3回では、データを記憶しておくための魔法の箱、「変数」についてお話ししました。
int(整数)やdouble(小数)といった箱に、価格やロット数を入れて保管する方法を覚えましたね。ご自身で数字を書き換えて、Print関数で表示させる実験はうまくいきましたか?
さて、箱にデータを入れておくことができるようになった私たちですが、今のままではプログラムは単なる「記録係」に過ぎません。EA(自動売買プログラム)があなたに代わって相場を戦い抜くためには、その記録を元にして「状況を判断し、決断を下す頭脳」が必要になります。
今回は、いよいよプログラミングの最大の醍醐味である「条件分岐(if文)」に挑戦します。 これさえ覚えれば、あなたのプログラムは自らの意志(あなたが与えたルール)で相場の波を乗りこなす第一歩を踏み出すことになります。コーヒーを片手に、リラックスして読み進めてくださいね。
プログラムに「もしも〜なら」を教えよう
私たちの日常生活は、常に「条件分岐」の連続です。 「もし雨が降っていたら、傘を持っていく」 「もしコーヒーが冷めていたら、電子レンジで温める」 「もしお財布に1000円しかなければ、ランチは牛丼にする」
FXのトレードも全く同じですよね。 「もし現在の価格が、移動平均線より上にあれば、買う」 「もし含み損が5000円を超えたら、損切りする」
この「もし〇〇なら、△△をする」という論理をMT5に教えるための文法が、今回学ぶ「if(イフ)文」です。英語の「if(もし〜なら)」そのままなので、とても直感的で分かりやすいと思います。
MQL5での基本的な書き方は、このようになります。
if (条件式)
{
// 条件を満たしたときに、実行したい処理をここに書く
}
とてもシンプルですね。
() の中に「条件」を書き、その条件がクリアされたときだけ、 {}(波括弧)で囲まれた中身の処理が実行されます。条件をクリアしなければ、波括弧の中身は完全に無視されてスルーされます。
比較するための記号(演算子)を覚えよう
「条件式」を作るためには、2つの数字を比べるための「記号」が必要になります。小学校の算数で習った「不等号」をイメージしてください。MQL5でよく使う比較の記号(比較演算子と言います)は、主に以下の6つです。
A > B: AはBより大きいA < B: AはBより小さいA >= B: AはB以上(同じか、大きい)A <= B: AはB以下(同じか、小さい)A == B: AとBは全く同じ(※注意!イコールは2つ繋げます)A != B: AとBは違う(等しくない)
ここでプログラミング初心者の方が最もつまずきやすいポイントがあります。それは「等しい」を表すときに = を2つ重ねて == と書くことです。
前回、変数にデータを入れるときに double my_lot = 0.1; と書きましたよね。
プログラミングの世界では、記号が1つの = は「右のものを左の箱に入れる(代入する)」という意味になってしまうのです。
そのため、「右と左が同じかどうかを比べる」ときには、区別するために == と2つ繋げて書くルールになっています。これだけは、しっかりと頭の片隅にメモしておいてくださいね。
実際にif文を使ったスクリプトを書いてみよう
それでは、前回学んだ「変数」と、今回学んだ「if文」を組み合わせて、実践的なスクリプトを書いてみましょう。
今回は、「現在の価格」と「移動平均線の価格」を比較して、買い目線か売り目線かをMT5に判断させてみます。 (※まだ実際のリアルタイム価格を取得する方法は学んでいないので、変数の中に仮の数字を入れてテストしてみます)
MetaEditorを開き、新しいスクリプトを作成して、以下のコードを書き込んでみてください。
void OnStart()
{
// 1. 変数に「仮の価格」を入れておく
double current_price = 150.50; // 現在の価格(仮)
double ma_price = 150.00; // 移動平均線の価格(仮)
Print("【相場環境の判定をスタートします】");
// 2. もし、現在の価格が移動平均線より高ければ
if (current_price > ma_price)
{
Print("現在の価格(", current_price, ")は、移動平均線より上にあります。");
Print("上昇トレンドですね!『買い』を検討しましょう。");
}
// 3. そうではなく、もし、現在の価格が移動平均線より低ければ
else if (current_price < ma_price)
{
Print("現在の価格(", current_price, ")は、移動平均線より下にあります。");
Print("下降トレンドですね!『売り』を検討しましょう。");
}
// 4. どちらでもない場合(つまり完全に一致した場合)
else
{
Print("価格と移動平均線が全く同じです。様子見しましょう。");
}
}
サンプルコードの解説
いかがでしょうか。コードが少し長くなりましたが、やっていることはとてもシンプルです。
まず前半で、current_price(現在の価格)に 150.50 を、ma_price(移動平均線)に 150.00 を入れました。
そして中盤からがif文の出番です。 ここで新しいキーワード「else(エルス)」が登場しました。これは「それ以外」という意味です。
if (current_price > ma_price)最初の関門です。150.50 は 150.00 より大きいので、この条件は見事にクリア(true)となります。したがって、この波括弧の中にある「上昇トレンドですね!」というプリント処理が実行されます。else if (current_price < ma_price)「もし最初の条件がダメで、そうじゃなくてこっちの条件ならどう?」という2つ目の関門です。今回は最初の関門をクリアしてしまったので、ここは無視されます。else「上の条件にどれも当てはまらなかったら、問答無用でこれを実行する!」という最後の受け皿です。
コンパイルしてMT5で実行してみると、ツールボックスのエキスパートタブには「買いを検討しましょう」と表示されるはずです。
ぜひ、変数 current_price の数字を 149.00 に書き換えて、もう一度コンパイルして実行してみてください。今度は見事に「売りを検討しましょう」に表示が切り替わるはずですよ!
プログラムが自分で数字を比較して、状況に応じたメッセージを出力してくれました。まさに「決断」を下した瞬間です。
if文の多用が招く「カーブフィッティング」の罠
if文を覚えると、プログラムに複雑な判断をさせることができるようになります。すると、多くの開発者が陥ってしまう「恐ろしい罠」があります。 それが「過剰なif文によるカーブフィッティング(過剰最適化)」です。
バックテスト(過去のデータを使ったテスト)を行っていると、「あ、ここで大きく負けてるな」という場面に必ず遭遇します。 そんなとき、if文を使うと、その負けを簡単に「なかったこと」にできてしまうのです。
「もし、火曜日の午後3時なら、トレードしないようにしよう」 「もし、直前の足のヒゲが15pips以上あったら、エントリーを見送ろう」 「もし、RSIが55以上60以下の微妙な位置なら、休もう」
このように、過去のチャートを見て都合の悪い部分を避けるために、次から次へとif文(条件)を付け足していく……。 すると、どうなるでしょうか? バックテストのグラフは右肩上がりの素晴らしい一直線になります。
しかし、そのコードはif文が何重にも入り組んだ、まるでスパゲッティのように絡み合った複雑怪奇なもの(スパゲッティコード)になってしまいます。
そして、その「過去に完璧に合わせたスパゲッティEA」を未来の相場で動かした途端、全く機能せずに資金を溶かしてしまうのです。なぜなら、相場は決して過去と全く同じ動きを繰り返すことはないからです。
「シンプルで堅牢なトレード」 これが私の信条です。
本当に強いシステムというのは、驚くほどif文が少ないものです。 「MAが上向きなら買う」「一定の幅を超えたら利食いする」 たったこれだけの、誰もが知っているようなシンプルな条件(if文)で作られたEAの方が、長期的に見れば相場の変化にしなやかに対応し、生き残る確率が高いと私は思っています。
if文はとても便利な機能ですが、使いすぎにはくれぐれも注意してください。 「この条件は、本当に相場の本質を突いているか?ただの過去へのこじつけではないか?」 コードにif文を書き足すたびに、一度立ち止まって自分に問いかけてみる癖をつけてみてくださいね。
おわりに
今回は、プログラムに決断をさせる「if文」について学びました。 変数の数値を比較して、その結果によって異なる処理を行う。これができるようになれば、自動売買システムの「脳みそ」の半分は完成したようなものです。
しかし、今回のサンプルコードでは、価格のデータを私たちが手動で(ハードコーディングで)変数に入れていました。実際の自動売買では、刻一刻と動くリアルタイムの価格をMT5から取得してくる必要がありますよね。
そこで次回は、「MT5から現在の価格(Bid・Ask)を取得する方法」を学びます。 いよいよ、あなたのプログラムが「本物の相場」と繋がる瞬間です。現在のリアルなレートを取得し、それを使ってif文で判断させる。ここまで来ると、一気にEA開発のリアリティが増してきますよ!
焦らず、一つ一つのステップを楽しんで進んでいきましょう。 それでは、次回の「MQL5パラダイス」でまたお会いできるのを楽しみにしています。あなたのトレードライフに、素敵な決断が訪れますように。パイナップルでした!
Is it OK?