1. テストメソッド1トレンドとレンジ戦略の組み合わせ

29 10月 2018, 07:51
Dmitriy Gizlyk
0
101

コンテンツ

イントロダクション

トレード戦略には多くのものがあります。 トレードのために、ある戦略はトレンドを探し、またある戦略はレンジ価格変動の範囲を定義します。 相場はボラティリティです。 トレンドの後には常にレンジが続きます。 今回はトレンドフォローとレンジでトレードすることによる両方の利益を模索します。 2つのグループのいずれかが利益を作るとき、もう片方は負けるか待機しています。

この2つのアプローチを組み合わせて収益性を高めることは可能でしょうか。 2つの戦略は、お互いに補完できるでしょうか。 一見異なるトレーディングモデルを組み合わせて、そのような組み合わせの結果を見てみましょう。

1. 原則を組み合わせた戦略

価格チャートは、トレンドの変化を絶えず発生させます。 強い価格の動きは狭い範囲でのヨコヨコから発生します。 トレーダーは、現在の相場状況に基づいて戦略を選択します。 しかし、どうすればどちらの選択が良いか、その戦略を決定することができるでしょうか? ...トレンドか、それともレンジか。 

チャート

記事 [1] と記事 [2]では、 さまざまなトレンドおよびレンジトレードの作戦を考慮しています。 特定の戦略を適用することは、相場の状況を評価することから始まります。 両方の戦略タイプは、相場の状態を決定するために異なるトレンドインジケータを使用します。 しかし、トレンド戦略はトレンド下で相場に参入する反面、レンジ戦略はポジションを取ってから相場が静かになるのを期待しています。 したがって、1つのEAに2種類の戦略を組み合わせる場合の最初のアプローチは、次のとおりです。トレンドがある場合は、トレンドフォローのアルゴリズムを使います。トレンドがない場合は、レンジのアルゴリズムを使います。

価格チャートのより詳細な検査をすれば、トレンドかレンジがたびたび発生することがわかります。 すべての動きは価格変動を伴っています。 レンジな動きの場合には価格変化が少なくなり、トレンドの場合にはそれ以前の価格を凌駕します。 この特徴は、トレンドとレンジの戦略を組み合わせる場合に使用できます。 このアイデアは、エントリポイントがレンジトレーディングで使用するオシレーターによって確認する必要がありますが、トレンドに従うことです。 このアプローチはドローダウンを減らし、好ましい方向に価格が変わるような潜在的な瞬間をつかまえる助けとなるでしょう。

2. EAの開発

戦略の組み合わせにおける原則を示すために、記事 [1] と戦略 6の記事 [2] から戦略 1を選択します。 両方の選択された戦略は、トレンドを決定する ADX インジケータを使用します。 EAの最適化は、01.01.2017 から8.01.2018 までの期間に予め行われました。 次のパラメータは、戦略の最適化結果に基づいて選択されました。

トレンド戦略 1.

トレンド戦略のパラメータ

レンジ戦略 6.

レンジ戦略パラメータ

最適化されたパラメータを持つ単一のEAのトレード結果は、スクリーンショットにあります。

トレンド戦略 1.

トレンド戦略のテスト結果トレンド戦略のテスト結果

レンジ戦略 6.

レンジ戦略テスト結果レンジ戦略テスト結果

両方に適用されたEAは、シグナルが表示された時点でオープンポジションがない場合に取得されたオープンオーダーに基づいています。 ポジションは、あらかじめ定義された TP および SL の値に従って閉じられます。

このアプローチにより、ポジショントラッキングモジュールを、EAロジックを大幅に簡略化したポジションから除外することができます。 EAを組み合わせる場合、EA のロジックを変更するのではなく、組み合わせるメソッドがどのように結果に影響するかを示すために、EAの操作ロジックを意図的にそのまま残します。

2.1. メソッド1

