MQL5ウィザードを使ったアリゲーター指標のトレードシグナル生成

Mike 2011.01.15 03:35 28 0 0
添付ファイル

MQL5ウィザードを使えば、プログラミングなしでエキスパートアドバイザー(EA)を自動生成できます。詳しくはMQL5ウィザードでのエキスパートアドバイザー作成をご覧ください。

今回は、B.ウィリアムズが「トレーディング・カオス」で提唱したアリゲーター指標に基づくトレードシグナルについて考えてみましょう。この戦略は「アリゲーターに基づくシグナル」と呼ばれ、MQL5ウィザードで自動的にEAを作成する際に利用されます。

このシステムは、3つの移動平均(リップス、ティース、ジョーライン)と、それらの差を使って計算されるオシレーターに基づいています。アリゲーターのラインのクロスオーバーによってトレードシグナルが生成され、トレンドはこれらのラインの順序によって決まります。上昇トレンドの場合、リップスライン(最小期間)は最も高く、次がティースライン、最も低いのがジョーラインです。下降トレンドの場合はその逆です。

トレードシグナルは以下の通りです:

  • ロングポジションを開く:アリゲーターラインのクロスオーバーと、上昇トレンドの場合におけるライン間の距離の増加;
  • ロングポジションを閉じる:リップスラインがジョーラインを上にクロスする;
  • ショートポジションを開く:アリゲーターラインのクロスオーバーと、下降トレンドの場合におけるライン間の距離の増加;
  • ショートポジションを閉じる:リップスラインがジョーラインを下にクロスする;

この戦略はCSignalAlligatorクラスで実装されています。

図1. アリゲーター指標に基づくトレードシグナル

図1. アリゲーター指標に基づくトレードシグナル


トレードシグナルの詳細

このトレーディング戦略はCSignalAlligatorで実装されており、インジケーターの値へのアクセスを簡単にするためのいくつかの保護メソッドがあります。

double   Jaw(int ind)              // バーのジョーラインの値を返す
double   Teeth(int ind)           // バーのティースラインの値を返す
double   Lips(int ind)            // バーのリップスラインの値を返す
double   LipsTeethDiff(int ind)   // リップスとティースラインの差を返す
double   TeethJawDiff(int ind)    // ティースとジョーラインの差を返す
double   LipsJawDiff(int ind)     // リップスとジョーラインの差を返す
bool     CheckCross();           // アリゲーターラインのクロスオーバーをチェックするために使用

1. ロングポジションを開く

トレード条件のチェックには、リップス、ティース、ジョーラインのシフトによるいくつかの特徴があります。

ロングポジションを開く条件:

  • CheckCrossを使用してクロスオーバーとライン間の差の増加を確認する;
  • LipsTeethDiff(-2)>=LipsTeethDiff(-1)およびLipsTeethDiff(-1)>=LipsTeethDiff(0);リップスとティースラインの差の増加をチェック;
  • LipsTeethDiff(0)>=0.0;リップスラインがティースラインより高い;
  • TeethJawDiff(-2) >=TeethJawDiff(-1)およびTeethJawDiff(-1) >=TeethJawDiff(0);ティースとジョーラインの差の増加をチェック;
  • TeethJawDiff(0) >=0.0;ティースラインがジョーラインより高い。
//+------------------------------------------------------------------+
//| ロングポジションを開く条件をチェックします                             |
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(CheckCross()) return(false);
//---
   price=0.0;
   sl   =0.0;
   tp   =0.0;
//---
   if(LipsTeethDiff(-2)>=LipsTeethDiff(-1) && LipsTeethDiff(-1)>=LipsTeethDiff(0) && LipsTeethDiff(0)>=0.0 &&
      TeethJawDiff(-2) >=TeethJawDiff(-1)  && TeethJawDiff(-1) >=TeethJawDiff(0)  && TeethJawDiff(0) >=0.0)
      m_crossed=true;
//---
   return(m_crossed);
  }


2. ロングポジションを閉じる

ロングポジションを閉じる条件(ラインのシフトに注意):

  • LipsTeethDiff(-1)<0;次のバーのリップスラインはティースラインより低い;
  • LipsTeethDiff(0)>=0;現在のバーのリップスラインはティースライン以上;
  • LipsTeethDiff(1)>0;前のバーのリップスラインはティースラインより高い。
