2012年6月5日火曜日

FXのチャート分析ソフトMT4のEAの作り方

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)のEA(Expert Advisor)の作り方を紹介します。

MT4のメニューから「ツール」、「MetaQuotes Language Editor」を選びます。



MetaEditorの画面が表示されますので、「File」、「New」を選びます。

「Expert Advisor Wizard」の画面が表示されますので、「Expert Advisor」のラジオボタンを選び、「次へ」のボタンをクリックします。



EAの名前、作者名、Webサイトのアドレスを入力して、「完了」のボタンをクリックします。なお、EAの名前がファイル名になり、拡張子に「.mq4」が付いて保存されます。



MetaEditorの「sample.mq4」の編集画面が表示されます。この編集画面でEAを作成していきます。

▼EAの作成

初めてEAを作成する場合は、すでに公開されているEAのソースリストを見て、どのような流れでプログラムが作られているかを把握するとよいでしょう。

EAは、自動売買のためのプログラムなので、どのタイミングで注文するのか、どのタイミングで決済するのかを記述する必要があります。次のソースリストは買いポジションと売りポジションの決済をするプログラムです。

//買いポジションの決済
if(買いポジションの決済のタイミング)
{
Buy_exit = OrderClose(Buy_entry,lot,Bid,slip,Yellow);
if(Buy_exit == 1)
{
Buy_entry = 0;
}
}
//売りポジションの決済
if(売りポジションの決済のタイミング)
{
Sell_exit = OrderClose(Sell_entry,lot,Ask,slip,Red);
if(Sell_exit == 1)
{
Sell_entry = 0;
}
}

OrderCloseという関数を用いて、ポジションを決済します。

上のソースリストの買いポジションの決済のタイミングと、売りポジションの決済のタイミングには、決済の判断となるプログラムを記述します。決済の判断としては、エントリーした価格からいくら値上がりしたら決済する、という方法と、この価格になったら決済するという方法、テクニカル指標の数値が80より大きくなったら決済するといった方法などが考えられます。また、これらの方法を組み合わせて決済するという方法もあります。

次に、どのタイミングで注文するのかのプログラムを記述します。

//買いポジションのエントリー
if(買いポジションのエントリーのタイミング)
{
Buy_entry = OrderSend(Symbol(),OP_BUY,lot,Ask,slip,0,0, Comments,MAGIC,0,Yellow);
}

//売りポジションのエントリー
if(売りポジションのエントリーのタイミング)
{
Sell_entry = OrderSend(Symbol(),OP_SELL,lot,Bid,slip,0,0,Comments,MAGIC,0,Red);
}

OrderSendという関数を用いて、エントリーします。

買いポジションのエントリーと売りポジションのエントリーは、主にテクニカル指標によって算出した数値が30以下なら売り、70以上なら売りといったようなプログラムを記述します。

次のソースリストは、ボリンジャーバンドの+4σと-4σを超えたら売買を行うプログラムです。上記のソースリストにボリンジャーバンドでの売買タイミングを加え、また、初期設定を追加したものです。

「sample.mq4」
//マジックナンバー
#define MAGIC 123456789
//ボリンジャーバンドの設定
extern int BB_period = 20;
extern int BB_shift = 0;
extern double BB_sgm = 4.0;
//取引条件の設定
extern double lot = 1.0;
extern int slip = 10;
extern string Comments = "";
//買い注文の結果
int Buy_entry = 0;
//売り注文の結果
int Sell_entry = 0;
//買いポジションの決済注文の結果
int Buy_exit = 0;
//売りポジションの決済注文の結果
int Sell_exit = 0;

int start()
{
//買いポジションの決済
if(iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,1,2) >= Close[2]
&& iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,1,1) < Close[1] && (Buy_entry != 0 && Buy_entry != -1)) { Buy_exit = OrderClose(Buy_entry,lot,Bid,slip,Yellow); if(Buy_exit == 1) { Buy_entry = 0; } } //売りポジションの決済 if(iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,2,2) <= Close[2] && iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,2,1) > Close[1]
&& (Sell_entry != 0 && Sell_entry != -1))
{
Sell_exit = OrderClose(Sell_entry,lot,Ask,slip,Red);
if(Sell_exit == 1)
{
Sell_entry = 0;
}
}
//買いポジションのエントリー
if(iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,2,2) <= Close[2] && iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,2,1) > Close[1]
&& (Buy_entry == 0 || Buy_entry == -1)
&& (Sell_entry == 0 || Sell_entry == -1))
{
Buy_entry = OrderSend(Symbol(),OP_BUY,lot,Ask,slip,0,0, Comments,MAGIC,0,Yellow);
}
//売りポジションのエントリー
if(iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,1,2) >= Close[2]
&& iCustom(NULL,0,"Bands",BB_period,BB_shift,BB_sgm,1,1) < Close[1] && (Sell_entry == 0 || Sell_entry == -1) && (Buy_entry == 0 || Buy_entry == -1)) { Sell_entry = OrderSend(Symbol(),OP_SELL,lot,Bid,slip,0,0,Comments,MAGIC,0,Red); } return(0); } ソースリストの作成が終わったら、次にコンパイルを行います。MetaEditorの画面上部の「Compile」のボタンをクリックします。

コンパイルが終了すると、画面の下側に「0 error(s), 0 warning(s)」と表示されます。これは、コンパイルの作業でエラーや警告がなかったことを意味しています。

もし、コンパイルのエラーが発生した場合には、エラーの行番号とその内容が表示されますので修正を行います。

以上で、EAの作成が終わりました。

「sample.mq4」をStrategy Testerで確認すると次のようなパフォーマンスであることがわかります。パフォーマンスが悪い場合には、パフォーマンスが向上するようにエントリーのタイミングや決済のタイミングの部分のプログラムを修正したりするとよいでしょう。