FXのEA(自動売買)とは?移動平均線(MA)を使った簡単なEAの作成方法を解説
EAとは?
EAとはExpert Adviserの略で、トレーダーに代わって自動的に売買を行ってくれるプログラムのことです。
エントリーから決済までの全ての工程を行ってくれる完全自動タイプのものから、決済のみ手動で行う半自動タイプのものなど、さまざまなタイプのEAが存在します。
本記事では、実際に簡単な仕様のEAを作成してみます。
TIPS 自動売買は全てEA?
自動売買プログラムのことをEAと呼ぶのは、実は主にMT4かMT5で作成されたプログラムに対してです。
FXの世界にはEAの他にも、FX会社オリジナルの自動売買プログラムが多くあります。
また、仮想通貨の世界では自動売買プログラムのことを「bot(ボット)」と呼んだり、単に「自動売買ツール」と呼んだりします。
仕様
まずは作成するEAの仕様をまとめます。
すぐにプログラムを書き始めても良いですが、一度整理することでコーディングの効率が上がります。
エントリー条件
短期MAと長期MAがゴールデンクロスした時、買いエントリー
短期MAと長期MAがデッドクロスした時、売りエントリー
決済条件
今回、決済は手動で行うものとし、決済ロジックは実装しない
その他の条件
スリッページ、スプレッドによってエントリーを制限する
ポジションは同時に1つのみ保有するようにする
マジックナンバーとロット数を変更できるようにする
EAを作成する
プログラムは「プリプロセッサ」「フィールド」「関数(OnInit)」「関数(OnInit以外)」の順番に記述していきます。
プリプロセッサ | mql4プログラムをコンパイルする直前に実行される前処理のことです。 プログラムの著作権やバージョンなどの指定を行います。 |
---|---|
フィールド | プログラム中で使用するさまざまなデータを保管する部分です。 |
関数 | ある特定の動作をひとまとまりの塊にした部分です。 |
プリプロセッサ
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
EAを新規作成する場合、デフォルトでひな形のプログラムが用意されています。
今回作成するEAでは、デフォルトのプリプロセッサをそのまま使用します。
「copyright」「link」については、主に作成したEAを他者に配布する際に表示する部分なので、個人で利用する場合は削除しても問題ありません。
フィールド
input int MAGICMA = 23498721; // マジックナンバー
input double Lots =0.01; // 1ロット十万通貨単位
input int Slippage = 4; // エントリー見送りスリッページ
input double MaxSpread = 5; // エントリー見送りスプレッド
input int MAPeriod1 = 12; // 短期線期間
input int MAPeriod2 = 96; // 長期線期間
input ENUM_MA_METHOD MAMethod = MODE_SMA; // 種別
input ENUM_APPLIED_PRICE MAAppliedPrice = PRICE_CLOSE; // 適用価格
double dSpread;
フィールドで変数を宣言する際に、文頭に「input」とつけると、ユーザーがMT4でパラメータ変更ができます。
今回はEAの基本要素である「マジックナンバー」「ロット数」「スリッページ制限」「スプレッド制限」と、エントリー判断に使用する移動平均線の「短期期間」「長期期間」「種別」「適用価格」を変更できるようにしています。
変数の「dSpread」は、スプレッドの値を計算して格納する変数です。
OnInit関数
int OnInit()
{
return(INIT_SUCCEEDED);
}
OnInit関数は、EAを新規作成する際にデフォルトで用意されている関数です。
EAをMT4のチャートにセットした瞬間に、この関数の中に記述したコードが実行されます。
そのため、このOnInit関数内には「EAをセットした瞬間だけ行うべき処理」を記述します。
なお、今回作成するEAでは、セットした瞬間だけ行う処理は特にないので追記しません。
OnTick関数
void OnTick()
{
dSpread = (Ask - Bid) / (Point * 10);
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();
}
OnTick関数もOnInit関数と同様に、新規作成時にデフォルトで用意される関数です。
この関数は、MT4のチャートのティックが更新されるたびに実行されます。
主に「EAのエントリーや決済」などの重要な処理を記述します。
「dSpread」には、Ask(買値)とBid(売値)の差から計算したスプレッドの値を格納します。
スプレッドの値は毎ティックごとに変化するので、OnTIck関数の中で計算を行います。
「if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();」の文は、「現在保有しているポジションの数が0、かつスプレッドがパラメータのスプレッド制限の値以下の場合、エントリーを行う」という意味です。
CalculateCurrentOrders関数は、現在保有しているポジションの数を取得する関数です。
CheckForOpen関数は、実際にエントリーを行う関数です。
TIPS OnInit関数とOnTick関数は必須?
OnInit関数とOnTick関数はデフォルトで用意されていますが、必ず記述する必要があるわけではありません。
例えば、OnInit関数を削除しても、問題なくコンパイル可能です。
しかし、OnInit関数とOnTick関数の両方を削除してしまうと、コンパイル時にエラーが発生してしまいます。
CalculateCurrentOrders関数
int CalculateCurrentOrders()
{
int positions = 0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
positions++;
}
}
return positions;
}
CalculateCurrentOrders関数は、現在保有中のポジションの数を呼び出し元に返してくれます。
CheckForOpen関数
void CheckForOpen()
{
int res;
double ma1 = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma2 = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma1_before = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,2);
double ma2_before = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,2);
if(ma1 > ma2 && ma1_before <= ma2_before)
{
res=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,"", MAGICMA, 0, Red);
}
if(ma1 < ma2 && ma1_before >= ma2_before)
{
res=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", MAGICMA, 0, Blue);
}
}
CheckForOpen関数では、移動平均線がゴールデンクロス、デッドクロスをしているかどうかを判定します。
ゴールデンクロスしていれば買いエントリー、デッドクロスしていれば売りエントリーを行います。
ゴールデンクロスの判定は「1つ前のローソク足の短期移動平均線が長期移動平均線よりも小さい、かつ現在のローソク足の短期移動平均線が長期移動平均線よりも大きい」場合とします。
クロスの条件を満たしたら、OrderSend関数を用いて注文を送信します。
第5引数にパラメータのスリッページ制限の変数を指定することで、自動でスリッページの制限を行ってくれます。
プログラム全文
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MAGICMA = 23498721; // マジックナンバー
input double Lots =0.01; // 1ロット十万通貨単位
input int Slippage = 4; // エントリー見送りスリッページ
input double MaxSpread = 5; // エントリー見送りスプレッド
input int MAPeriod1 = 12; // 短期線期間
input int MAPeriod2 = 96; // 長期線期間
input ENUM_MA_METHOD MAMethod = MODE_SMA; // 種別
input ENUM_APPLIED_PRICE MAAppliedPrice = PRICE_CLOSE; // 適用価格
double dSpread;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnTick()
{
dSpread = (Ask - Bid) / (Point * 10);
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();//ポジションを持っていなければポジションを得る
}
void CheckForOpen()
{
int res;
double ma1 = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma2 = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma1_before = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,2);
double ma2_before = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,2);
if(ma1 > ma2 && ma1_before <= ma2_before)
{
res=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,"", MAGICMA, 0, Red);
}
if(ma1 < ma2 && ma1_before >= ma2_before)
{
res=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", MAGICMA, 0, Blue);
}
}
int CalculateCurrentOrders()
{
int positions = 0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
positions++;
}
}
return positions;
}
EA(自動売買)を学びたい方へオススメコンテンツ
OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。