phoenix-powerMetaTraderのEAを作ってバックテストしてみた。

はじめに

MT4,MT5という有名なチャートアプリがあるのだけど、そこでEAという自動売買プログラムを稼働させられるので、MQL4,MQL5などの言語を使って適当に書いてみました。

MetaTrader4

MetaTrader5

で、その際、バックテストを少し調整しながら作ったのだけど、システムトレードで利益をあげられるかというと、私は、いくらバックテストの結果が良好でも難しいんじゃないかと思いました。あと、この分野、システムトレードで検索してみて、本当にまともなサイトや情報が少ない印象があります。宣伝や広告、よくわからない商材の紹介などばかりで胡散臭いものが多かったです。

そんな中でまともっぽいサイトも少しばかりありましたので、私が見かけた中でまともっぽいサイトを紹介。

中の人が見えているので、とても好印象。更に、可能な限りのリスクヘッジで自動売買の取引をされているみたいで、1ヶ月の利益が+1000から+10000の間という感じです。

こちらのサイトの中の人は、プロトレーダーということみたいですが、サイトの作りが標準的で好印象。他のサイトは、FC2とかFC2とかばかりですし、そうでなくても見た目的に胡散臭いサイトが多いので。

プログラムを作成した感想

C言語に慣れている場合は、MQL4,MQL5はとても書きやすい印象。

指針としては、出来る限りシンプルなシステムにするということを考えました。

そして、基本的には値の調整ではなく、エントリーとイグジットを調整することで、バックテストの結果を見ながら修正していくという感じで作りました。

1度のストップでシステムを停止するようにしています。また、1日に1回のトレードに制限しています。また、損切りを頻繁に行うように設定しています。

アイディアとしては、M5からエントリーできるポイントを探し、それを長い時間軸をフィルタとして設定する感じです。したがって、エントリーできる回数は非常に少なくなっています。

バックテストを行ってみて感じたこと

バックテスト後、いくつか手動でエントリー、イグジットポイントを確認してみたところ、バックテストの結果が全く当てにならないと思いました。

また、ヒストリーデータがそれぞれ使用する口座によって異なること、実際に計算される値や描写がチャートとずれること、実取引においての不確定要素の多数(スプレッドや約定拒否、スリッページなど)が挙げられます。

個人的な話になるのだけど、最近、MacBook Proを買おうか、Amazonで20万円分のギフトを買おうかどうしようか迷ってたのですが、やはり、Amazonで20万円分のギフトを購入したほうが良いだろうという結論に達しました。

でも、これではあまり面白くないので、自分が作ったEAがどれくらいでダメになるか見てみるのも面白いかもしれないなあと思い作成してみました。

ちなみに、私のプログラムでは、ストップと言って100pipsの損失が出ると、自動的にプログラムが停止するようにしていますので、いつまで稼働してられるかということですね。あと、利益は、多分ほとんど出ないんじゃないかなあ。どれくらい損失が出るか否かの問題な気がする。

まあ、時間があればということですが(多分やらない…)。

バックテストの結果は以下。

Sell

gbp/jpy,m5,forex,2015.01.01-2015.09.18

Buy

gbp/jpy,m5,forex,2015.01.01-2015.09.18

基本的にはエントリー回数は少なく、どちらのEAも結構頻繁に損切りするようになってます。勝率は70%前後でそこそこ。成績はあまり良くない感じですね。これで実取引を行うと耐えられないのではって感じします。ただ、どれだけバックテストの成績が良くても、実取引に耐えられるシステムは相当少ないと思うので、まあ、どちらに転ぶかはわかりませんが…。

特徴としては、パラメーターをいじることはほとんどしてなくて、主にエントリー、イグジットポイントを調整してるって感じです。あと、Buy(買)とSell(売)で分けています。まとめてもいいんですが、分けたほうが検証しやすそうだと思ったので。

あと、上のBuyとSellのシステムはロジックが全く異なります。別のプログラム、システムトレードと言ってよいでしょう。同じロジックで作るのは時間がもったいないので、できるだけたくさんの検証をしたかったので。

コード

一部のコードを解説します。基本的に思いついたのをバラバラに。なので、必要な変数とかは個別に設定してあげてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Custom Indicator, --最後の0はローソクの0個前、1個前、2個前などの値です, 他は時間が多い, PERIOD_M5のところは0で現在のチャート時間を使用
double FOO;
FOO = iCustom(NULL, PERIOD_M5, "foo" ,fastperiod, 0.3, 0.3,0);

// Default Indicator
double WPR;
WPR = iWPR(NULL, 0, 14, 0);

// ポジションがあれば
if (OrdersTotal()==1
{
  //エントリー価格から現在価格を引いたポイントがストップトレーリングよりも大きければ
  if(Bid-OrderOpenPrice()>Point*TrailingStop)
  {
      //ストップをエントリー価格に変更し、指値を設定
      Stop_Test_A = OrderModify(OrderTicket(), OrderOpenPrice(), Bid + (StopLoss * Point), 0, 0, Red);
  }
}

// ストップロスの設定, --OrderSendで設定されない場合があります
if (OrdersTotal()==1
  && OrderStopLoss()==0){
  if(OrderType()==OP_SELL){
      Stop_Test_C = OrderModify(Ticket_S,OrderOpenPrice(),Bid + (StopLoss * Point),0,Red);
  }
}

// 23時55分でなければ, --損切りになりやすい時間帯を避けるために有効
if(   TimeHour(TimeCurrent()) != 23
   && TimeMinute(TimeCurrent())!=55   ){}

// トレード回数制限
static int TradeCnt = 0;
// 0時に値をリセット
if(TimeHour(CurTime())==00 && TimeMinute(CurTime())==00) TradeCnt = 0;
// ポジションがなければ
if (OrdersTotal()==0
  // トレード回数が1回以下なら
      && TradeCnt < 1 )
{
  //エントリー条件にインジケータの値を使用
  if (  FOO < 1
      && WRP > 0
      && ( Ticket_L == 0 || Ticket_L == -1 )
      && ( Ticket_S == 0 || Ticket_S == -1 ))
  {
      //オーダーの実行
      Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Ask - (StopLoss * Point),0,Comments,MAGIC,0,Blue);
  }
}

