【MQL5パラダイス 第5回】ついに本物の相場と繋がる!リアルタイムの「価格」を取得しよう
皆さん、こんにちは!パイナップルです。
前回の第4回では、プログラムに決断をさせる「if文(条件分岐)」について学びました。 「もし〇〇なら、△△をする」というルールを書き込むことで、プログラムが自ら判断を下せるようになったのは大きな進歩でしたね。
しかし、前回は「現在の価格」を私たちの手で直接「150.50」といった数字(ハードコーディング)で変数に入れていました。これでは、刻一刻と変化する実際の相場には対応できません。自動売買プログラムが本当に必要としているのは、「今、まさに目の前で動いている本物の価格」ですよね。
そこで今回は、いよいよMT5からリアルタイムの価格(レート)を取得する方法を学びます。 あなたのプログラムが、ついに「生きた相場」と繋がる瞬間です。今日もリラックスして、コーヒーでも飲みながら読み進めてくださいね。
FXの基本にして最重要!「Bid」と「Ask」を思い出そう
プログラムで価格を取得する前に、FXの取引における非常に重要な基本を一つだけ復習しておきましょう。それは「Bid(ビッド)」と「Ask(アスク)」です。
皆さんが普段MT5のチャートを見たり、注文画面を開いたりするとき、必ず「2つの価格」が並んでいるのを目にするはずです。
- Bid(売値):あなたが「売り(ショート)」の注文を出すときの価格。チャートに描かれている現在の価格は、通常このBidの価格です。
- Ask(買値):あなたが「買い(ロング)」の注文を出すときの価格。Bidよりも少しだけ高い価格になっています。
そして、この「Ask」と「Bid」の差額が「スプレッド」であり、FX業者の手数料にあたる部分ですね。
自動売買プログラム(EA)を作る上では、「今は買い注文を出すからAskの価格を見よう」「今は売り注文を出したいからBidの価格を見よう」というように、この2つの価格を明確に使い分ける必要があります。
プログラムはとても素直なので、「現在の価格を教えて」と大雑把に聞かれても、「売値ですか?それとも買値ですか?」と困惑してしまうのです。
MQL5で価格を取得するための方法
それでは、MQL5で現在のBidとAskを取得するにはどうすればよいのでしょうか。
以前の「MT4(MQL4)」でプログラムを書いたことがある方は、「Bid や Ask って単語を書くだけで取得できたよ」と思われるかもしれません。
しかし、より高度で正確な処理ができるようになったMQL5では、少しだけ丁寧なお願いをする必要があります。それが、SymbolInfoDouble()(シンボル・インフォ・ダブル)という関数(命令のセット)です。
少し名前が長いですが、分解してみると全く怖くありません。
- Symbol:通貨ペアのこと(USDJPYやEURUSDなど)
- Info:インフォメーション(情報)
- Double:小数点のある数字(第3回で学んだ変数の箱ですね!)
つまり、「指定した通貨ペアの、小数点のある情報を教えてください」という命令なのです。 実際に現在のBid価格を取得する書き方は、このようになります。
SymbolInfoDouble(_Symbol, SYMBOL_BID);
カッコの中には、2つの情報をカンマ(,)で区切って入れます。
1つ目の _Symbol は、「現在このプログラムが入っているチャートの通貨ペア」を自動で指し示してくれる便利なキーワードです。
2つ目の SYMBOL_BID は、「Bid(売値)の情報が欲しいです」という指定です。もしAskが欲しければ SYMBOL_ASK に変更するだけです。
実際に生きた価格を取得してみよう
それでは、前回学んだ「変数」と「if文」も総動員して、現在のリアルタイム価格を取得し、相場環境を判定するスクリプトを書いてみましょう。
MetaEditorを開き、新しいスクリプトを作成して、以下のコードを書き込んでみてください。
void OnStart()
{
// 1. チャートの通貨ペア名を取得して変数に入れる
string my_symbol = _Symbol;
// 2. リアルタイムのBid(売値)とAsk(買値)を取得して変数に入れる
double current_bid = SymbolInfoDouble(my_symbol, SYMBOL_BID);
double current_ask = SymbolInfoDouble(my_symbol, SYMBOL_ASK);
Print("【現在のリアルタイム相場を取得しました】");
Print("対象通貨ペア:", my_symbol);
Print("Bid(売値):", current_bid);
Print("Ask(買値):", current_ask);
// 3. 注目しているキリ番(仮に150.00円とします)を変数にセット
double target_price = 150.00;
// 4. if文を使って、現在の価格と注目価格を比較する
if (current_bid > target_price)
{
Print("現在のBidは ", target_price, " より上にあります。強気相場かもしれません!");
}
else if (current_bid < target_price)
{
Print("現在のBidは ", target_price, " より下にあります。弱気相場かもしれません。");
}
else
{
Print("現在のBidは ", target_price, " とぴったり同じです。");
}
}
サンプルコードの解説
どうでしょう、これまでに学んだ知識が綺麗に繋がっているのが分かりますか?
- まず、
string my_symbol = _Symbol;で、現在の通貨ペアの名前("USDJPY"など)を文字列の箱に入れます。 - 次に、先ほど紹介した魔法の呪文
SymbolInfoDouble()を使って、リアルタイムのBidとAskを取得し、それぞれcurrent_bid、current_askという小数の箱(double)に代入しています。 - そして、前回の復習です。注目している価格(今回はキリの良い150.00を仮置きしています)と、今取得したばかりの「本物のBid価格」を
if文で比較し、その結果をPrint処理で出力させています。
コンパイルして、実際に動いているチャートにこのスクリプトをドラッグ&ドロップしてみてください。 MT5の「ツールボックス」→「エキスパート」タブに、今まさにチャートの右端でピコピコと動いている本物の価格が、あなたの書いたメッセージと共に出力されたはずです。
もしエラーもなく一発で表示されたなら、ぜひご自身を褒めてあげてください。あなたは今、プログラムを通じて世界の金融市場のリアルタイムデータにアクセスしたのですから!
パイナップル流!「見えないコスト」を意識する強さ
ここで少し、実践的なトレードのお話をさせてください。
今回、私たちはわざわざBidとAskという2つの価格を取得しました。 「めんどくさいな、チャートの価格(Bid)だけ見て、買いも売りもやっちゃダメなの?」と思う方もいるかもしれません。
実は、この「BidとAskの違い(スプレッド)」を意識できているかどうかで、EAの成績は天と地ほど変わってきます。
私は常々、「過剰な最適化(カーブフィッティング)を避け、シンプルで堅牢なトレードを」とお伝えしています。 過剰最適化された粗悪なEAの特徴の一つに、「スプレッドという見えないコストを軽視している」ことが挙げられます。
バックテスト(過去検証)を行う際、スプレッドを「常に1ポイント(固定)」などと非現実的な設定にしてしまうと、プログラムはわずか数pipsの利益を狙う超短期売買(スキャルピング)を繰り返して、莫大な利益を叩き出すように見えます。
しかし、実際の相場ではどうでしょうか。 経済指標の発表時や、早朝の流動性が低い時間帯には、AskとBidの差(スプレッド)は残酷なまでに大きく開きます。150.00で買えると思っていたのに、スプレッドが開いていたせいで150.05で買わされてしまった……なんてことは日常茶飯事です。
過剰に最適化された複雑なロジックは、こうした「現実の相場のノイズ(スプレッドの拡大やスリッページ)」に非常に弱く、リアル口座で稼働させた途端に機能不全に陥ります。
一方で、「移動平均線がしっかりクロスするのを待ってエントリーする」「数十pipsのゆったりとした値幅を狙う」といったシンプルなロジックは、少々スプレッドが開いた程度ではビクともしません。遊び(余裕)があるからです。
プログラムを書くとき、SYMBOL_ASK と SYMBOL_BID を打ち込みながら、「自分は今、手数料という現実の壁に向き合っているんだ」と思い出してください。現実のコストを考慮してもなお利益が残るような、どっしりと構えたシンプルなルールこそが、本当に「堅牢なシステム」と呼ばれるものなのです。
おわりに
今回は、SymbolInfoDouble() 関数を使って、MT5から生きた価格データを取得する方法を学びました。
変数の箱にリアルタイムのデータが入り、それをif文で判断する。この一連の流れが理解できれば、プログラミングの基礎の基礎はマスターしたと言っても過言ではありません。
しかし、これまで私たちが作ってきたのは「スクリプト」でした。 スクリプトは、チャートに投げ込んだ瞬間に「1回だけ」処理を行って終了してしまいます。これでは、ずっと相場を監視し続ける自動売買とは呼べませんよね。
そこで次回は、ついにスクリプトを卒業し、「エキスパートアドバイザ(EA)」の作り方に足を踏み入れます。 価格がピクッと動くたびに、何度でも自動で計算を繰り返してくれる「OnTick(オンティック)」という新しい魔法の枠組みについて解説します。
いよいよ、あなたのプログラムが24時間休まず働く「自動売買ロボット」へと進化する時がやってきます。楽しみにしていてくださいね!
それでは、次回の「MQL5パラダイス」でまたお会いしましょう。 あなたのプログラムに、相場の女神が微笑みますように。パイナップルでした!
Is it OK?