EAの骨組み:OnInitとOnTick
MQL5のEAには、あらかじめ決められた名前の「入れ物」がいくつかあり、MT5が適切なタイミングでその中身を呼び出します。最小限で覚えるのは2つだけです。
OnInit():EAをチャートに載せた(起動した)ときに1回だけ動きます。最初の準備に使います。OnTick():価格が動くたびに(新しい値が届くたびに)繰り返し動きます。売買の判断は、基本ここに書きます。
int OnInit()
{
// 起動時に1回だけ動く。準備をここに書く
return(INIT_SUCCEEDED);
}
void OnTick()
{
// 価格が動くたびに繰り返し動く。売買判断はここ
}
波かっこ { } で囲まれた範囲が、その入れ物の中身。行末のセミコロン ; は「1つの命令の終わり」の印です。
変数:値を入れておく箱
変数は、数字や日付などの値に名前をつけて入れておく箱です。使うときは、まず「どんな種類の値を入れるか」を宣言します。最小限で出てくる種類は次の3つです。
int:整数(1、25、-3 など)。日付や回数に使います。double:小数を含む数(1.0、0.5、152.34 など)。価格やロット数に使います。bool:「はい/いいえ」(trueかfalse)。ポジションを持っているか、などの条件に使います。
int dom = 25; // domという整数の箱に25を入れる
double lot = 1.0; // lotという小数の箱に1.0を入れる
bool hasPosition = false; // 今ポジションを持っているか
イコール = は「右の値を左の箱に入れる」という意味で、算数の等号とは少し違います。
if文:ルールの書き方
戦略のルールは、そのほとんどが「もし〜という条件なら、〜する」という形です。これを書くのが if文です。月末ロングの「もし日付が25以上なら買う」も、この形で書けます。
if(dom >= 25)
{
// 日付が25以上のときだけ、この中が実行される
}
>= は「以上」、<= は「以下」、== は「等しい」。等しいかを調べるときはイコール2つ(==)で、1つ(=)は代入なので混同に注意します。
複数の条件を組み合わせるときは &&(かつ)と ||(または)を使います。月末ロングの決済条件「日付が3以上かつ15以下」は次のように書きます。
if(dom >= 3 && dom <= 15)
{
// 日付が3以上「かつ」15以下のときだけ実行
}
売買の命令
実際に注文を出すには、MQL5に用意された取引用の道具を使うのが簡単です。冒頭で CTrade という道具を1つ用意しておくと、trade.Buy()(買う)や trade.PositionClose()(決済する)と書くだけで注文できます。
#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行ずつ読むときに、この回に戻って確認できれば十分です。文法の網羅ではなく、「戦略のコードを見て、だいたい何をしているか追える」状態がゴールです。
チェックリスト
次の記事に進む前に、以下が自分の言葉で説明できるか確認してください。
- OnInitとOnTickの違い(起動時1回 / 値動きのたび繰り返し)
- int・double・bool の3つの変数の使い分け
- if文が「もし〜なら〜する」を表すこと
==(等しい)と=(代入)の違い&&(かつ)で条件を組み合わせられること- trade.Buy() / trade.PositionClose() で売買できること
ミニテスト
最後に3問だけ確認です。不正解なら別の選択肢を選び直せます。正解すると解説が表示されます。
Q1. 売買の判断(価格が動くたびに繰り返し実行したい処理)は、どこに書くか?
OnInitは起動時の準備を1回だけ行う場所。売買判断は、値が届くたびに動くOnTickに書きます。コメントはコンピュータが無視する人間向けの説明です。
Q2. 「日付が3以上かつ15以下」を正しく書いているのは?
「かつ」は &&。||(または)だと、ほぼ全部の日付が当てはまってしまいます。= は代入なので条件には使えません。
Q3. // で始まるコメントの役割は?
コメントは実行に影響しません。条件の意図や数字の理由を書き残しておくと、後からの読み返しや過剰最適化の点検に役立ちます。