[MT4で自動売買4]EA(MQL)の基本構造を見てみよう

EA1

前回までの記事でEA作成用ファイルの作成及び、コンパイル方法までご説明しました😀
早速プログラムを書いてみよう❗️と言っても、何を書けばいいかわからないですよね💦

EA作成時に利用するプログラミング言語はMQLです。聞き慣れないですよね😅

私自身、試行錯誤してなんとか簡単な自動売買プログラムを作りました。
ご参考程度にはなりますが、私自身の備忘も含めて簡単にこのページに残したいと思います。

目次

MQLの基本構造

前回の記事でEA作成用ファイル(以下、MQLファイル)を作成した際にはテンプレートとして、すでに関数が書かれたファイルが作成されていたと思います。

MQLファイルの基本構造はざっくり以下のような構成です。

—————
// プログラム上にコメントを残す時には「//」を書く
// 行途中でも「//」以降はコメントと認識される

// 1. #property を記載
#property copyright “吉助”

// 2. 用途に応じて「input」or「extern」変数を宣言
input double lots = 0.3;
extern double price =110.3;

// 3. MQL言語で用意されているイベント関数
void OnInit(){
 ………
}

// 4. 独自の関数
void OriginalFunction( ){
 ……
}
—————

#property とは?

MQLファイル自体の情報(バージョン、著作者等)を残す際に記載します。プログラムの稼働自体には影響はありません。#property で以下のような情報を記載できます。

スクロールできます
設定可能項目説明
copyrightプログラムの著作者を記載
linkプログラム著作者のHPや問い合わせ先を記載
versionプログラムのバージョン情報
descriptionプログラム内容の説明
iconプログラムのiconをデフォルトから変えたいときにicoファイルを指定する。
iconファイルはMQLファイルと同一フォルダ内に格納する必要あり。
strict後続の外部パラメータ使用時に日本語説明を利用したい場合に記載する。引数はなく、「#property strict」のみ記載する。

プログラムの稼働に関係ないのであれば、#property で記載した情報をどこで見れるの?と思いますよね😅
#property で記載した内容はEA起動時に出てくる子ウィンドウにバージョン情報タブに表示されます。

PGM
上記のように#property を記載すると👇のように表示されます
子ウィンドウ
MQLプログラム内で記載した内容が表示される

input / extern って何?どう違うの?

input / extern ともにEA起動時に設定可能なパラメータです。

inputで記載しても、externで記載しても以下のようなパラメータ入力内容が表示されます。

PGM
input/extern を宣言した変数(+コメント付き)
子ウィンドウ
コメントの内容が変数列に表示される

子ウィンドウの各変数の値部分をダブルクリックすると、初期値の値を変更することができます。
input と extern の違いはプログラム内で値の変更ができないのが「input」、値の変更が可能なのが「extern」です。

吉助

inputは「定数」、externは関数を跨いで利用可能なglobal変数のようなイメージで思ってもらって良いかと思います

また、地味に便利なのは、input / extern どちらでもコメントを記載しておくと、EA起動時の子ウィンドウで、コメントに記載した内容がそのまま表示されます。わかりやすいコメントを残しておくと利用時に設定値の間違いを防ぐことができます😁

なお、コメントに記載した日本語説明を表示するためには「#property strict」を記載している必要があります。テンプレートに含まれていなければ、忘れずに記載しておきましょう😀

吉助

MT4で取引する会社は1ロット=10万通貨であることが多いです。少額で1000通貨単位の取引を行いたい時には0.01ロット=1000通貨となりますので注意しましょう❗️私自身、何回か設定値を間違えたことがあります😓

MQL4のイベント関数

MQL4で予め用意してくれているイベント関数の中で私が利用している関数に絞って紹介します。リピート系自動売買プログラムはシンプルなため利用しているイベント関数は下記表の3つのみです。この3つで問題なく動いています。

他のイベントが気になる方は公式サイトのMQL4リファレンスページも載せておきますので、そちらをご参照ください(英語です😅)。

スクロールできます
イベント関数(私の)利用方法
OnInitEA起動時、最初に稼働する関数です。一番最初に稼働するので、このOnInit内で変数の初期化及び、リピート取引の初回発注を行っています。
OnDeInitEAを停止する際に呼ばれる関数です。
私の場合はEA停止時に発注待ち状態になっている注文を全て取り消す処理を入れています。
OnTickメインで利用している関数です。値動きがあるたびにこのOnTick関数が呼ばれます。

リピート系取引は事前に利確値、損切値を設定して注文しているため、値動きの度に高度な計算をしてタイミングを図って発注するような仕組みは不要です。

私の場合は、決済があったら、注文を入れ直す処理だけを入れています。(結果的にはシンプルですが、訳もわからないまま作った最初のことは本当に苦労しました😅)

独自の関数を作成・利用できるの?

他のプログラミング言語同様、もちろん独自の関数を作成・利用が可能です。以下の規則に沿って作成します。その中で「型」と「引数」は作ったことのない方には馴染みがない部分もあると思うので説明したいと思います。

———
  独自関数名(引数){
  処理したい内容
  …
  … 

   return(戻り値)
 }
———

型って何?

「型」の部分は独自関数を動かした結果、どういう情報が欲しいのか(戻り値と言います)によって「型」の内容が変わります。以下のようなコードがあった場合、独自関数のsimpletasizan()を動かした結果、足し算された結果が欲しいですよね。足し算した結果が整数であれば「int」、小数であれば「double」と記載します。

———
 int simpletasizan(){
   int a,b,c;
   a = 2;
   b = 3;
   C = a + b;

   return(c);
 }
———

上記以外にも、文字列を戻り値にしたい場合は「string」、戻り値が不要な場合は「void」と型の部分に記載します。
なお、「void」型の場合は、戻り値がないため、関数内の「return(戻り値)」は記載不要です。

「引数」って何?

上記例では関数内で足し算したい値が「a=2」「b=3」のように決められていました。ただ、実際にプログラミングをすると値はその時々で決めたくなります。そういうときに「引数」を利用します。

——— 
int simpletasizan2(int a){
   int b,c;
   b = 3;
   C = a + b;

   return(c);
 }

 simpletasizan2(5);  //左記関数を実行するとa(5)+b(3)が計算され、8が戻り値となる
———

黄色下線が引数に該当する部分となります。独自関数の引数として変数aを記載しました。ここには最終行のように整数値を入れることが可能であり、入れた値と独自関数内の変数bの足し算を行った結果が戻り値となります。

引数は複数個設定できるため以下のようなコードも可能となります。

——— 
int simpletasizan3(int a,int b){
   int c;
   C = a + b;

   return(c);
 }

 simpletasizan2(5,3);  //左記関数を実行するとa(5)+b(3)が計算され、8が戻り値となる
———

元々独自関数内で宣言していた変数a,bを引数にしました。引数にすることにより、a、bの値は固定値の5や3でなくても足し算することが可能となります。上記のような関数にすることで利用しやすい、汎用性の高い関数となります。

おわりに

いかがでしたしょうか。MQLの基本構造のイメージはつきましでしょうか❓

新しい言語でプログラミングする際には、予め用意されている関数の理解や、if文やらfor文などの構文を覚えないといけないのでちょっと大変ですよね😅
私自身もjava、python、perl等々やっている内に言語ごとのルールがわからなくなり毎回1から見直ししています💦

ということで、次回はMQLで利用するif、for等の基本文法をまとめたいと思います🤗

目次