MQL5ウィザードを使えば、エキスパートアドバイザーのコードを自動で作成できます。詳しくはMQL5ウィザードでのエキスパートアドバイザー作成をチェックしてください。
ここでは、2つの指数移動平均(EMA)を用いたクロスオーバーに基づくトレーディング戦略について考察します。この戦略は、エキスパートアドバイザーをMQL5ウィザードで自動生成する際に使用される 「2つのEMAのクロスオーバーに基づくシグナル」 と呼ばれています。
トレードシグナル:
- 買い: ファストEMAがスロウEMAを上抜けた場合
- 売り: ファストEMAがスロウEMAを下抜けた場合
この戦略は、CSignalCrossEMAクラスで実装されています。

図1. 2つのEMAのクロスオーバーに基づくトレードシグナル
トレードシグナルの詳細
このトレーディング戦略はCSignalCrossEMAクラスで実装されており、インジケーターの値にアクセスしやすくするための保護されたメソッドがいくつか用意されています:
double FastEMA(int ind) // バーのファストEMAの値を返します double SlowEMA(int ind) // バーのスロウEMAの値を返します double StateEMA(int ind) // バーのファストEMAとスロウEMAの差を返します
1. ロングポジションをオープンする条件
ロングポジションをオープンする条件は以下の通りです:
- StateEMA(1) > 0 かつ StateEMA(2) < 0: 最後の完了したバーでファストEMAがスロウEMAを上抜けた場合。
//+------------------------------------------------------------------+ //| ロングポジションをオープンする条件をチェックします | //+------------------------------------------------------------------+ bool CSignalCrossEMA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(2)<0 && StateEMA(1)>0)) return(false); //--- price=0.0; sl =0.0; tp =0.0; //--- return(true); }
2. ロングポジションをクローズする条件
ロングポジションをクローズする条件は以下の通りです:
- StateEMA(1) < 0 かつ StateEMA(2) > 0: 最後の完了したバーでファストEMAがスロウEMAを下抜けた場合。
//+------------------------------------------------------------------+ //| ショートポジションをオープンする条件をチェックします | //+------------------------------------------------------------------+ bool CSignalCrossEMA::CheckCloseLong(double& price) { if(!(StateEMA(2)>0 && StateEMA(1)<0)) return(false); //--- price=0.0; //--- return(true); }
3. ショートポジションをオープンする条件
ショートポジションをオープンする条件はロングポジションのクローズ条件と同じです。
//+------------------------------------------------------------------+ //| ショートポジションをオープンする条件をチェックします | //+------------------------------------------------------------------+ bool CSignalCrossEMA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(2)>0 && StateEMA(1)<0)) return(false); //--- price=0.0; sl =0.0; tp =0.0; //--- return(true); }
4. ショートポジションをクローズする条件
ショートポジションをクローズする条件はロングポジションのオープン条件と同じです。
//+------------------------------------------------------------------+ //| ショートポジションをクローズする条件をチェックします | //+------------------------------------------------------------------+ bool CSignalCrossEMA::CheckCloseShort(double& price) { if(!(StateEMA(2)<0 && StateEMA(1)>0)) return(false); //--- price=0.0; //--- return(true); }
MQL5ウィザードを使ったエキスパートアドバイザーの作成
この戦略に基づいたトレーディングロボットを作成するには、MQL5ウィザードの「生成済みエキスパートアドバイザー作成」オプションでシグナルのプロパティを 「2つのEMAのクロスオーバーに基づくシグナル」 として選択する必要があります:

図2. MQL5ウィザードの「2つのEMAのクロスオーバーに基づくシグナル」選択画面
次に必要なトレーリングストップアルゴリズムと資金管理およびリスク管理システムを指定します。エキスパートアドバイザーのコードは自動で生成され、MetaTrader 5クライアントターミナルのストラテジーテスターでコンパイルしてテストできます。
さらに、標準ライブラリクラスには、CSignalCrossMAクラスで実装されている 「2つのMAのクロスオーバーに基づくシグナル」 が含まれています。このトレーディングアイデアは似ていますが、追加機能(タイプ、シフト、平均化方法の指定、テイクプロフィットおよびストップロスレベルの使用)が多数あります。

図3. MQL5ウィザードの「2つのMAのクロスオーバーに基づくシグナル」
テスト結果
次に、エキスパートアドバイザーのバックテストを行います(通貨ペア: EURUSD H1、テスト期間: 2010年1月1日~2011年1月5日、FastPeriod=12、SlowPeriod=24)。
エキスパートアドバイザーの作成では、固定ボリューム(固定ロットでのトレード、0.1)を使用し、トレーリングストップアルゴリズムは使用していません(トレーリングなし)。

図4. エキスパートアドバイザーのバックテスト結果
添付ファイル: CSignalCrossEMAクラスを含むSignalCrossEMA.mqhはterminal_data_folder\MQL5\Include\Expert\Signalフォルダに配置する必要があります。また、crossover_2ema.mq5にはMQL5ウィザードを使用して作成されたエキスパートアドバイザーのコードが含まれています。