MT4を使った自動バックテスト①エキスパートアドバイザーの起動と設定

2019年12月14日

このページでは FX取引ソフトのMT4(メタトレーダー4) を使って、自動売買の要領で過去検証(バックテスト) をする準備をしていきます。

初心者でも簡単に短時間でバックテストを実施できるよう、サンプルプログラムを用意しています。

用意するのはMT4 だけですが、普段の売買とは別に バックテスト用のMT4をご用意するのをオススメします。

どのFX会社のものでも良いので、インストールしておいてください。

うさぎ
うさぎ
この記事は楽天証券のMT4(Build1220以降)を使っています 。画面構成など、他社のMT4と違う場合があります。

バックテスト とは?

バックテストとは、過去の通貨取引データを用いて、ある手法のパーフォーマンスを検証することを言います。

例えば、移動平均線のゴールデンクロスやデッドクロスという名前を聞いたことはあると思います。

しかし実際にゴールデンクロスが出現するたびに買い続けたら本当に儲かるのか、検証したことのある人は少ないでしょう。

おじさん
おじさん
「ゴールデンクロスが出現すると上がる」と聞き、そのまま信じていました

仮に儲かると分かったとしても、移動平均線の設定を何日にすれば良いか、通貨ペアごとに設定を変えたほうが良いのか等、無限に検証を続けなければいけません。

そこで、MT4の自動売買機能EA(エキスパートアドバイザー)を使って過去検証(バックテスト)を実施すれば、短時間に大量の過去の実践データを得られます。

おじさん
おじさん
下の画像のように、数年分の収支をグラフで表示してくれます

上のグラフは最終的にはトントンなんだけど、大きく下落する場面、横ばい、そして上昇しています。

「結果がトントンだから使えない手法」と決めつけるのではなく、何故下落したのか、何故上昇したのかを考え、次の仮設を立てていくことがバックテストの意義になります。

おじさん
おじさん
インジケーターの組み合わせも大事ですね

EAのバックテストをおこなうにはプログラミングの知識が必要ですが、当サイトでは検証用のプログラムを公開していきます。

とりあえずコピペだけでバックテストできます。

一度バックテストをおこない、「これは使える!」と感じたら、ご自分でプログラミングを勉強してみてください。

EAの準備

では MT4を起動している状態から、EAの準備について説明していきます。

MT4の画面上部に、本?のようなメタエディター(MetaEditor)のアイコンがあるのでクリックします。

メタエディターが開きます。

画面左上の新規作成をクリックします。

MQL4ウィザード(設定画面)が開くので、エキスパートアドバイザを選択し次へをクリックします。

名前の欄に今回実行するプログラムの名前を入力します。

自分が分かりやすい名前を付ければ良いので、ここではTest-MAとしておきました。

入力したら次へをクリックします。

イベントハンドラはチェック不要なので、そのまま次へをクリックします。

その次もチェック不要なので、そのまま完了をクリックします。

すると、下の画像のようなプログラムが開きます。

画面左のナビゲータとプログラムウインドウの左上に「Test-MA」と記載されているはずです。

 

うさぎ
うさぎ

初期設定では、プログラムコードの背景は白くなっています。

ツールオプションで文字や背景のカラーを変更できます。

 

おじさん
おじさん
目には黒背景が優しいですね
うさぎ
うさぎ
項目ごとに文字の色を変えておくとエラーを探しやすくなります

次に、最初に入っているプログラムコードを全て消し、下のプログラムコードをコピペします。

おじさん
おじさん
右上の「copy」ボタンをクリックすると一発でコピーできます
ご注意

このプログラムはバックテスト用に作成したものです。
実際の取引きには使用しないでください。

また、プログラムの内容についてはエラーを検査しておりますが、使用環境により想定通りに動作しないこともございます。
当プログラムを実行した結果、なんらかの損害が生じたとしても当方では一切の補償はできませんのでご了承ください。

不具合につきましては、コメント欄よりご連絡いただければ改善に努めます。