最初のメソッドでは、両方の戦略のシグナルを順次チェックし、いずれかが表示されたときにポジションを開きます。 各戦略は、独自のインジケータパラメータだけでなく、SL と TP のレベルを備えています。 このアプローチでは、1つの戦略に応じたオープンポジションがある場合、別の戦略によるオープンポジションを止めます。 したがって、常にリスクを制限し、1つ以上のポジションは持ちません。

このアプローチの不利な点は別の戦略に従って開いたポジションが相場にあるとき、他の作戦で得られたかもしれない機会損失があることです。 しかし、このアプローチでは、適用される戦略はこの欠点の影響は最小限にする必要があり、異なる相場でトレードする必要があります。

このメソッドを実装するには、両方のEAのコードを1つのファイルにコピーし、同一の関数を1つのコードにまとめます。 名前の重複を避けるため、トレンドフォロー戦略の変数と関数に ' Trend' を追加し、レンジ戦略の変数と関数に ' Flat ' を加えます。

//---共通パラメータ
input double               Inp_Lot=0.01;                          //Lot
input MarginMode           Inp_MMode=LOT;                         //MM
input int                  Inp_MagicNum=1111;                     //マジックナンバー
input int                  Inp_Deviation = 2;                     //偏差(ポイント)
//---
input string               Trend_EaComment="Trend Strategy";      //戦略コメント
input int                  Trend_StopLoss=25;                     //SL (ポイント)
input int                  Trend_TakeProfit=90;                   //TP (ポイント)
//---RSI_Color インジケータパラメータ
input int                  Trend_RSIPeriod=28;                    //RSI の期間
input double               Trend_買われ過ぎ=70;                   //買われ過ぎ ゾーン
input double               Trend_売られ過ぎ=30;                  //売られ過ぎ ゾーン
//---ADX_Cloud インジケータパラメータ
input int                  Trend_ADXPeriod=11;                    //ADX 期間
input double               Trend_alpha1 = 0.25;                   //alpha1、
input double               Trend_alpha2 = 0.25;                   //alpha2
//---
input string               Flat_EaComment="Flat Strategy";        //戦略コメント
input int                  Flat_StopLoss=50;                      //SL (ポイント)
input int                  Flat_TakeProfit=50;                    //TP (ポイント)
//---WPR インジケータパラメータ
input int                  Flat_WPRPeriod=7;                      //期間 WPR
//---ADX インジケータパラメータ
input int                  Flat_ADXPeriod=11;                     //期間 ADX
input int                  Flat_FlatLevel=40;                     //レンジレベル ADX

OnTick関数の開始時に、オープンポジションの有無を確認します。 オープンポジションがない場合は、インジケータデータを更新し、トレンドおよびレンジ戦略のエントリシグナルを順次チェックします。 いずれかのシグナルが表示された場合、対応する戦略に従ってポジションをオープンします。

void OnTick()
  {
//---EAが以前に開いたオーダーのチェック
   if(!Trade.IsOpenedBySymbol(_Symbol,Inp_MagicNum))
     {
      //---計算のデータの取得
      if(!GetIndValue())
         return;
      //---トレンドアルゴリズムによるオープンオーダー
      //--- 買いシグナルでオープンオーダー
      if(TrendBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Inp_MagicNum,Trend_EaComment);
      else
      //---売りシグナルでオープンオーダー
      if(TrendSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Inp_MagicNum,Trend_EaComment);
      else
      //---レンジアルゴリズムによるオープンオーダー
      //--- 買いシグナルでオープンオーダー
      if(FlatBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Inp_MagicNum,Flat_EaComment);
      else
      //---売りシグナルでオープンオーダー
      if(FlatSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Inp_MagicNum,Flat_EaComment);
     }
  }

EAのコード全体は、添付ファイル (Combination1 プロジェクト) にあります。

2.2. メソッド2

2番目のメソッドは、結合のプロセスを少し複雑にし、最初のメソッドに加えて、2つの戦略のシグナルの特定のかたまりが作成されます。