// シグナルでアラートを鳴らす
extern string SoundAlert = "true";
if(SoundAlert == "true"){
  if( FOO > 1 )
  {
      PlaySound("alert.wav");
  }

  if( WRP < 0 )
  {
      PlaySound("alert.wav");
  }
}

// ウィンドウとアラート
double WNA;
WNA = iWPR(NULL, 0, 14, 0);
if(SoundAlert == "true"){
  if(   WNA > -20)
  {
      Alert("Up",Symbol(),"-",Period());
  }
  if(   WNA < -80)
  {
      Alert("Down",Symbol(),"-",Period());
  }
}
return(0);

// メール通知, --アドレスとサーバーはMetaTraderの設定にて
SendMail("title","post");

MetaTrader4の設定

日本円でのテスト

テスター, エキスパート設定と進み、そこで通貨を手動でJPYと入力することで日本円でのテストができます。

口座登録

ファイル, デモ口座の申請, add new brokerにて使用するブローカーのサーバーを検索し、既存のアカウントを使用すると、口座を使えるようになります。

LinuxでのMetaTraderの起動

Arch LinuxでWineからMetaTraderを起動する方法です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ vim /etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist

$ sudo pacman -S wine winetricks mpg123

# アプリを起動する
$ wine path/to/hoge.exe

# 文字化けを直す
$ sudo cp /usr/share/fonts/TTF/*.ttf ~/.wine/drive_c/windows/Fonts
$ winetricks allfonts

# フォントを綺麗にする(不要)
$ winetricks fontsmooth-rgb

場合によってはmt4setup.exeのインストーラーからインストールしようとすると、トラブルがあるかもしれないので、その場合は、Windowsで展開してから、C/Program Files/MetaTrader 4~/.wine/drive_c/Program Filesに持ってきましょう。

次に、VNC Serverを設定してみます。

1
2
3
4
5
6
7
$ sudo pacman -S tigervnc x11vnc

$ vncserver
$ vncserver -kill :1
$ chmod 700 ~/.vnc

$ x0vncserver -display :0 -passwordfile ~/.vnc/passwd

クライアントからのアクセスは、Linuxからなら当該ツールを使います。vncviewer

Macの場合はFinderから行います。メニュー,移動,サーバーへの接続。あと、環境設定は適切に行いましょう。デフォルトの設定は基本的に危険です。

Windowsからは、デフォルトでVNC Viewerあるのか知りませんが、なければ、uVNCとかを使えばよいのでは…。

x11vncの場合は、例えば、vnc://192.168.1.5:5900とします。vncserverの場合はポートが5901になります。WANからアクセスできるようにする場合は、ルーターによるポート転送とiptable、sshトンネリングなどを設定すると良いです。もしLAN内でも秘匿回線を使いたい場合はそんな感じで。VNCは基本、トラフィックとかも暗号化されませんので。

1
2
3
4
5
6
# server
$ vncserver -geometry 1440x900 -alwaysshared -dpi 96 -localhost :1

# client
$ ssh IP_OF_TARGET_MACHINE -L 8900/localhost/5901
$ vncviewer localhost::8900

ローカルアドレスはスキャンしてもよいけど、固定しておいたほうが良さです。

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo cp /etc/netctl/examples/ethernet-static /etc/netctl/eth0

$ sudo vim /etc/netctl/eth0
Interface=eth0 #ifconfig,iwconfigから
Connection=ethernet
IP=static
Address=('192.168.1.5/5')
Gateway='192.168.1.1'
DNS=('192.168.11.1')

$ sudo netctl start eth0
$ sudo netctl enable eth0

DNSは、障害が多い日本のプロバイダー提供である場合が多いと思いますが、問題があれば、Googleの8.8.8.8とか使うようにしておくと良いかもですね。

Wi-Fi接続を使うには、以下の様な感じ。

1
2
3
4
5
6
7
8
9
10
11
$ sudo wifi-menu
$ sudo vim /etc/netctl/wlan0-xxxxxxxxxxx #wlan0=ifconfig,iwconfig
Address=('192.168.1.5/5')
Gateway='192.168.1.1'
DNS=('192.168.11.1')

$ sudo ifconfig wlan0 down
$ sudo netctl stop eth0
$ sudo netctl disable eth0
$ sudo netctl start wlan0-xxxxxxxxxxx
$ sudo netctl enable wlan0-xxxxxxxxxxx

Historyデータの取得と反映

以下のサイトから必要なものをダウンロードし、metatrader4/historyに置きます(別に置かなくても良い)。その際、.hstを削除しておくと良いです。

http://www.fxdd.com/bm/jp/forex-resources/forex-trading-tools/metatrader-1-minute-data/

保存したデータをデータをツール,ヒストリーセンターからインポートします。

M1から他の時間チャートを作成するには(これによりチャート描写の信頼性が上昇します)、Period Converter Allというスクリプトを使います。