//+------------------------------------------------------------------+
//| ショートポジションを閉じる条件をチェックします                     |
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckCloseLong(double& price)
  {
   price=0.0;
//---
   return(LipsTeethDiff(-1)<0 && LipsTeethDiff(0)>=0 && LipsTeethDiff(1)>0);
  }


3. ショートポジションを開く

ショートポジションを開く条件:

  • CheckCrossを使用してクロスオーバーとライン間の差の増加を確認する;
  • LipsTeethDiff(-2)<=LipsTeethDiff(-1)およびLipsTeethDiff(-1)<=LipsTeethDiff(0);リップスとティースラインの差の増加をチェック;
  • LipsTeethDiff(0)<=0.0;現在のバーのリップスラインはティースラインより低い;
  • TeethJawDiff(-2)<=TeethJawDiff(-1)およびTeethJawDiff(-1)<=TeethJawDiff(0);ティースとジョーラインの差の増加をチェック;
  • TeethJawDiff(0) <=0.0;現在のバーのティースラインはジョーラインより低い;
//+------------------------------------------------------------------+
//| ショートポジションを開く条件をチェックします                     |
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(CheckCross()) return(false);
//---
   price=0.0;
   sl   =0.0;
   tp   =0.0;
//---
   if(LipsTeethDiff(-2)<=LipsTeethDiff(-1) && LipsTeethDiff(-1)<=LipsTeethDiff(0) && LipsTeethDiff(0)<=0.0 &&
      TeethJawDiff(-2) <=TeethJawDiff(-1)  && TeethJawDiff(-1) <=TeethJawDiff(0)  && TeethJawDiff(0) <=0.0)
      m_crossed=true;
//---
   return(m_crossed);
  }


4. ショートポジションを閉じる

ショートポジションを閉じる条件:

  • LipsTeethDiff(-1)>0;次のバーのリップスラインはティースラインより高い;
  • LipsTeethDiff(0)<=0;現在のバーのリップスラインはティースライン以下;
  • LipsTeethDiff(1)<0;前のバーのリップスラインはティースラインより低い。
//+------------------------------------------------------------------+

//| ショートポジションを閉じる条件をチェックします                     |
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckCloseShort(double& price)
  {
   price=0.0;
//---
   return(LipsTeethDiff(-1)>0 && LipsTeethDiff(0)<=0 && LipsTeethDiff(1)<0);
  }

MQL5ウィザードを使ったエキスパートアドバイザーの作成

この戦略に基づいたトレーディングロボットを作成するには、アリゲーターに基づくシグナルという信号プロパティを選択する必要があります。これはMQL5ウィザードの「既製エキスパートアドバイザーの作成」オプション内で行います:

図2. MQL5ウィザードで「アリゲーターに基づくシグナル」を選択

図2. MQL5ウィザードで「アリゲーターに基づくシグナル」を選択

次に、必要なトレーリングストップアルゴリズムと、資金管理とリスク管理システムを指定します。エキスパートアドバイザーのコードは自動的に生成され、コンパイルしてストラテジーテスターでテストできます。


テスト結果

エキスパートアドバイザーのバックテストを行いましょう(EURUSD H1、テスト期間:2010年1月1日〜2011年1月5日、JawPeriod=13、JawShift=8、TeethPeriod=8、TeethShift=5、LipsPeriod=5、LipsShift=3、MaMethod=2、Applied=5、CrossMeasure=5)。

エキスパートアドバイザーの作成では固定ボリューム(固定ロットでの取引、0.1)を使用し、トレーリングストップアルゴリズムは使用していません(トレーリングなし)。

図3. アリゲーター指標に基づくエキスパートアドバイザーのテスト結果

図3. アリゲーター指標に基づくエキスパートアドバイザーのテスト結果


取引フィルタを使用し、時間に応じた市場特性を考慮することで利益を増やすことができます。CSignalITFクラスを使用すると、日内時間フィルタを追加できます。最適な時間を見つけるには、MetaTrader 5のストラテジーテスターをご利用ください。詳細はMQL5ウィザード - 2つのEMAのクロスオーバーに基づくトレードシグナルと日内時間フィルタをご覧ください。


添付ファイル:SignalAlligator.mqhにはCSignalAlligatorクラスが含まれており、terminal_data_folder\MQL5\Include\Expert\Signalフォルダに配置する必要があります。

expert_alligator.mq5には、MQL5ウィザードを使用して作成されたエキスパートアドバイザーのコードが含まれています。


リスト
コメント 0