提供されたトレンド戦略の例では、ADX クラウドインジケータを使用してトレンドを定義します。 このインジケータはDI+とDI-ラインの差を示し、トレンドの強さはチェックされません。 同時に、レンジ戦略は、ポジションを開く前に ADX しきい値を使用してトレンドの強さをチェックします。 そこで、トレンドの強みを加味したトレンド戦略に従って、追加のフィルターを導入することができます。

bool TrendBuySignal()
  {
   return(trend_adx[0]>trend_adx[1] && trend_RSI1[0]==1 && trend_RSI1[1]==1 &&  flat_adx[0]>=Flat_FlatLevel)?true:false;
  }

トレンド戦略では、情報は RSI インジケータによってソートされ、したがって、RSI シグナルに対してオープニングポジションを除外することにより、レンジ戦略に続く損失取引数を減らすことができます。

bool FlatBuySignal()
  {
   return(flat_wpr[0]<-80 && flat_adx[0]<Flat_FlatLevel && trend_rsi2[0]!=1)?true:false;
  }

EAのコード全体は、添付ファイル (Combination2 プロジェクト) にあります。

2.3. メソッド3

第3のメソッドは、ヘッジアカウントに適用可能であり、単一のEAで独立して2つの戦略を使用することで構成されます。 特定のマジックナンバーは、それぞれの戦略のオーダーに割り当てられます。 ポジションは、別の戦略のポジションがあるかどうかにかかわらず、受信シグナルに対して開かれます。

このアプローチは、このようなアプローチの長所と短所をすべて維持しながら、同じアカウントで2つのEAを正確にシミュレーションします。 特に、同時に異なる戦略に従って2つのポジションを開くことにより、リスクが増大します。

//---共通パラメータ
input double               Inp_Lot=0.01;                             //ロット
input MarginMode           Inp_MMode=LOT;                            //MM
input int                  Inp_Deviation = 2;                        //偏差 (ポイント)
//---
input string               Trend_EaComment="Trend Strategy";         //戦略コメント
input int                  Trend_StopLoss=25;                        //SL (ポイント)
input int                  Trend_TakeProfit=90;                      //TP (ポイント)
input int                  Trend_MagicNum=1111;                      //マジックナンバー
//---RSI_Colorインジケータパラメータ
input int                  Trend_RSIPeriod=28;                       //RSI の期間
input double               Trend_買われ過ぎ=70;                      //買われ過ぎ ゾーン
input double               Trend_売られ過ぎ=30;                     //売られ過ぎ ゾーン
//---ADX_Cloud インジケータパラメータ
input int                  Trend_ADXPeriod=11;                       //ADX 期間
input double               Trend_alpha1 = 0.25;                      //alpha1、
input double               Trend_alpha2 = 0.25;                      //alpha2
//---
input string               Flat_EaComment="Flat Strategy";           //戦略コメント
input int                  Flat_StopLoss=50;                         //SL (ポイント)
input int                  Flat_TakeProfit=50;                       //TP (ポイント)
input int                  Flat_MagicNum=1112;                       //マジックナンバー
//---WPR インジケータパラメータ
input int                  Flat_WPRPeriod=7;                         //期間 WPR
//---ADX インジケータパラメータ
input int                  Flat_ADXPeriod=11;                        //期間 ADX
input int                  Flat_FlatLevel=40;                        //レンジレベル ADX

OnTick 関数では、トレンドマジックナンバーとレンジマジックナンバーを別々に持つものを持つポジションをチェックします。

