【MQL5パラダイス 第6回】24時間働くロボットの誕生!「OnTick」でEAの鼓動を感じよう
みなさん、こんにちは!パイナップルです。
前回の第5回では、SymbolInfoDouble() を使って、MT5から現在の「生きた価格(BidとAsk)」を取得する方法を学びましたね。私たちが書いたプログラムが実際の相場データと繋がった瞬間、なんだか感動しませんでしたか?
しかし、これまでの連載で私たちが作ってきたのは、あくまで「スクリプト」という種類のプログラムでした。 スクリプトは、チャートにドラッグ&ドロップした瞬間に「1回だけ」処理を行って、それで終わりです。いくらリアルタイムの価格を取得できたとしても、1回だけ価格を見て終了してしまっては、あなたが寝ている間にトレードしてくれる自動売買ロボットにはなりませんよね。
そこで今回は、いよいよスクリプトを卒業し、「エキスパートアドバイザ(EA)」の開発に本格的に足を踏み入れます。 24時間、相場の動きをじっと監視し続けてくれる仕組み。EAの心臓部とも言える「OnTick(オンティック)」という枠組みについて学んでいきましょう!
温かいコーヒーの準備はよろしいですか?それでは、さっそくMetaEditorを開いてくださいね。
1回きりのおつかい(スクリプト)から、専属の監視員(EA)へ
「スクリプト」と「EA」の違いを、日常生活に例えてみましょう。
スクリプトは、いわば「単発のおつかい」です。 「ちょっとコンビニに行って、今の牛乳の値段を見てきて!」と頼むと、ダッシュでコンビニに行き、値段を確認して報告してくれます。でも、そのあとに牛乳がタイムセールで半額になったとしても、もう一度頼まない限りは教えてくれません。
一方、EAは「専属の監視員」です。 「コンビニの牛乳売り場の前にずっと立っていて、値段が変わるたびに私に報告してね。もし半額になったら、その瞬間に買ってきて!」と頼むようなものです。文句一つ言わず、24時間365日ずっと売り場を見張り続けてくれます。
私たちが作りたいのは、もちろん後者の「専属の監視員」ですよね。 この「値段が変わるたびに」というタイミングをプログラムに教えてあげる仕組みが、今回主役となる「OnTick」なのです。
新しいテンプレート「エキスパートアドバイザ」を開いてみよう
百聞は一見に如かず。実際にMetaEditorでEAのファイルを作ってみましょう。
- MetaEditorの左上にある「新規作成」ボタンをクリックします。
- これまでは一番下の「スクリプト」を選んでいましたが、今回は一番上の「エキスパートアドバイザ (テンプレート)」を選択して「次へ」進みます。
- 名前に「My_First_EA」などと入力し、そのまま「完了」まで進んでください。
すると、新しいコードの画面が開きます。
スクリプトの時と違って、何やら英語の文字がたくさん書かれていますね。少し面食らってしまうかもしれませんが、安心してください。スクリプトの時と同じように、グレーで書かれている文字(// で始まる行)はただのメモ書きです。
画面を少し下にスクロールすると、次のような記述が見つかるはずです。
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
見つかりましたか?これこそが、EAの最も重要な心臓部である「OnTick(オンティック)」の枠組みです。
価格が動くたびに呼ばれる魔法の枠組み「OnTick」
FXのチャートを見ていると、価格がピクッ、ピクッと動きますよね。この価格が動く1回1回の更新のことを、専門用語で「Tick(ティック)」と呼びます。
MT5は、価格が1Tick動くたびに、この OnTick() という枠組みの中身を「上から下まで1回実行」してくれます。
つまり、1秒間に価格が3回動けば、この枠の中身も1秒間に3回猛スピードで実行されるということです。
これまでに学んだスクリプトの枠組みは OnStart() でしたね。これは「スタートした時に1回だけ」という意味でした。
それに対して OnTick() は、「Tick(価格更新)があるたびに毎回」という意味になります。
私たちがやるべきことは、この OnTick() の波括弧 { } の中に、「価格が動くたびに確認してほしいこと」を書いていくだけなのです。
実際にOnTickの中で価格を取得してみよう
それでは、前回学んだ「リアルタイム価格の取得」を、この OnTick() の中に書いてみましょう。
価格が動くたびに、最新のBid(売値)を取得して、それをログ(エキスパートタブ)に出力し続けるプログラムです。
以下のコードを、OnTick() の枠組みの中に書き込んでみてください。(元々あるメモ書きは消してしまって構いません)
void OnTick()
{
// 1. チャートの通貨ペア名を変数に入れる
string my_symbol = _Symbol;
// 2. 最新のBid(売値)を取得して変数に入れる
double current_bid = SymbolInfoDouble(my_symbol, SYMBOL_BID);
// 3. 取得した価格をログに出力する
Print("現在のBid価格は ", current_bid, " です!");
}
サンプルコードの解説
コードの内容自体は、前回学んだものと全く同じですよね。違うのは、書いている「場所」だけです。
OnStart() ではなく OnTick() の中に書いたことで、MT5の振る舞いが劇的に変化します。
さっそく「コンパイル」ボタンを押してエラーがないことを確認し、MT5のチャート画面に戻りましょう。 今度は「ナビゲータ」ウィンドウの「スクリプト」ではなく、「エキスパートアドバイザ」のフォルダを展開します。そこに今作った「My_First_EA」があるはずです。
これをチャートにドラッグ&ドロップして、出てきた設定画面の「OK」を押します。 (チャートの右上に、EAの名前と青い帽子のアイコンが出ればセット完了です)
さあ、MT5の下部にある「ツールボックス」の「エキスパート」タブを見てみてください。 チャートの価格がピクッと動くたびに、 「現在のBid価格は 150.51 です!」 「現在のBid価格は 150.50 です!」 と、猛烈な勢いで新しいメッセージが次々と出力されていくのが分かるはずです。
自分で書いたプログラムが、休むことなく市場の動きに食らいつき、リアルタイムで計算を繰り返しているのを見ると少し感動的ですね。
(※もし相場が閉まっている土日などにテストしている場合は価格が動かないため、メッセージは出ません。月曜日の朝を楽しみに待っていてくださいね!)
Tickごとに動くからこそ「シンプル」が活きる
今見ていただいた通り、OnTick() の中に書かれたプログラムは、価格が動くたびに猛烈なスピードで実行されます。活発な相場環境では、1秒間に何十回も呼び出されることすらあります。
これが何を意味するかお分かりでしょうか?
もしあなたが、OnTick() の中に「ものすごく計算に時間のかかる複雑な処理」を書いてしまったら、パソコンの頭脳(CPU)がパンクしてしまうということです。
「あれも確認したい」「これも計算させたい」と、過去のチャートに合わせるための複雑怪奇なif文や、重たいインジケーターの計算を何重にも詰め込んでしまう(カーブフィッティングに陥ってしまう)と、EAは相場のスピードについていけなくなります。
処理が遅れると、注文を出すタイミングが遅れ、結果として不利な価格で約定(スリッページ)することになり、大切な資金を減らす原因になってしまいます。
だからこそ、私は「シンプルで堅牢なトレード」を重んじているのです。
本当に優秀なプログラムというのは、驚くほどスッキリとしていて、無駄な計算がありません。 「今、本当に必要な情報だけを取得し、素早く判断を下す」 この身軽さこそが、リアルタイムの厳しい相場環境を生き抜くための最大の武器になります。
これから皆さんが自分のロジックをEAに組み込んでいく際にも、「この処理は本当にTickが動くたびに毎回計算する必要があるかな?」と、常に問いかける癖をつけてみてください。無駄を削ぎ落としたシンプルなコードは、見た目が美しいだけでなく、実際のパフォーマンスにも直結するのです。
おわりに
今回は、スクリプトからエキスパートアドバイザ(EA)へとステップアップし、OnTick() という心臓部の働きについて学びました。
価格が動くたびにプログラムが実行される仕組みを理解したことで、いよいよ「自動売買」のスタートラインに立つことができましたね。
ただ、今のままでは単に「現在の価格」を追いかけているだけです。 実際のトレードでは、「移動平均線(MA)」や「RSI」といったインジケーターを使って、相場のトレンドや過熱感を分析しますよね。
そこで次回は、「プログラムの中でインジケーターの値を読み込む方法」について解説します。 「現在の価格」と「移動平均線の値」を同時に取得し、前々回に学んだ「if文」を使って「ゴールデンクロス」や「デッドクロス」をプログラムに判断させてみましょう。
点と点だった知識が、いよいよ線として繋がり始めます。ここからが一気に面白くなるところですので、ぜひ楽しみにしていてくださいね!
それでは、次回の「MQL5パラダイス」でまたお会いしましょう。 あなたのEAが、力強く心地よい鼓動を打ち始めますように。パイナップルでした!
Is it OK?