[MT4][プログラミング][入門] 1. EA初期フォーマットサンプルコード

FX等の取引をEAによる自動化を試してみたいがどのように作成していったらいいか分からないという方も多いかと思います。
そんな方に、EA作成で必要となる最低限必要な関数群等をまとめたサンプルプログラムを紹介します。

Contents

サンプルプログラム

下記にサンプルプログラムを記述します。
このまま、拡張子「.mq4」のファイルとして保存してコンパイルもできます。

このプログラムをベースに、Expert Advisorの作り込みも可能です。

/*****************************/
/* propety setting  ・・・ A */
/*****************************/
#property copyright   "2020-2021, x corp."
#property version     "1.00"
#property strict

/*****************************/
/* Input variables  ・・・ B */
/*****************************/
input double	parameter1		= 1.0;

/******************************/
/* Global variables  ・・・ C */
/******************************/
double 			glovalValue1	= 1.0;

/************************************/
/* Event Handing Functions ・・・ D */
/************************************/
int OnInit(void)
{
	int ret = INIT_SUCCEEDED;
	
	// 下記に該当するタイミングで呼び出される関数
	// 1. プログラム読み込み直後。
	// 2. このプログラムが追加されているChart上で時間足が変更された時。
	// 3. このプログラムがChartに追加されている状態で、このプログラムを再コンパイルした時。
	// 4. このプログラムのセットアップ画面でパラメータが変更(再度OKを押された場合も)された時
	// 5. アカウントが変更された時。
	
	// OnTimer()を使用する場合に周期を設定
	if(EventSetTimer(60) == false)	{ ret = INIT_FAILED; }
	
	// 返却値の意味は以下。(特にこの関数でチェックがない場合は固定値でINIT_SUCCEEDEDでも問題ありません)
	// INIT_SUCCEEDED            : 問題なく本関数が完了した際に使用
	// INIT_FAILED               : 初期化に失敗した場合に使用
	// INIT_PARAMETERS_INCORRECT : 入力されたパラメータが不正な場合に使用
	return ret;
}

void OnDeinit(const int reason)
{
	// 本関数で実行できる処理は2.5秒未満である必要があります。
	// 2.5秒を超えると強制終了されます。
	// 特に実装したい処理がない場合は実装しなくても問題ありません。
	
	// 下記に該当するタイミングで呼び出される関数
	// 1. チャートからプログラムを削除した時。
	// 2. このプログラムがChartに追加されている状態で、MT4アプリが閉じられる時。
	// 3. このプログラムがChartに追加されている状態で、Chartが閉じられる時。
	// 4. このプログラムがChartに追加されている状態で、Chartの時間足を変更する直前。
	// 5. このプログラムがChartに追加されている状態で、このプログラムを再コンパイルした時。
	// 6. このプログラムのセットアップ画面でパラメータが変更(再度OKを押された場合も)された時
	// 7. アカウントが変更された時。
	// 8. OnInit()で、INIT_SUCCEEDED以外を返却したとき
	
	// reasonごとの処理。
	if(reason == REASON_PROGRAM)          { /* プログラム内で、ExpertRemove()が呼び出された時 */ }
	else if(reason == REASON_REMOVE)      { /* Chartからプログラムが削除された時 */              }
	else if(reason == REASON_RECOMPILE)   { /* このプログラムが再コンパイルされた時 */           }
	else if(reason == REASON_CHARTCHANGE) { /* Chartの通貨ペアまたは、時間足が変更された時 */    }
	else if(reason == REASON_CHARTCLOSE)  { /* Chartが閉じられた時 */                            }
	else if(reason == REASON_PARAMETERS)  { /* Inputパラメータが変更された時 */                  }
	else if(reason == REASON_ACCOUNT)     { /* アカウントが変更された時 */                       }
	else if(reason == REASON_TEMPLATE)    { /* 新しいテンプレートが適用された時 */               }
	else if(reason == REASON_INITFAILED)  { /* OnInit()でINIT_SUCCEEDED以外を設定した時 */       }
	else if(reason == REASON_CLOSE)       { /* MT4がクローズされるときの処理 */                  }
	
	// OnTimer()を使用する場合は、ここの関数でTimerイベントを停止する必要がある。
	EventKillTimer();
	
	return;
}