void OnTick()
  {
//---EAが以前に開いたトレンド戦略のオーダーを確認する
   if(!Trade.IsOpenedBySymbol(_Symbol,Trend_MagicNum))
     {
      //---計算のデータの取得
      if(!GetIndValue())
         return;
      //--- 買いシグナルでオープンオーダー
      if(TrendBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Trend_MagicNum,Trend_EaComment);
      else
      //---売りシグナルでオープンオーダー
      if(TrendSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Trend_StopLoss,Trend_TakeProfit,Trend_MagicNum,Trend_EaComment);
     }
//---以前にEAが開いたレンジ戦略オーダーを確認する
   if(!Trade.IsOpenedBySymbol(_Symbol,Flat_MagicNum))
     {
      //---計算のデータの取得
      if(!GetIndValue())
         return;
      //--- 買いシグナルでオープンオーダー
      if(FlatBuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Flat_MagicNum,Flat_EaComment);
      else
      //---売りシグナルでオープンオーダー
      if(FlatSellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Flat_StopLoss,Flat_TakeProfit,Flat_MagicNum,Flat_EaComment);
     }
  }

EAのコード全体は、添付ファイル (Combination3 プロジェクト) にあります。

3. EAのテスト

異なる戦略を組み合わせたメソッドによる3つのEAを準備した後、それぞれのEAをテストし、結果を比較します。 結果の比較については、EAのパラメータを変更することなくテストを実施します。

3.1. テストメソッド1

最初のテストは利益を示します。 総利益とリカバリーファクターは、元のEAのいずれかよりも高くなることが判明しました。 レンジ戦略と比較して、バランスラインはさらに、取引数が増加し、バランスと資金の面で最大ドローダウンが減少しているがわかります。 同時に、プロフィットファクターはわずかに減少し、総利益はまだ初期戦略の総利益よりも少ないです。

メソッド1テスト結果メソッド1テスト結果

3.2. テストメソッド2

トレード数は同じですが、第2のメソッドはメソッド1と比較して総利益を増加させます。しかし、総利益は最初のEAの総利益よりまだ低いです。 代わりに、 利益の成長は、リカバリファクターとプロフィットファクタを増加させます (後者はレンジ戦略に等しくなる)。 同時に、最大ドローダウンが減少します。

メソッド2のテスト結果メソッド2のテスト結果

3.3. テストメソッド3

3番目のメソッドを適用すると、最初のEAの総利益のレベルまでの総利益を増やすことができます。 利益の増加は、取引数の増加によります。 同時に、デポジットロードと最大ドローダウンは増加します。

メソッド3のテスト結果メソッド3のテスト結果

4. 戦略の最適化

前のセクションで実行したEAのテストでは、EA内での戦略を組み合わせることの利点を示しました。 すべての3つのメソッドは、元の戦略のいずれと比較しても利益の増加を示しています。 しかし、元の戦略は、テストされた時間間隔に最適化されたことを忘れてはなりません。同じ初期パラメータは、複合EAのテストに使用した。

しかし、すべてのEAのロジックには、そのパラメータの追加調整が必要です。 戦略を組み合わせた最初の2つのメソッドを最適化し、結果を参照してみましょう。

EAを開発する最終目的はヒストリ上のデータでデモンストレーションすることはでなく、実際の相場で稼ぐことであることを心にとめておいてください。 したがって、テスト期間を2つのセクションに分けることをお勧めします。 以前は、1.01.2017 から8.01.2018 までの期間のテストを実施しました。 ここで、1.01.2017 から6.01.2018 までの時間間隔を最適化し、残りのインターバルについてフォワードテストを行います。

最適化期間

4.1. メソッド1の最適化

最適化パラメータを選択する際には、各EAに2つの戦略のブロックが含まれていることに注意してください。 この場合、各戦略はエントリに2つのインジケータを使用します。 しかし、両方の戦略は、トレンドとその方向性の強さを決定するために ADX を使用することを忘れないようにしましょう。 したがって、EAのロジックは、エントリポイントを定義するための3つのインジケータを適用します。 3つのインジケータの期間を最適化することをお勧めします。

ADX インジケータ期間の最適化は、12から14までのインジケータ期間で、他のパラメータの変更に対する最大利益と堅牢性を示します。 以下のチャートは、最適化された時間間隔で ADX と RSI の期間の変更とEAの利益の相関関係を示します。