//+------------------------------------------------------------------+
//|                                                      Test-MA.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//----------------------------------初期テンプレ
input double Lots = 1.0;//取引設定
input int Slip = 10;
input string Comments = "";
//エントリーエグジット変数
int Ticket_Uri = 0;
int Kessai_Uri = 0;
int Ticket_Kai = 0;
int Kessai_Kai = 0;
//----------------------------------初期テンプレここまで
//インジケータパラメータを変数に ライン番号0
input int SMAPeriod = 20;
input int LMAPeriod = 40; 
input int MAShift = 0; 
input ENUM_MA_METHOD MAMethod = MODE_EMA; //EMA0 EMA1 SMMA2 LWMA3
double SMA_2 = 0;//20MAと40MA、それぞれ1本前、2本前用の変数を用意する
double LMA_2 = 0;
double SMA_1 = 0;
double LMA_1 = 0;
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
  LMA_2 = iMA(_Symbol,0,LMAPeriod,MAShift,MAMethod,PRICE_CLOSE,2);
  SMA_2 = iMA(_Symbol,0,SMAPeriod,MAShift,MAMethod,PRICE_CLOSE,2);
  SMA_1 = iMA(_Symbol,0,SMAPeriod,MAShift,MAMethod,PRICE_CLOSE,1);
  LMA_1 = iMA(_Symbol,0,LMAPeriod,MAShift,MAMethod,PRICE_CLOSE,1);
 //iMA(通貨、タイムフレーム、MAの期間、MAシフト、MAのモード、適用価格、過去シフト)
 
    Comment("短期MA_1= ",SMA_1,"\n長期MA= ",LMA_1,"\n終値= ",Close[1]);  
  
  //買いポジエグジット 短期MA<長期MAのデッドクロスで決済
  if (SMA_2>=LMA_2
  && SMA_1<LMA_1
  
  //---------------ここから買いポジエグジットのテンプレ
  &&(Ticket_Kai!=0 && Ticket_Kai!=-1))
  {
  Kessai_Kai = OrderClose(Ticket_Kai,Lots,Bid,Slip,Red);
   if(Kessai_Kai == 1)Ticket_Kai = 0; //決済されたらTicket変数に0を代入し、決済注文が連続して出ないようにする
  }
 //---------------------------ここまで 
  
  //売りポジエグジット 短期MA>長期MAのゴールデンクロスで決済
  if (SMA_2 <= LMA_2
  &&SMA_1 > LMA_1
 
  //---------------ここから売りポジエグジットのテンプレ
  &&(Ticket_Uri!=0 && Ticket_Uri!=-1))
  {
  Kessai_Uri = OrderClose(Ticket_Uri,Lots,Ask,Slip,Blue);
   if(Kessai_Uri == 1) Ticket_Uri = 0; //決済されたらTicket変数に0を代入し、決済注文が連続して出ないようにする
  }  
 //---------------------------ここまで 
  
  //買いエントリ 短期MA>長期MAのゴールデンクロスで買エントリー
  if (SMA_2<=LMA_2
  && SMA_1>LMA_1
 //---------------ここから買いポジエントリのテンプレ
  &&(Ticket_Kai==0 || Ticket_Kai==-1)
  &&(Ticket_Uri==0 || Ticket_Uri==-1))
  Ticket_Kai = OrderSend(_Symbol,OP_BUY,Lots,Ask,Slip,0,0);
 //---------------------------ここまで 
  
  //売りエントリ 短期MA<長期MAのデッドクロスでエントリ
  if (SMA_2>=LMA_2
  && SMA_1<LMA_1
 //---------------ここから売りポジエントリのテンプレ
  &&(Ticket_Uri==0 || Ticket_Uri==-1)
  &&(Ticket_Kai==0 || Ticket_Kai==-1))
  Ticket_Uri = OrderSend(_Symbol,OP_SELL,Lots,Bid,Slip,0,0);
 //---------------------------ここまで 
  }

このプログラムは2本の移動平均線を使って、ゴールデンクロスで買い、デッドクロスで売る、という単純なものです。

プログラムを貼り付けたら、上部メニューの「コンパイル」をクリックします。

 

うさぎ
うさぎ

見てもらうと分かりますが、プログラムは英語主体で人間に分かりやすく書かれています。

コンパイルとは、人間に分かりやすく書かれたプログラムをコンピュータ用の言語に書き換えることを言います。

 

問題なくコピペできていれば画面下部に「0error」と正常にコンパイルされたメッセージが表示されます。

何らかのエラーがあるときは、エラーの箇所が表示されます。

おじさん
おじさん
エラーが出たときはもう一度コピペし直してみてください

コンパイルがでエラーが無ければ、MT4のナビゲーターのエキスパートアドバイザーに『Test-MA』が追加されます。

ナビゲーターは、チャートの上の★のアイコンをクリックすると表示されます。

おじさん
おじさん
今回はここまで。おつかれさまでした。
うさぎ
うさぎ
次回は、このプログラムを起動させて過去検証をしてみましょう

バックテストプログラムを動かしてみる「②ストラテジーテスターの使い方」

おじさん
おじさん
儲かるお宝プログラムだと良いのですが