10のレンジトレーディング戦略の比較分析

Alexander Fedosov | 4 10月, 2018

目次

イントロダクション

トレンドフォロー戦略は、特に初心者に人気があり、使いやすいものです。 しかし、今日の相場はよりダイナミックであり、トレンドの挙動は(範囲と期間の面で) あいまいです。 レンジまたは横向きの相場でトレードしないことは、機会損失につながります。 トレンドフォローのトレードルールは簡単です: トレンドの兆候を識別し、活用するだけです。 レンジ期間のトレードはそれとはかなり異なります。 フラットな動きの間、価格は小さい範囲にあり、長い間変わらずにとどまるかもしれません。 相場に方向性のある動きはなく、流動性は低いでしょう。

レンジトレーディング戦略の作成時にタスクを定義する

前の記事では、トレンドを作成するために必要とされた3つのタスクを定義しました。 レンジトレーディング戦略の作成に必要なタスクは非常によく似ています。

図1. サイドウェイ/レンジな動きの例。

タスク1。 レンジ期間を識別します。

レンジの一般的かつ網羅的な定義はありません (実際にはトレンドの概念の適切な説明はありません). 但し、相場がレンジ状態にあることのある特定の徴候がある場合もあります。 上向きと下向きの両方の明確な垂直方向の動きがないため、この動きはまた、横向きと呼ばれます。 価格は、波の下と上の境界線に近づいて、範囲内で移動します。 レンジ期間のもう一つの兆候は、相場におけるトレードボリュームの少なさと相場参加者の興味のなさです。 価格のわずかな動きと同様、小さいティックのボリュームから見ることができます。

タスク2。 開始価格率のポジションのターゲット。

チャネルのトレードは、多くの場合、レンジトレーディングテクニックに関連して使用します。 これが、利益を得る目的のために横向きの相場を使用する主要なメソッドです。 レンジチャネルは、仮想境界で決定されます。 さらに、トレード戦略は、価格とチャネルの境界線との関係に基づいて構築されます。 ほとんどの場合、この戦略は、価格がチャネルの境界線から跳ね返るときに売買することを意味します (図2)。


図2. 価格がチャネルのボーダーを離れて跳ねるときのトレード

チャネルの上部で売る場合、価格が下のボーダーに向かって移動すると想定します。 それは、TP レベルとして機能します。 SLは、特定の数値としてポイントまたはチャネルの境界線に従って設定することができます。 カウンター戦略は、買いに使用します: 下のチャネルの境界線で買いし、上部の境界線の近くに TP レベルを設定します。

レンジトレーディング戦略

上記の原則を使用してレンジトレーディング戦略を選択します。

戦略 #1MFI ベースのフィルタを使用したエンベロープインジケータ

 チャネルの境界線は、エンベロープインジケータに基づいて決定されます。 MFI インジケータは、シグナルのフィルタリングにも使用します。

インジケータパラメータ 詳細
使用されるインジケータ エンベロープ
使用されるインジケータ MFI
時間枠 H1
買い条件 価格が、下のチャネルの境界線に達すると、MFI は売られ過ぎのゾーン (価格レート20以下) にある
売り条件 価格が上のチャネルのボーダーに達し、MFI が買われ過ぎのゾーンにある (80 の上で)
決済条件   価格が反対のチャネルのボーダーに達する

図3は、戦略 #1 による相場参入状況を示しています。

図3. レンジトレーディング戦略のエントリー条件 #1