実施されたフォワードテストは、インジケータ値の指定された範囲内で利益を得る可能性を確認できます。 最大の安定性は、ADX 期間が13のときに観察されます。 その代わりに、最適化とフォワードテストの結果の類似性は、非最適化された時間間隔でEAの堅牢性を証明しました。

ADX フォワードテスト

WPR 期間の最適化も、同様の結果を示します。 最適化されたインターバルの最大EAロバスト性は、インジケータ期間が7に等しいときに現れます。 同時に、ADX インジケータ期間の成長とともに、3 ~ 5 の範囲で利益を得ることも可能です。 以下のチャートは、最適化された時間間隔での WPR との変化とEAの利益の相関関係を示します。

WPR の最適化

フォワードテストは、指定されたゾーンを確認します。 同時に、利益は WPR インジケータ期間の3-4 の範囲で成長しています。 WPR が7に等しい場合、EAの収益性は低下し、ADX インジケータの値は増加します。 テスト時間の間隔が短く、その特異性が原因である可能性があります。

WPR フォワードテスト

RSI インジケータの期間の最適化は、上記のすべてを確認します。 最適化された時間間隔において、27 ~ 32 の範囲は、収益性と変更に対する堅牢性において最も顕著です。 以下のチャートは、最適化された時間間隔で RSI と ADX 期間の変更とEAの利益の相関関係を示します。

RSI の最適化

フォワードテスト中に、RSI の期間の収益性の範囲は30-32 に絞られました。

RSIフォワードテスト

TP および SL の値を最適化しようとすると、EAの収益性が向上せず、以前に選択したパラメータが良いことが確認されました。

最適化の結果によると、最も最適なパラメータは、ADX 期間は13で、RSIは30、 WPR期間は7です。 これらのパラメータを使用すると、このEAは、最適化された場合は202.33ドルの利益、フォワード1では46.10ドル、他のパラメータではそのままになりました。 この収益性は、上記のテスト期間におけるメソッド3に従ってEAを組み合わせた場合に得られるものを上回っています。 EAの同様のパラメータは、メソッド3によると、それぞれ166.29 ドルと60.27 ドルとさらに悪い結果をもたらします: 。

メソッド1の最適化メソッド1の最適化メソッド1の最適化

フォワードテストの最適化結果の確認は、非最適化された時間間隔でEAの堅牢性を証明します。

4.2. メソッド2の最適化

EAの最適化は、メソッド2によると、以前の最適化に似ている結果をもたらした結合興味深いものです。 トレーディングシステムの堅牢性を示すことがあります。 前のセクションと同様のインジケータ期間が、最適化の結果として選択されました。 他のものが対等であることで、メソッド2のEAは、取引の数の減少による低い収益性を示しました。 最適化チャートを以下に示します。

メソッド2. ADX 最適化メソッド2. ADX フォワードテストメソッド2. WPR の最適化メソッド2. WPR フォワードテストメソッド2. RSI の最適化メソッド2. RSIフォワードテスト

同時に、トレンド戦略のシグナルの品質を向上させることで、SL と TP レベルを最適化することができます。 最適化の結果、トレンド戦略の SL は25から20ポイントに減少し、TP は90から110ポイントに増加します。 これより、EAのタスクの収益性を高めることができます。 SL と TP レベルの最適化のチャートは、以下に提供されています。

メソッド2. SL の最適化メソッド2. SL フォワードテストメソッド2. TP の最適化メソッド2. TP フォワードテスト

最適化の結果に基づくと、EAの収益性はメソッド2に従って組み合わせたとき、3つの選択肢のうち最高の結果になります。 この最適化中に得られたパラメータを適用すると、他のEAでは結果が悪化します。 最適化されたEAのテストのスクリーンショットは以下のとおりです。

メソッド2の最適化

結論

この記事では、1つの EAに2つの戦略を組み合わせる3つのメソッドを提案し、EAに設置する方法を示し、その最適化後のパラメータを変更せずにEAをテストしました。

次の表は、すべての戦略をテストした結果をまとめたものです。 複合EAの最適化は、2つの別個の EAの使用に比べて高い収益性を示しました。

