EAの骨組み:OnInitとOnTick

MQL5のEAには、あらかじめ決められた名前の「入れ物」がいくつかあり、MT5が適切なタイミングでその中身を呼び出します。最小限で覚えるのは2つだけです。

MQL5:EAの骨組み
int OnInit()
{
   // 起動時に1回だけ動く。準備をここに書く
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   // 価格が動くたびに繰り返し動く。売買判断はここ
}

波かっこ { } で囲まれた範囲が、その入れ物の中身。行末のセミコロン ; は「1つの命令の終わり」の印です。

時間 → OnInit 起動時1回 OnTick OnTick OnTick 価格が動くたびに繰り返し
起動時にOnInitが1回、その後は値が動くたびにOnTickが何度も呼ばれる
OnInit 最初に1回だけ準備 OnTick 価格が動くたび実行
EAは、最初だけ動く準備処理と、価格更新ごとに動く判断処理に分けて考えます。

変数:値を入れておく箱

変数は、数字や日付などの値に名前をつけて入れておく箱です。使うときは、まず「どんな種類の値を入れるか」を宣言します。最小限で出てくる種類は次の3つです。

MQL5:変数の宣言と代入
int dom = 25;          // domという整数の箱に25を入れる
double lot = 1.0;      // lotという小数の箱に1.0を入れる
bool hasPosition = false;  // 今ポジションを持っているか

イコール = は「右の値を左の箱に入れる」という意味で、算数の等号とは少し違います。

if文:ルールの書き方

戦略のルールは、そのほとんどが「もし〜という条件なら、〜する」という形です。これを書くのが if文です。月末ロングの「もし日付が25以上なら買う」も、この形で書けます。

MQL5:if文
if(dom >= 25)
{
   // 日付が25以上のときだけ、この中が実行される
}

>= は「以上」、<= は「以下」、== は「等しい」。等しいかを調べるときはイコール2つ(==)で、1つ(=)は代入なので混同に注意します。

複数の条件を組み合わせるときは &&(かつ)と ||(または)を使います。月末ロングの決済条件「日付が3以上かつ15以下」は次のように書きます。

MQL5:条件の組み合わせ
if(dom >= 3 && dom <= 15)
{
   // 日付が3以上「かつ」15以下のときだけ実行
}

売買の命令

実際に注文を出すには、MQL5に用意された取引用の道具を使うのが簡単です。冒頭で CTrade という道具を1つ用意しておくと、trade.Buy()(買う)や trade.PositionClose()(決済する)と書くだけで注文できます。

MQL5:取引の道具と命令
#include <Trade/Trade.mqh>   // 取引の道具を読み込む
CTrade trade;               // tradeという名前で使えるようにする

// 使うとき:
trade.Buy(1.0);                  // 1.0ロットの買い注文
trade.PositionClose(_Symbol);    // 今の銘柄のポジションを決済

#include は「別に用意された部品を読み込む」命令。_Symbol は「いまEAが載っているチャートの銘柄」を指す、あらかじめ用意された言葉です。

今ポジションを持っているかどうかは、PositionSelect(_Symbol) で調べられます。これは持っていれば true、持っていなければ false を返すので、if文の条件にそのまま使えます。 第7回では、この「持っているか」を見て、持っていなければ買い条件を、持っていれば決済条件を判定する、という組み立てをします。

コメントと読みやすさ

// から行末まではコメントで、コンピュータは無視します。人間が「この行は何をしているか」を書き残すためのものです。 第1回で「短く、意味が読める形に」と述べたとおり、EAは書いた本人が後から読み返せることが大事です。条件の意図や、なぜその数字なのかを、コメントで一言残しておく習慣が、過剰最適化の点検にも役立ちます。

まだ全部を覚えなくてよい

ここで挙げた5つ(骨組み・変数・if文・売買命令・コメント)は、暗記する必要はありません。 第7回で実際の月末ロングEAを1行ずつ読むときに、この回に戻って確認できれば十分です。文法の網羅ではなく、「戦略のコードを見て、だいたい何をしているか追える」状態がゴールです。

チェックリスト

次の記事に進む前に、以下が自分の言葉で説明できるか確認してください。

ミニテスト

最後に3問だけ確認です。不正解なら別の選択肢を選び直せます。正解すると解説が表示されます。

Q1. 売買の判断(価格が動くたびに繰り返し実行したい処理)は、どこに書くか?

OnInitは起動時の準備を1回だけ行う場所。売買判断は、値が届くたびに動くOnTickに書きます。コメントはコンピュータが無視する人間向けの説明です。

Q2. 「日付が3以上かつ15以下」を正しく書いているのは?

「かつ」は &&||(または)だと、ほぼ全部の日付が当てはまってしまいます。= は代入なので条件には使えません。

Q3. // で始まるコメントの役割は?

コメントは実行に影響しません。条件の意図や数字の理由を書き残しておくと、後からの読み返しや過剰最適化の点検に役立ちます。