void OnTick(void)
{
	// 本関数処理中に、再度OnTick()が呼び出されるタイミングになった場合は、
	// 現在の処理を継続して新しいOnTick()イベントは破棄されます。
	// 本関数は、MT4の自動売買ボタンがON/OFF関係なく呼び出されます。
	
	// 下記に該当するタイミングで呼び出される関数
	// 1. 通貨ペアのTickごと(値の変動ごと)のタイミング
	
	return;
}

void OnTimer(void)
{
	// 下記に該当するタイミングで呼び出される関数
	// 1. OnInit()でEventSetTimer()により設定した周期のタイミング
	
	return;
}

void OnChartEvent(const int id,         // Event ID
                  const long& lparam,   // Parameter of type long event
                  const double& dparam, // Parameter of type double event
                  const string& sparam) // Parameter of type string events
{

	// 下記に該当するタイミングで呼び出される関数
	// 1. Chart上で発生したEventごとのタイミング(それぞれのイベントタイプは下記処理を確認してください)
	
	// チャートイベントごとの処理
	// それぞれのイベントごとの詳細Parameterは下記URLを参照ください
	// URL : https://docs.mql4.com/constants/chartconstants/enum_chartevents
	if     (id == CHARTEVENT_KEYDOWN)        { /* キーボードによる入力があった時のイベント */                                          }
	else if(id == CHARTEVENT_MOUSE_MOVE)     { /* マウスのクリックや移動の時のイベント(CHART_EVENT_MOUSE_MOVE=true 設定要) */          }
	else if(id == CHARTEVENT_OBJECT_CREATE)  { /* グラフィカルオブジェクトの生成時のイベント(CHART_EVENT_OBJECT_CREATE=true 設定要) */ }
	else if(id == CHARTEVENT_OBJECT_CHANGE)  { /* グラフィカルオブジェクトのプロパティを変更したときのイベント */                      }
	else if(id == CHARTEVENT_OBJECT_DELETE)  { /* グラフィカルオブジェクトの削除時のイベント(CHART_EVENT_OBJECT_DELETE=true 設定要) */ }
	else if(id == CHARTEVENT_CLICK)          { /* マウスでクリックした時のイベント */                                                  }
	else if(id == CHARTEVENT_OBJECT_CLICK)   { /* グラフィカルオブジェクトをクリックしたときのイベント */                              }
	else if(id == CHARTEVENT_OBJECT_DRAG)    { /* グラフィカルオブジェクトを動かしたときのイベント */                                  }
	else if(id == CHARTEVENT_OBJECT_ENDEDIT) { /* グラフィカルオブジェクトのテキストの編集を終了したときのイベント */                  }
	else if(id == CHARTEVENT_CHART_CHANGE)   { /* チャートを動かした場合のイベント */                                                  }
	else if(id == CHARTEVENT_CUSTOM)         { /* EventChartCustom()で指定されるカスタムイベントIDの最初のIDのイベント */              }
	else if(id == CHARTEVENT_CUSTOM_LAST)    { /* EventChartCustom()で指定されるカスタムイベントIDの最後のIDのイベント */              }
	
	return;
}

サンプルプログラムの概要説明

上記に記載した、サンプルプログラムですが、サンプルプログラム内にもコメントで概要記述していますが、こちらにも概要を記述いたします。

property 設定・・・ A

#property copyright :プログラムの著作権情報
#property version : プログラムのバージョン情報
#property strict : 過去MQL4のコンパイラアップデート時に大きな差分が多岐にわたり発生したため、互換性を持たせるために作成されたプロパティ。コンパイラをBuild 600以降で新規作成する場合は常に設定しておくのが良いでしょう。またプログラムコンパイル時に警告のレベルを上げる機能もあるようです。(意図しないプログラムミスの軽減につながりますのでいずれにしても記述しておいた方が良いでしょう。)