以下は、この戦略をトレードするEAのコードです。

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;
      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(mfi[0]<20 && env_low[0]>close[0])
     {
      tp=env_high[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(mfi[0]>80 && env_high[0]<close[0])
     {
      tp=env_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,mfi)<=0  ||
          CopyBuffer(InpInd_Handle2,1,0,2,env_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,env_high)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

TP は設定条件に合わせて自動的に設定され、タイムフレームに応じて SL が手動で設定されます。

戦略 #2ボリンジャーバンドと2つの移動平均

チャネルの境界線はボリンジャーバンドを使用して決定され、シグナルは遅いMAと高速MAの相対的なポジションに基づいてフィルタリングされます。

インジケータパラメータ 詳細
使用されるインジケータ ボリンジャーバンド
使用されるインジケータ 移動平均
時間枠 H1
買い条件 価格は下のチャネルのボーダーに達し、速いMA が遅いMAの上にある
売り条件 価格は上のチャネルのボーダーに達し、速いMAが遅いMAの下にある
決済条件   価格が反対のチャネルのボーダーに達する

相場参入状況を図4に示します。 2つの SMA のデフォルトの期間は小さい: 4 と8です。 周期値と平滑化メソッドは調整可能であるため、ボリンジャーバンドシグナルのフィルタリング感度を変更することができます。

図4. レンジトレーディング戦略のエントリー条件 #2

相場参入の条件を除いて、戦略 #2 は戦略 #1 と非常によく似ています。 

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;
      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(ma_slow[0]>ma_fast[0] && bb_low[0]>close[0])
     {
      tp=bb_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(ma_slow[0]<ma_fast[0] && bb_up[0]<close[0])
     {
      tp=bb_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,1,0,2,bb_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,bb_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,ma_slow)<=0 ||
          CopyBuffer(InpInd_Handle3,0,0,2,ma_fast)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

戦略 #3。 WSO & WRO チャネルとフラクタル次元エーレルス

このメインシグナルインジケータは、WSO & WRO チャネルで、WSO (Widner サポートオシレーター) と WRO (Widner レジスタンスオシレーター) の2つのオシレーターに基づいたチャネルです。 このインジケータのアイデアは、Mel Widnerによる "自動化されたサポートとレジスタンス" に基づいています このシグナルをフィルターするために、John F. Ehlersおよび Ric Wayによる記事 「Fractal Dimension as a Market Mode Sensor」で記述されたフラクタル次元インジケータを使用します。 

インジケータパラメータ 詳細
使用されるインジケータ WSO & WRO チャネル
使用されるインジケータ フラクタル次元エーレルス
時間枠 指定なし
買い条件 価格が下のチャネルの境界線に達し、フラクタル次元値が閾値の下になる
売り条件 価格が上のチャネルの境界線に達し、フラクタル次元値が閾値の下になる
決済条件   価格が反対のチャネルのボーダーに達する

図5は、相場参入状況を示しています。 以前の戦略と同様に、トレードの操作は、価格がチャネルの境界線から跳ね返るときに実行されます。 このフィルタは、相場がトレンドになっていないときにエントリポイントを見つけるのに役立ちます。


図5. レンジトレーディング戦略のエントリー条件 #3

以下は、この戦略をトレードするEAのコードです。

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;
      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(wwc_low[0]>close[0] && fdi[0]<Inp_FdiThreshold)
     {
      tp=wwc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(wwc_up[0]<close[0] && fdi[0]<Inp_FdiThreshold)
     {
      tp=wwc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,3,0,2,wwc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,wwc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,fdi)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

戦略 #4 パーセンテージクロスオーバーチャネルインジケータと TrendRange ベースのフィルター

このケースでは、チャネルは一定の割合でレベルのブレイクアウトで構築されます。 チャネルを構築し、価格が境界線に触れる場所を探索するインジケータが必要です。 トレンドとレンジの両方の状態を示す TrendRange インジケータを使用します。 この状態は、フィルタシグナルに適用されます。

インジケータパラメータ 詳細
使用されるインジケータ パーセンテージクロスオーバーチャネル
使用されるインジケータ トレンドの範囲
時間枠 指定なし
買い条件 価格が下のチャネルのボーダーに達し、トレンドの範囲のヒストグラムが灰色である
売り条件 価格が上のチャネルの境界線に到達し、トレンド範囲のヒストグラムが灰色である
決済条件   価格が反対のチャネルのボーダーに達する

相場参入条件を図6に示します。 パーセンテージクロスオーバーインジケータには、特定の特徴があります。 パーセントパラメータは、新しいレベルの構築が開始され、パラメータが時間枠に依存している場合の限界距離です。 下のタイムフレームには、より小さなパーセントを設定する必要があります。 たとえば、時間枠の推奨値は 20 ~ 30 です。 高い値は、インジケータの過剰性に繋がります。

図6. レンジトレーディング戦略のエントリー条件 #4

戦略コードは、価格レートの下に表示されます。

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;
      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(pcc_low[0]>close[0] && tr_flat[0]>tr_range[0])
     {
      tp=pcc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(pcc_up[0]<close[0] && tr_flat[0]>tr_range[0])
     {
      tp=pcc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,pcc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,pcc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,1,0,2,tr_flat)<=0 ||
          CopyBuffer(InpInd_Handle2,2,0,2,tr_range)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

戦略 #5 価格チャネルインジケータと RBVI ベースのフィルター

価格チャネルインジケーターはチャネルを構築し、その上部と下部の境界線は期間の最高値と最低値によって決定されます。 ダマシシグナルは、相場でレンジ期間の存在を決定する RBVI によって除外されます。 

インジケータパラメータ 詳細
使用されるインジケータ 価格チャネル
使用されるインジケータ RBVI
時間枠 指定なし
買い条件 価格が下のチャネルの境界線に到達し、RBVI 値が閾値を下回っている。
売り条件 価格は上のチャネルのボーダーに達し、RBVI の値がしきい値より低い。
決済条件   価格が反対のチャネルのボーダーに達する

エントリー条件を図7に示します。 RBVI のしきい値は40です。 この値は、エキスパートアドバイザのパラメータで変更できます。

図7. レンジトレーディング戦略のエントリー条件 #5

戦略のコードです:

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;

      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(pc_low[0]>close[0] && rbvi[0]<=Inp_level)
     {
      tp=pc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(pc_up[0]<close[0] && rbvi[0]<=Inp_level)
     {
      tp=pc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,pc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,1,0,2,pc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,rbvi)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

戦略 #6 ウィリアムズパーセントレンジインジケータと ADX ベースのフィルター

買われ過ぎ/売られ過ぎの状態を決定するウィリアムズのパーセントレンジは、エントリポイントを見つけるために使用します。 我々の目的は、レンジ期間か、価格が一定の範囲に戻ることになっているときにトレードすることなので、方向性の動きの欠如を決定するためにトレンドインジケータ ADX を使用してみましょう。 

インジケータパラメータ 詳細
使用されるインジケータ ウィリアムズ% の範囲
使用されるインジケータ ADX
時間枠 指定なし
買い条件 WPR インジケータが売られ過ぎのゾーン (価格レート-80 以下) であり、ADX 値が閾値より下。
売り条件 WPR インジケータが買われ過ぎゾーン (-20) にあり、ADX 値が閾値より下。
決済条件   テイクプロフィット/ストップロス

図8でわかるように、ADX によるデフォルトのレンジエリアは30に設定されています。 この値は、エキスパートアドバイザコードでカスタマイズできます。

図8. レンジトレーディング戦略のエントリー条件 #6

戦略の実装は、以下の価格レートのリストで提供されています。 ここでInp_FlatLevel 変数を上記の ADX しきい値に設定します。

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;

      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(wpr[0]<-80 && adx[0]<Inp_FlatLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(wpr[0]>=-20 && adx[0]<Inp_FlatLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,wpr)<=0  ||
          CopyBuffer(InpInd_Handle2,0,0,2,adx)<=0)?false:true;
  }
//+------------------------------------------------------------------+

戦略 #7 修正ケルトナー チャネルとマジックトレンドベースのフィルタ

価格のケルトナーズチャネルから跳ね返りは、フラットゾーンを識別するマジックトレンドインジケータでチェックされます。

インジケータパラメータ 詳細
使用されるインジケータ 修正ケルトナー チャネル
使用されるインジケータ マジックトレンド
時間枠 指定なし
買い条件 価格が下のチャネルのボーダーに達し、マジックのトレンドラインが灰色である
売り条件 価格が上のチャネルのボーダーに達し、マジックのトレンドラインが灰色である
決済条件   価格が反対のチャネルのボーダーに達する

このトレーディング戦略は、図9で視覚化されています。 マジックトレンドの値は、レンジの間に変更されていません。すなわち、灰色の水平線として示されています。 したがって、価格がチャネルの境界線に達するのに加えて、レンジ状態でマジックトレンドの状態を確認する必要があります。 この確認は、現在の足と前の足を比較します。-(同じである必要があります。)

図9. レンジトレーディング戦略 #7 のエントリー条件。

このコードには、売買条件をチェックする機能があります。

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;

      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(kc_low[0]>close[0] && mt[0]==mt[1])
     {
      tp=kc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(kc_up[0]<close[0] && mt[0]==mt[1])
     {
      tp=kc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,kc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,kc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,mt)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

戦略 #8 トリニティインパルスによる確認と ドンチャン チャネル

このケースでは、トリニティインパルスインジケータが横向きの動きの状態にある間、価格が ドンチャン チャネルの境界線から跳ね返る瞬間をキャッチします。 

インジケータパラメータ 詳細
使用されるインジケータ ドンチャン チャネル
使用されるインジケータ トリニティインパルス
時間枠 小さい時間枠
買い条件 価格が下のチャネルの境界線に達し、トリニティインパルス値がゼロ
売り条件 価格が上のチャネルのボーダーに達し、トリニティインパルスがゼロ
決済条件   価格が反対のチャネルのボーダーに達する

エントリを図10に示します。 この戦略は、上のタイムフレームで使用するのは推奨されません。トリニティインパルスフィルタが、のこぎりの動作を示しているので、レンジゾーンの表示が遅れるためです。 その幅は非常に小さく、戦略も選択的になります。 5 ~ 30 分の時間枠が最適です。

図10. レンジトレーディング戦略 #8 のエントリー条件。

上記の戦略に基づくEAの実装:

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;
         
      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(dc_low[0]>close[0] && ti[0]==0)
     {
      tp=dc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(dc_up[0]<close[0] && ti[0]==0)
     {
      tp=dc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,dc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,1,0,2,dc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,ti)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

戦略 #9 ATR チャネルインジケータと CCI カラーレベルに基づくフィルタ

ATR チャネルは、移動平均からのATR偏差に基づいています。 CCI カラーレベルは、価格の動きを示すしきい値のヒストグラムとして表示されるCCIインジケータです。 このインジケータを使用して、チャネルのフラットな状態 (CCI がしきい値の間にある場合) をフィルター処理します。

インジケータパラメータ 詳細
使用されるインジケータ ATR チャネル
使用されるインジケータ CCI カラーレベル
時間枠 指定なし
買い条件 価格が下のチャネルの境界線に到達し、CCI カラーレベルの値が閾値の間の範囲にある。
売り条件 価格が上のチャネルの境界線に到達し、CCI カラーレベルの値が閾値の間の範囲にある
決済条件   価格が反対のチャネルのボーダーに達する

図11に相場参入を示します。 場合によっては、価格がチャネルを出ることがありますが、指定された範囲の CCI ベースのフィルタは、価格がチャネルに戻り、TP 値に到達する可能性があることを示唆しています。


図11. レンジトレーディング戦略 #9 のエントリー条件。

この戦略のEAのコード:

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;

      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(atr_low[0]>close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN)
     {
      tp=atr_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(atr_up[0]<close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN)
     {
      tp=atr_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,1,0,2,atr_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,atr_low)<=0 || 
          CopyBuffer(InpInd_Handle2,2,0,2,cci)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

戦略 #10 RSI ヒストグラムとレンジインジケータに基づいたフィルタ

ヒストグラムの RSI は、買われ過ぎ/売られ過ぎのゾーンでシグナルが生成されるので、良い可視化になります。 レンジは、偽のシグナルを除外するために使用します。 

インジケータパラメータ 詳細
使用されるインジケータ RSI_Histogram
使用されるインジケータ フラット
時間枠 指定なし
買い条件 RSIが売られ過ぎのゾーン (下の価格レートのしきい値) であり、レンジがレンジゾーンにあります。
売り条件 RSIが買われ過ぎゾーン (しきい値の上) にあり、レンジはレンジゾーンにある。
決済条件   テイクプロフィット/ストップロス

エントリポイントを図12に示します。 RSI のヒストグラムフォームは、買われ過ぎ/売られ過ぎのゾーンとレンジフィルタのレンジゾーンの追跡します。

図12. レンジトレーディング戦略 #10 のエントリー条件。

上記の戦略に基づいて、EAの実装は、次のコードで利用可能です。

void OnTick()
  {
//--- Checking orders previously opened by the EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //計算のためのデータの取得
      if(!GetIndValue())
         return;

      //--- Opening an order if there is a buy signal
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);

      //--- Opening an order if there is a sell signal
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Buy conditions                                                   |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(rsi[0]<Inp_LowLevel && fl[0]<Inp_FLowLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Sell conditions                                                  |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(rsi[0]>Inp_HighLevel && fl[0]<Inp_FLowLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Getting the current values of indicators                         |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,rsi)<=0  ||
          CopyBuffer(InpInd_Handle2,0,0,2,fl)<=0)?false:true;
  }
//+------------------------------------------------------------------+

テスト

ここで、10個のレンジトレーディング戦略を定義し、コードに実装することで、一般的なテスト条件を選択してみましょう。

戦略 #1 テスト (MFI ベースのフィルタを使用したエンベロープインジケータ)

プリセット:

input int                  Inp_StopLoss=500;                            //SL (ポイント)

//---MFI インジケータパラメータ
input ENUM_APPLIED_VOLUME  Inp_applied_volume=VOLUME_TICK;              //MFI ボリュームタイプ
input int                  Inp_MFI_period=10;                           //MFI の期間
//---エンベロープインジケータパラメータ
input int                  Inp_ma_period=10;                            //エンベロープ MA 期間
input ENUM_MA_METHOD       Inp_ma_method=MODE_SMA;                      //エンベロープスムージングタイプ
input double               Inp_deviation=0.1;                           //エンベロープからのボーダーの偏差 MA

テスト結果:

図13. レンジ戦略 #1。 テスト結果。

戦略 #2 テスト (ボリンジャーバンドと2つの移動平均)

プリセット:

input int                  Inp_StopLoss=450;                            //SL (ポイント)

//---ボリンジャーバンドパラメータ
input int                  Inp_BBPeriod=14;                             //BB の期間
input double               Inp_deviation=2.0;                           //偏差
//---MA スロー価格レートパラメータ
input int                  Inp_ma_period1=12;                           //MA スロー価格レート期間
input ENUM_MA_METHOD       Inp_ma_method1=MODE_SMMA;                    //MA スロー価格レートスムージング方式
//---MA 高速パラメータ
input int                  Inp_ma_period2=2;                            //MA の速い期間
input ENUM_MA_METHOD       Inp_ma_method2=MODE_LWMA;                    //MA 高速平滑化法

テスト結果:

図14. レンジ戦略 #2。 テスト結果。

ストラテジー #3 テスト (フラクタル次元エーレルスに基づくフィルタを用いた WSO & WRO チャネル)

プリセット:

input int                  Inp_StopLoss=500;                            //SL (ポイント)

//---WSO & WRO チャネルパラメータ
input int                  Inp_WsoWroPeriod=16;                         //Wso ・ Wro チャネル期間
//---フラクタル次元エーレルスパラメータ
input int                  Inp_FdiPeriod    =  18;                      //フラクタル次元周期
input double               Inp_FdiThreshold =  1.4;                     //フラクタル次元のしきい値
input ENUM_APPLIED_PRICE   Inp_Price        = PRICE_closing price rate;              //適用価格

テスト結果:

図15. レンジ戦略 #3。 テスト結果。

戦略 #4 テスト (パーセンテージクロスオーバーチャネルインジケータと TrendRange ベースのフィルター)

プリセット:

input int                  Inp_StopLoss=500;                            //SL (ポイント)

//--- Percentage_Crossover_Channel parameters
input double               Inp_Percent=26.0;                            //限界距離の割合
input ENUM_APPLIED_PRICE   Inp_Price=PRICE_closing price rate;                       //適用価格
//---トレンド範囲インジケータパラメータ
input uint                 Inp_PeriodTR    =  14;                       //トレンド範囲の期間
input ENUM_MA_METHOD       Inp_Method      =  MODE_EMA;                 //平滑化法
input double               Inp_Deviation   =  1.0;                      //偏差

テスト結果:

図16. レンジ戦略 #4。 テスト結果。

戦略 #5 テスト (価格チャネルインジケータと RBVI ベースフィルター)

プリセット:

input int                  Inp_StopLoss=450;                            //SL (ポイント)

//---価格チャネルインジケータパラメータ
input int                  Inp_ChannelPeriod=12;                        //期間
//---RBVI インジケータパラメータ
input int                  Inp_RBVIPeriod=5;                            //RBVI 期間
input ENUM_APPLIED_VOLUME  Inp_VolumeType=VOLUME_TICK;                  //ボリューム
input double               Inp_level=40;                                //フラットレベル

テスト結果:

図17. レンジ戦略 #5。 テスト結果。

戦略 #6 テスト (ウィリアムズパーセントレンジインジケータと ADX ベースのフィルター)

プリセット:

input int                  Inp_StopLoss=50;                             //SL (ポイント)
input int                  Inp_TakeProfit=50;                           //TP (ポイント)

//---WPR インジケータパラメータ
input int                  Inp_WPRPeriod=10;                            //WPR 期間
//---ADX インジケータパラメータ
input int                  Inp_ADXPeriod=14;                            //ADX の期間
input int                  Inp_FlatLevel=40;                            //ADX のレンジレベル

テスト結果:

図18. レンジ戦略 #6。 テスト結果。

戦略 #7 テスト (修正 ケルトナー チャネルとマジックトレンドベースのフィルタ)

プリセット:

input int                     Inp_SmoothCenter      =  11;              //中心線を滑らかにする期間の数
input int                     Inp_SmoothDeviation   =  12;              //偏差を滑らかにする期間の数
input double                  Inp_F                 =  1.0;             //偏差を適用するために使用される係数
input ENUM_APPLIED_PRICE      Inp_AppliedPrice      =  PRICE_closing price rate;     //中央線適用価格:
input ENUM_MA_METHOD          Inp_MethodSmoothing   =  MODE_SMA;        //中心線平滑化法
input ENUM_METHOD_VARIATION   Inp_MethodVariation   =  METHOD_HL;       //バリエーションメソッド
//---マジックトレンドインジケータパラメータ
input uint                    Inp_PeriodCCI   =  60;                    //CCI の期間
input uint                    Inp_PeriodATR   =  5;                     //ATR期間

テスト結果:

図19. レンジ戦略 #7。 テスト結果。

戦略 #8 テスト (トリニティインパルスによる確認と ドンチャン チャネル)

プリセット:

input int                  Inp_StopLoss=500;                            //SL (ポイント)

//--- Donchian channel parameters
input int                  Inp_ChannelPeriod=12;                        //ドンチャン 期間
//---トリニティインパルスインジケータパラメータ
input int                  Inp_Period= 5;                               //インジケータ期間
input int                  Inp_Level= 34;                               //スムージングレベル
input ENUM_MA_METHOD       Inp_Type=MODE_LWMA;                          //平均タイプ
input ENUM_APPLIED_PRICE   Inp_Price=PRICE_WEIGHTED;                    //価格
input ENUM_APPLIED_VOLUME  Inp_Volume=VOLUME_TICK;                      //ボリュームの種類

テスト結果:

図20. レンジ戦略 #8。 テスト結果。

戦略 #9 テスト (ATR チャネルインジケータと CCI カラーレベルに基づくフィルタ)

プリセット:

//--- ATR Channel parameters
input ENUM_MA_METHOD       Inp_MA_Method=MODE_SMA;                      //MA 平滑化法
input uint                 Inp_MA_Period=10;                            //MA 期間
input uint                 Inp_ATR_Period=12;                           //ATR 時代
input double               Inp_Factor=1.5;                              //偏差の数
input ENUM_APPLIED_PRICE   Inp_IPC=PRICE_low price rate;                           //適用価格
input int                  Inp_Shift=0;                                 //足のインジケータの水平方向のシフト
//---CCI カラーレベルパラメータ
input int                  Inp_CCI_ma_period = 14;                      //平均期間
input double               Inp_CCI_LevelUP   = 90;                      //レベルアップ
input double               Inp_CCI_LevelDOWN =-90;                      //レベルダウン

テスト結果:

図21. レンジ戦略 #9。 テスト結果。

戦略 #10 テスト (RSI ヒストグラムとレンジインジケータに基づくフィルタ)

プリセット:

//---RSI ヒストグラムパラメータ
input uint                 Inp_RSIPeriod=12;                            //インジケータ期間
input ENUM_APPLIED_PRICE   Inp_RSIPrice=PRICE_closing price rate;                    //価格
input uint                 Inp_high price rateLevel=60;                            //買われ過ぎレベル
input uint                 Inp_low price rateLevel=40;                             //売られ過ぎのレベル
input int                  Inp_Shift=0;                                 //足のインジケータの水平方向のシフト
//---レンジインジケータパラメータ
input uint                 Inp_Smooth=10;                               //スムージング期間
input ENUM_MA_METHOD       Inp_ma_method=MODE_SMA;                      //スムージングタイプ
input ENUM_APPLIED_PRICE   Inp_applied_price=PRICE_closing price rate;               //価格タイプ
input uint                 Inp_HLRef=100;
input int                  Inp_FShift=0;                                //足のインジケータの水平方向のシフト
input uint                 Inp_Extrahigh price rateLevel=70;                       //最大トレンドレベル
input uint                 Inp_Fhigh price rateLevel=50;                           //強いトレンドレベル
input uint                 Inp_Flow price rateLevel=30;                            //弱いトレンドレベル

テスト結果:

図22. レンジ戦略 #10。 テスト結果。

判明したこと

分析した戦略のテスト及び最適化は下記の結果をもたらしました。

したがって、主な結論を導くことができます。異なるチャネル生成方法を使ってトレード及びフィルタを行っても、利点も欠点も同じようなものになる。 

結論

下記は、今回使用したEAの名前と要約です。補助クラスやインジケータもあります。 添付されたアーカイブは、適切にフォルダに配置する必要があります。 これを行うには、 ターミナルフォルダのMQL5フォルダに保存するだけです。

この記事で使用されたプログラム:

#
 名前
種類
詳細
1
Strategy_1.mq5
EA
 戦略 #1。 MFI ベースのフィルタを使用したエンベロープインジケータ
2
Strategy_2.MQL5
EA
 戦略 #2。 ボリンジャーバンドと2つの移動平均
3
Strategy_3.mq5
EA  戦略 #3。 フラクタル次元エーレルスに基づくフィルタを用いた WSO & WRO チャネル
4
Strategy_4.mq5
EA
 戦略 #4 パーセンテージクロスオーバーチャネルインジケータと TrendRange ベースのフィルター 
5
Strategy_5.mq5 EA  戦略 #5 価格チャネルインジケータと RBVI ベースのフィルター
6
Strategy_6.mq5
EA
 戦略 #6 ウィリアムズパーセントレンジインジケータと ADX ベースのフィルター
7 Strategy_7.mq5 
EA
 戦略 #7 修正ケルトナー チャネルとマジックトレンドベースのフィルタ
 8 Strategy_8.mq5 EA  戦略 #8 トリニティインパルスによる確認と ドンチャン チャネル
 9 Strategy_9.mq5 EA  戦略 #9 ATR チャネルインジケータと CCI カラーレベルに基づくフィルタ
 10 Strategy_10.mq5 EA  戦略 #10 RSI ヒストグラムとレンジインジケータに基づいたフィルタ 
 11 Trade.mqh Library  トレード関数のクラス
 13 wwc.mq5 インジケータ  戦略 #3 で使用
 14 fdi.mq5 インジケータ  戦略 #3 で使用
 15 pcc.mq5 インジケータ  戦略 #4 で使用
 16 trend_range.mq5  インジケータ  戦略 #4 で使用
 17 price_channel.mq5 インジケータ  戦略 #5 で使用
 18 rbvi.mq5 インジケータ  戦略 #5 で使用
 19 customizable _keltner.mq5 インジケータ  戦略 #7 で使用
 20 magic_trend.mq5 インジケータ  戦略 #7 で使用
 21 donchian_channel.mq5 インジケータ  戦略 #8 で使用
 22 trinity_impulse.mq5 インジケータ  戦略 #8 で使用
 23 atr_channel.mq5 インジケータ   戦略 #9 で使用
 24 cci_color_levels.mq5 インジケータ  戦略 #9 で使用
 25 rsi_histogram.mq5 インジケータ  戦略 #10 で使用
 26 flat.mq5 インジケータ  戦略 #10 で使用