MQL4って何?

MQL4の基礎知識

MQL4はMetaQuotes社が提供する外国為替証拠金取引用のプラットフォームである「MetaTrader4」の機能を拡張するためのプログラム言語です。MetaTrader4は2005年にリリースされましたが、MQL4による拡張性の高さが投資家からの評価を集め、10年以上経つ現在でも数多くの証券会社が対応しているという、非常に息の長い取引プラットフォームとなります。

MQL4はC++をベースに開発された言語のため、C++をはじめC#やJavaなどの開発経験があれば比較的容易に開発を行う事が出来ます。さらにMQL4の開発環境はMetaTrader4と一緒に提供されているため、MetaTrader4をインストールすれば開発環境も全て揃います。このようにプログラム開発に対する敷居の低さもMetaTrader4が長年支持され続けている理由の一つなのでしょうね。

MQL4の開発環境

MQL4のプログラムを開発するには、MetaEditorというアプリケーションを使います。MetaEditorではMQL4によるプログラムの新規作成や編集といったエディターとしての機能に加えて、コンパイル(ソースコードから実行ファイルを生成する)からデプロイ(実行ファイルをMetaTrader4に配置し認識させる)まで、MQL4による開発の全てをこれ一つで網羅出来る非常に多機能なアプリケーションです。

MetaEditorはMetaTrader4に同梱されており、terminal.exe(MetaTrader4の本体)と同じフォルダにあるmetaeditor.exeがMetaEditorアプリケーションとなります。またはMetaTrader4の上部メニューにある「メタクォーツ言語エディタ」というボタンを押すか、MetaTrader4がアクティブな状態でF4キーを押すことでもMetaEditorを起動することが出来ます。

MQL4で作れるもの

MQL4で開発出来るプログラムは大きく分けて以下の4つとなりますが、中でもカスタムインジケーターとエキスパートアドバイザーが非常に多く開発されているプログラムとなります。

カスタムインジケーター

カスタムインジケーターはチャート上に様々な情報を表示するプログラムです。もともとMetaTrader4には移動平均線やボリンジャーバンドなど一般的なインジケーターが同梱されていますが、MQL4を使用することでこれらのインジケーターの機能を拡張したり、全く新しいオリジナルのインジケーターを開発することも可能となります。チャートへの表示に特化している反面、後述するエキスパートアドバイザーのように売買を行うことは出来ません。

エキスパートアドバイザー(EA)

エキスパートアドバイザー(EA)は指定された条件に従い自動的に売買を行うプログラムです。売買条件は自由にプログラムで定義することが可能で、カスタムインジケーターを売買条件として使用することも可能です。ただし売買を目的としたプログラムのため、カスタムインジケーターほど多彩な表示を行うことは出来ません。

スクリプト

スクリプトはチャートに設定した際に一回だけ処理を実行するプログラムです。カスタムインジケーターやエキスパートアドバイザーはブローカーから新しい価格を受信するたびに継続して動作するプログラムですが、スクリプトは継続しての動作は行わず、設定された際に1回動作するのみとなります。そのため手動での取引を補助するような機能、例えば任意のタイミングで保有中のポジションを全て決済する、といった内容はスクリプトとして開発することになります。

ライブラリ

ライブラリは他のMQL4プログラムから呼ばれることを目的としたプログラムです。例えばよく使用する処理をまとめて1つのライブラリとして用意しておくことでコードの重複を防止し開発工数の削減に繋げるが出来ます。ただし注意点として、ライブラリを使用したプログラムを実行するには、MetaTrader4のデータフォルダに呼び出し元のプログラムと使用するライブラリの双方が必要であり、呼び出し元のプログラム単体での動作は不可となります。

MQL4プログラムの構成

MQL4プログラムのソースコード(*.mq4)に記載する内容をいくつか紹介します。

プロパティの定義

#property strict
#property link "https://www.mql4-encyclopedia.com"
#property copyright "©MQL4逆引きリファレンス"

プロパティとはMQL4プログラムの設定に関する定義で、通常はソースコードの先頭に記述します。上記例では3つのプロパティを定義していますが、プロパティの種類は他にもたくさんあり、作成するプログラムによっては定義が必須となるプロパティもあります。プロパティの種類については以下のリンク先をご参照ください。