sample picture for copyright / version information

Input variables ・・・ B

下記画面のようにEAのパラメータ入力画面に表示されるパラメータを設定します。
必要なパラメータ数分作成してください。

sample picture for Paramters

Global variables ・・・ C

プログラム作成において全ての関数において、参照できるグローバル変数を設定します。
通常外部変数は少なくした方が、バグは少なくなると言われています。

Event Handing Functions ・・・ D

MT4のEvent handlerから呼び出される関数群です。
それぞれの関数の呼び出しタイミング等はサンプルプログラム内に記述しています。

OnInit():
プログラム読み込み後に最初に呼び出される関数。
外部変数の初期化処理や、inputパラメータのチェック処理などを行っておくとよいかと思います。

本関数は、必須で記述したほうが良いでしょう。
ただし関数内の処理は最悪、無くてもかまいません。

その他OnInit()関数実装時の注意点なども参照してみてください。

OnDeinit():
プログラム終了時に呼び出される関数。
停止が必要なEventや、終了時に出力しておきたい情報があればここで処理しておくのが良いかと思います。

本関数は、必須で記述したほうが良いでしょう。
ただし関数内の処理は最悪、無くてもかまいません。

OnTick():
対象の通貨ペアの価格が変わるごと(Tickごと)に呼び出されます。
基本的には、ここに自動売買の処理のコアを実装または、自分で作成した自動売買する関数の呼び出しを行います。

OnTimer():
指定した周期で、呼び出される関数です。
OnTick()は値動きがないと呼び出されない為、値動きなくても動作させたい場合はこちらを使用します。

使用用途がなければプログラム内に含める必要はありません。

OnChartEvent():
Chart上でのイベント(キーボード操作、マウス操作、オブジェクトの生成/変更/削除)等により呼び出される関数です。

使用用途がなければプログラム内に含める必要はありません。

サンプルコードを見て自分での実装が難しいなと思った方は

自分でのEAの実装が難しいなと思った方は、EAの作成代行を行ってくれるところもありますので下記に2つ程度紹介しておきます。

Gogojungle :
投資クラウドということろからEA作成依頼が可能です。

投資家の英知をすべての人に。GogoJungle

ココナラ :
下記サイトの、検索ウィンドウで、「ea 作成」などで検索すると作成代行者が出てきます。

以上–

次は、OnInit()の仕様と注意点です。

[お知らせ]MT4使いのあなたへ

日本の金融商品取引業者にも登録されているゴールデンウェイ・ジャパン社が運営するFXTF のご紹介です。

国内FX業者の中でも最狭水準のスプレッドで有名なFXTFでは、口座開設と2つの指定通貨ペアでの取引を行うだけで1万円のキャッシュバックがあります。

1万円キャッシュバックキャンペーンキャッシュバック受け取り方法:

キャッシュバックの受け取り方法は以下の2つの条件をクリアすることで取引口座へ振り込まれます。

条件1:
FXTFでの新規口座開設
※ここまでだけでも、3000円のキャッシュバックが受け取れます。

条件2:
以下の2通貨ペアそれぞれで1取引、合計2取引を口座開設から10日以内に行うこと。
USDJPY(スプレッド : 0.1銭 原則固定)
GBPJPY(スプレッド : 0.6銭 原則固定)
※取引量は問われないようです。
※この条件を達成すると追加で7000円キャッシュバックされます。(条件1と合わせて合計1万円になります)

その他補足情報:

MT4:利用可
関東財務局長(金商)登録番号:第258号

FXTFはMT4が使えて、スプレッドもとても小さいFX国内業者の為、このキャッシュバックキャンペーン期間中にメイン/サブ口座として開設するのもいいかもしれませんね。
※MT4での指定の取引量の取引を行うと、さらに+5万円がキャッシュバックされるキャンペーンもやっていますがこちらは、指定の取引量がかなり大きいので紹介は割愛させていただきます。