今回のEAでは、提案されたメソッドの異なる組み合わせを使用して、または独自のメソッドを追加することで、2つ以上の戦略を自由に組み合わせることができます。 メソッドのどれが最も良いかはっきりと断言することは不可能です。 それぞれのケースで、トレーダーは戦略を組み合わせるためのメソッドを選択し、戦略自体とその操作ロジックを考慮するときに創造的でなければなりません。

パラメータ トレンド
ストラテジ
フラット
ストラテジ
メソッド1 メソッド2 メソッド3 Method 1 opt.
Back/For 
Method 2 opt.
Back/For 
総利益 51.56 158.96 160.52 166.12 210.40  202.33/46.10  206.40/43, 10
利益率 2.39 1.25 1.24 1.25 1.31  1.25/1.58  1.25/1.54
リカバリーファクター 3.65 3.55 3.73 3.86 4.90 4.08/1.94  4.17/1.82
最大バランスドローダウン 8.49 41.30 36.41 35.67 39.23 44.98/19.75  44.98/19.75
最大エクイティドローダウン 14.14 44.76 43.04 43.04 42.96 49.53/23.72  49.53/23.72
トレード件数 24 290 295 295 315
 371/41  373/40
収益性の高いトレードのシェア 41.67% 55.52% 53.22% 53.90% 54.29% 53.64/60.98  53.62/60

References

  1. 10のトレンド戦略の比較分析
  2. 10のレンジトレーディング戦略の比較分析
  3. トレンドはいつまでつづく?

記事で使用するプログラム

#
 名前
タイプ 
詳細 
1  Trade.mqh  クラスライブラリ  トレーディング・オペレーションのクラス
2  Combination1.mq5  EA  メソッド1に従って戦略を組み合わせたEA
3  Combination2.mq5  EA  メソッド2に従って戦略を組み合わせたEA
4  Combination3.mq5  EA  メソッド3に従って戦略を組み合わせたEA

MetaQuotes Software Corp.によりロシア語から翻訳された
元の記事: https://www.mql5.com/ru/articles/5022

添付されたファイル |
MQL5.zip (180.6 KB)
データ配列間の相関を解析するためのCGraphicに基づくPairPlot グラフ (時系列) データ配列間の相関を解析するためのCGraphicに基づくPairPlot グラフ (時系列)

テクニカル分析に複数の時系列を比較することは、適切なツールを必要としますが一般的なタスクです。 この記事では、グラフィカル解析のツールを開発し、2つ以上の時系列間の相関関係を検出します。

デルタインジケータの例によるボリュームコントロールを特徴とする株式インジケータの開発 デルタインジケータの例によるボリュームコントロールを特徴とする株式インジケータの開発

この記事では、CopyTicks() および CopyTicksRange() 関数を使用して、実際のボリュームに基づいた株価インジケータを開発するアルゴリズムを扱います。 このようなインジケータの開発については、リアルタイムでの操作とストラテジーテスターにおける細かい側面も説明されています。

エルダーレイ (ブルパワーとベアパワー) エルダーレイ (ブルパワーとベアパワー)

この記事は、ブルパワー、ベアパワー、移動平均インジケータ (EMA-指数平均)に基づいたエルダーレイトレーディングシステムを扱います。 このシステムは、アレキサンダーエルダーの著書"Trading for a Living"に記述されています。

リバーシング: 聖杯や危険な妄想? リバーシング: 聖杯や危険な妄想?

この記事では、リバーシングマーチンゲール技術を研究し、トレード戦略を向上させることができるかどうかということはもちろん、使用する価値があるかどうかを判断します。 ヒストリカルデータを操作し、リバーシングテクニックに最適なインジケータを確認するEAを作成します。 また、独立したトレードシステムとしてのインジケータなしで使用できるかどうかもチェックします。 また、リバーシングが、負けトレードから勝ちトレードに変えられるかを確かめます。