Program Properties (#property) – MQL4 Reference
https://docs.mql4.com/basis/preprosessor/compilation

パラメーターの定義

input   int                 MAPeriod = 14;          // 移動平均の期間
input   ENUM_MA_METHOD      MAMethod = MODE_SMA;    // 移動平均の種別
input   ENUM_APPLIED_PRICE  MAPrice = PRICE_CLOSE;  // 移動平均の適用価格

パラメーターとはMQL4プログラムを使用するユーザーが後から自由に変更可能な項目です。行頭に「input」と記載した変数はパラメーター扱いとなり、プログラムをチャートに設定した際に表示されるウィンドウの「パラメーターの入力」タブで項目の設定内容を変更することが可能となります。

パラメーター項目名の日本語化

パラメーターの項目名は変数名となりますが、上記例のように末尾に一行コメントをつけることで、そのコメントがパラメーターの項目名として表示されます。日本語の表示も可能なので、設定間違いを防ぐという観点からも出来る限り日本語で項目名を表示するべきでしょう。

コンボボックスによるパラメーターの設定

変数の型が列挙型(enum)の場合はパラメーターの設定内容がコンボボックスによる選択形式になります。あらかじめMQL4で用意されている列挙型に加えて、ソースコード内で新たに定義した列挙型もコンボボックスとして使用することが出来ます。

イベントハンドラの定義

イベントハンドラとは特定の条件を満たすことで呼ばれる関数のことで、MQL4のプログラムは主にこのイベントハンドラの関数内に記述することになります。プログラムの種類によって必要なイベントハンドラの種類が異なりますので、作成する内容に合わせてソースコード内に定義し処理を記述しましょう。

OnInit関数

int OnInit()
{
    // プログラムの初期化に関する処理を記述

    // 初期化が正常に行われた事を示す定数を返却
    return INIT_SUCCEED;
}

OnInit関数はMQL4プログラムが開始する際に1回だけ呼ばれる関数となり、主にプログラムの初期化処理を記述します。例えば設定されたパラメーター内容のチェックやグローバル変数の初期化など、プログラムが動作する上で必要な前準備を行う関数になります。OnInit関数は全てのMQL4プログラムで定義することが可能で、不要であれば省略してもプログラムは正常に動作します。

OnDeinit関数

void OnDeinit(const int reason)
{
    // プログラムの終了に関する処理を記述
}

OnDeinit関数はMQL4プログラムが終了する際に1回だけ呼ばれる関数となり、主にプログラムの終了処理を記述します。例えばプログラム動作中チャートに表示したオブジェクトの削除など、チャートをプログラムが開始される前の状態に戻す処理を記述するのが一般的な使用方法となります。引数のreasonにはプログラムが終了した理由(プログラムがチャートから削除された、チャートの時間足が変更になった、等)が設定されているため、その内容によって処理を分けることも可能です。OnInit関数と同様、OnDeinit関数も全てのMQL4プログラムで定義することが可能であり、不要であれば省略しても構いません。

OnCalculate関数

int OnCalculate(
    const int rates_total,
    const int prev_calculated,
    const datetime& time[],
    const double& open[],
    const double& high[],
    const double& low[],
    const double& close[],
    const long& tick_volume[],
    const long& volume[],
    const int& spread[])
{
    // インジケーターのメイン処理を記述

    // 計算済みのローソク足の本数を返却
    return rates_total - 1;
}

OnCalculate関数はインジケーターを作成する際に定義が必須となり、インジケーターのメイン処理を記述する関数です。チャートの現在価格が変動すると、このOnCalculate関数が自動的に呼ばれることになります。最初にOnCalculate関数が呼ばれた時点で過去のローソク足も含めた全てのローソク足に対して判定や表示処理を行い、2回目以降は最新のローソク足だけに対して判定や表示処理を行うのが一般的なインジケーターの処理方法です。毎回過去のローソク足まで判定や計算を行ってしまうとインジケーターの動作が重くなり、チャートがフリーズしてしまう可能性がありますので注意しましょう。

OnTick関数

void OnTick()
{
    // エキスパートアドバイザーのメイン処理を記述
}

OnTick関数はエキスパートアドバイザーを作成する際に定義が必須となり、エキスパートアドバイザーのメイン処理を記述する関数です。OnCalculate関数と同様、チャートの現在価格が変動するとOnTick関数が自動的に呼ばれることになります。この関数内で売買条件の判定を行い、条件を満たしている場合は注文を送信する、というのがエキスパートアドバイザーを作る際の一般的な流れとなります。

OnStart関数

void OnStart()
{
    // スクリプトのメイン処理を記述
}

OnStart関数はスクリプトを作成する際に定義が必須となり、スクリプトのメイン処理を記述する関数です。スクリプトをチャートに設定するとOnInit関数に続いてOnStart関数が呼ばれますが、スクリプトは1回しか処理を行いませんので、OnStart関数の処理が終わるとプログラムの動作も終了となります。

OnTimer関数

void OnTimer()
{
    // 定期的に行う処理を記述
}

OnTimer関数は指定した秒またはミリ秒ごとに繰り返し呼ばれる関数となります。主な用途としてはチャートに表示したサインや背景を点滅させたい場合などに使用します。間隔はOnInit関数内でEventSetTimer関数(秒指定)またはEventSetMillisecondTimer関数(ミリ秒指定)を使用して指定し、必ずOnDeinit関数内でEventKillTimer関数を使用してタイマー処理を終了させる必要があります。

OnChartEvent関数

void OnChartEvent(
    const int id,
    const long& lparam,
    const double& dparam,
    const string& sparam)
{
    // イベント処理を記述
}

OnChartEvent関数はチャート上においてイベントが発生した際に呼ばれる関数です。イベントの内容はチャートのクリック操作や各種キーの押下、オブジェクトの作成やドラッグなど多岐に渡ります。何のイベントが発生したのかは引数のidで判別が可能となり、発生元のイベントに応じて残りの引数であるlparam、dparam、sparamの内容が変わります。例えばstring型のsparamの場合、キー押下イベントの場合は押されたキーの種類、オブジェクト作成イベントの場合はオブジェクトの名前となります。イベントの種類と引数の組み合わせについては、以下のリンク先をご参照ください。

Event Handling Functions (OnChartEvent) – MQL4 Reference
https://docs.mql4.com/basis/function/events#onchartevent

MQL4プログラムのコンパイル

MQL4プログラムのコンパイル(ソースコードから実行ファイルを生成する)を行うには、MetaEditor上部メニューにある「Compile」ボタンを押すか、またはMetaEditor上でF7キーを押します。コンパイルに成功した場合はソースコードと同じフォルダに実行ファイルが生成され、MetaTrader4起動中の場合は実行ファイルを認識し使用可能となります。コンパイルに失敗した場合はMetaEditorのツールボックスウィンドウ内にある「エラー」タブにエラー内容が表示されますので、内容を確認しソースコードの修正を行いましょう。

MQL5との互換性

2010年に後継であるMetaTrader5がリリースされ、プログラム言語もMQL5として新しくなりましたが、MQL4とMQL5に互換性はありません。つまり、MQL4で作成したプログラムはMetaTrader5では使用出来ないことになります。MetaTrader5はリリース以降なかなか普及が進んでおらず、その原因はこの互換性にあると言われています。

まとめ

MQL4はMetaTrader4の機能を拡張するプログラム言語
MQL4の開発にはMetaTrader4に同梱のMetaEditorを使用
カスタムインジケーターはチャートへの表示を行うプログラム
エキスパートアドバイザーは自動売買を行うプログラム
スクリプトは1回だけ動作を行うプログラム
ライブラリは他のプログラムから呼ばれることが前提のプログラム
作成するプログラムによりソースコードに必要な定義が異なる
コンパイルに成功することで実行可能なファイルが生成される
MetaTrader4のMQL4とMetaTrader5のMQL5に互換性は無し

参考URL

Event Handling Functions – MQL4 Reference
https://docs.mql4.com/basis/function/events