English
preview
MQL5における市場ポジショニング戦略の体系(第2回): Nvidia向けマルチパターンのビット単位学習

MQL5における市場ポジショニング戦略の体系(第2回): Nvidia向けマルチパターンのビット単位学習

MetaTrader 5テスター |
15 0
Stephen Njuki
Stephen Njuki

はじめに

前回の市場ポジショニングのパイロット記事では、Nvidia Corp (NVDA)の株を対象に、広範なテストの後にライブ環境で単一ポジション戦略が通用するかどうかを検証しました。テスト期間は、NVDAの株式分割の影響で制約を受けました。そのため、まず直近2年間の狭い期間で学習をおこない、その後1年間のフォワードウォークテストを実施しました。どちらの期間も、NVDAの最近2回の株式分割の間に位置しています。これらの株式分割は、ストラテジーテスターで無視すると大きな誤差を生じますが、多くのブローカー(MetaTraderを提供するものも含む)では、トレーダーのポジションを分割前の高値で一旦クローズし、新価格で増量したポジションを再オープンすることで、ポジションの利益に影響を与えずに処理されます。本記事では、RSIとDeMarkerオシレーターの組み合わせに基づくPattern_5~Pattern_9の分析を続けます。


Pattern_5:スロープ収束とレンジ拡張

この6番目のシグナルは、RSIとDeMarkerのスロープ指標と高値-安値レンジの拡張を組み合わせることで、市場の動きに「高い確信度」があることを捉えます。これは通常、トレーダーの活動増加とボラティリティ上昇を示唆します。買い条件は、RSIの3バーにわたる傾きが正であり、DeMarkerも同様に3バーにわたって正の状態を示す場合に成立します。さらに、現在の価格バー(最新完了バーをインデックス1として扱う)のレンジが、過去の最適化された距離にあるバーよりも大きいことが条件となります。加えて、現在の終値がバーのレンジ上位25%に位置するとき、買い圧力があることを示すシグナルとなります。チャート上では次のように表されます。

RSI slope(3) > 0、DeMarker slope(3) > 0、かつ現在バーのレンジ(高値-安値)がaverage(range,10)の1.2倍以上(レンジ拡張)であり、価格はバーの上位25%でクローズすること。

p5

捕捉として、買い専用のアプローチを採るため、売りの条件も同様にRSIとDeMarkerの傾きが3バーにわたって負であり、現在の高値-安値レンジが過去バーのレンジより拡大している場合に成立します。この過去バーの基準は調整可能で最適化可能であり、最適化パラメータの数を減らすために使用する平均期間と一致させています。もちろん読者は自由に調整できますが、ここでの考え方はカーブフィッティングに注意することです。さらに、現在の終値がバーのレンジ下位25%に位置することが、売り圧力の存在を確認する条件となります。これをMQL5で次のように実装します。

//+------------------------------------------------------------------+
//| Check for Pattern 5.                                             |
//6) Slope Confluence with Volume/Range Expansion
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker_SL::IsPattern_5(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(Hi(X() + m_past + 1) - Lo(X() + m_past + 1) < Hi(X() + 1) - Lo(X() + 1)  &&
             RSI(X()) - RSI(X() + 3) > 0.0 &&
             DeMarker(X()) - DeMarker(X() + 3) > 0.0);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(Hi(X() + m_past + 1) - Lo(X() + m_past + 1) < Hi(X() + 1) - Lo(X() + 1)  &&
             RSI(X()) - RSI(X() + 3) < 0.0 &&
             DeMarker(X()) - DeMarker(X() + 3) < 0.0);
   }
   return(false);
}

Pattern_5は、傾きが同時に加速しているバーをフィルタリングしつつ、レンジ拡張による強い価格変動も記録するよう設計されています。2つのオシレーターが方向性で一致することを要求することで、ボリューム感のあるレンジ拡張を検証し、単なる一時的なスパイクではなく確信度の高い動きを捉えることができます。フォワードテスト(2023.06.01~2024.06.01、15分足)では、以下のレポートが得られました。

r5

フォワードテストの報告によると、Pattern_5は、傾きの収束とボリューム拡張に基づいたもので、タイトだが控えめなパフォーマンスを示しています。初期証拠金10,000USDから、純利益2,251USDを計上することができました。損失は記録されず、42件のポジションが開かれ、すべてロング方向でした(複数のシグナルパターンを同時にテストするテストプロトコルに従っています)。プロフィットファクターは無限大で、期待ペイオフは53.6、最大利益は173.76でした。固定ロットではなく固定マージンでのテストであったため、これらの数値は必ずしも同じ意味を持つわけではありませんが、それでも注目すべき指標です。エクイティのドローダウンは1%未満で、バランスのドローダウンは存在しません。リカバリーファクターは2.5、シャープレシオは6.32であり、LR相関が1.00であることからも、エントリーロジックがNVDAの主要トレンドと完全に一致していることが示唆されます。

概念的な観点から見ると、RSIとDeMarkerの傾きの整合性とレンジ拡張は、圧縮後の強気方向の急騰に引き続き反応します。しかし、このフォワードウォークでは選択的にシグナルが発生しているように見えます。損失が発生していないことから、Pattern_5における主なリスクは、取引中のエクイティ低下や将来の偽レンジ拡張の発生にあると考えられます。テスト期間中は、2回の主要な株式分割間の強気相場であったためこれらは発生しませんでした。そのため、明示的なボラティリティチェック、より厳格なストップロジック、あるいはボラティリティに応じた保守的なポジションサイズの導入などは、Pattern_5をさらに改善するための追加措置として採用可能です。


Pattern_6:先行価格と遅行指標

7番目のシグナルであるPattern_6は、価格が先行して明確なインパルスブレイクを示す一方で、RSIとDeMarkerが遅行しており、まだ勢いが失われていないケースを見つけてプルバックでエントリーする戦略です。チャート上では次のようになります。

価格がインパルス的に上昇(高値更新)した後に21期間EMAまでプルバックし、RSIが45以上、DeMarkerが0.45以上(指標の急落なし)の状態で、RSIの傾きが正に転じた時点でエントリーします。

p6

買い条件は、価格がインパルス的に上昇して高値を更新した後、重要なサポートレベル(本記事では期間最適化済みの指数移動平均EMA)までプルバックしたときに成立します。このEMAは主要な動的サポートを示しており、RSIが45を上回り、DeMarkerが0.45を上回っていれば、勢いが大きく失われていないことを意味します。RSIの傾きが正に転じた時点(勢いの回復を示唆)でロングエントリーをおこないます。これをMQL5で次のように実装します。

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//7) Price Leading, Indicator Lagging (confirm pullback entries)
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker_SL::IsPattern_6(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(High(X() + 2) < High(X() + 1) && High(X() + 1) > High(X()) && Close(X()) <= Cl(X()) &&
             RSI(X()) > 45.0 &&
             DeMarker(X()) > 0.45);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(Low(X() + 2) > Low(X() + 1) && Low(X() + 1) < Low(X()) && Close(X()) >= Cl(X()) &&
             RSI(X()) < 55.0 &&
             DeMarker(X()) < 0.55);
   }
   return(false);
}

売り条件は逆で、価格がインパルス的に下落して新安値を記録した後、動的なレジスタンスレベルまでリトレースしたときに成立します。このレジスタンスは動的であり、買い条件と同様に、最適化可能な期間のEMAで表されます。RSIは55未満で、DeMarkerは0.55未満であることが条件です。これは弱いながらもちらつく弱気モメンタムのサインです。RSI傾きが負に転じたときにエントリーをおこなうことで、弱気のフォローが実際に進行していることを確認できます。このシグナルのフォワードテスト(2021.08.01~2023.06.01の学習後)の結果は以下の通りです。

r6

このシグナルパターンは、先行価格と遅行指標に基づいており、初期証拠金10,000USDに対して2,532USDの利益を生み出しました。この過程で合計26ポジションが開かれ、すべて利益でクローズしています。期待ペイオフは97、シャープレシオは5.32、LR相関は完全な1.0でした。さらに注目すべきは、ブローカー提供のティックデータでテストした際、最大エクイティドローダウンがほぼゼロであったことです。プルバック確認型のエントリーによって、秩序あるトレンド継続を捉えることができました。

概念的には、このパターンは「価格のモメンタムが先行し、指標はその動きがまだ有効で失われていないことを確認する」ことに依拠しています。最大の単一利益は195USDで、損失はありません。これは、このフォワードウォーク期間がパターンを試す上で比較的穏やかな期間であったことを示しており、「無敵である」という意味ではなく、たまたま好条件の期間でテストできたことを示しています。26連勝という結果は紙上では印象的ですが、弱気相場や上下に振れる環境でのパフォーマンスを示すものではありません。トレーリングストップすら使用していないことから、追加のストップシステムは不可欠です。これらの修正は、MQL5ウィザードのダイアログボックスで容易に設定可能です。動的なエグジットルールやボラティリティ対応ストップの必要性は、MQL5ウィザードの事前構築済みカスタムモジュールで示されている通りであり、強気のNVDA相場よりも厳しい環境で生き残ろうとする場合には、確実に考慮すべき事項です。


Pattern_7:指標の不一致

8番目のシグナル、Pattern_7は、DeMarkerオシレーターとRSIオシレーターの特殊なミスマッチを活用し、早期エントリーシグナルを捉えます。DeMarkerにおけるM/W形成と、RSIのニュートラル50レベルに対する相対位置を確認します。チャート上でのイメージは以下の通りです。

DeMarkerがWを形成(2つの上昇する谷)し、RSIが50未満で上向き(RSIスロープ(2)>0)です。最後の小スイングハイを上回るクローズでエントリーします。

p7

買い条件は、DeMarkerがW字型を形成し、2つの底(U字のトラフ)が切り上がっている、または後の底が前の底と同等以上であること、かつRSIが50未満(50レベルの下)に位置し、直近2本の価格バーにわたって正の傾きを示していることで発動します。価格が最後の小スイングハイを上回った時点でエントリーし、強気のシナリオを確認します。これをMQL5で次のように実装します。

//+------------------------------------------------------------------+
//| Check for Pattern 7.                                             |
//8) Indicator Mismatch (one leading, one confirming)
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker_SL::IsPattern_7(ENUM_POSITION_TYPE T)
{  vector _demarker;
   _demarker.Init(fmax(5, m_past));
   for(int i = 0; i < fmax(5, m_past); i++)
   {  _demarker[i] = DeMarker(i);
   }
   if(T == POSITION_TYPE_BUY)
   {  return(IsW(_demarker) &&
             RSI(X()) - RSI(X() + 2) > 0.0 &&
             Close(X()) >= High(X() + 1));
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(IsM(_demarker) &&
             RSI(X()) - RSI(X() + 2) < 0.0 &&
             Close(X()) <= Low(X() + 1));
   }
   return(false);
}

売り条件は、今回DeMarkerがMを形成し(2つの下降する山で構成され、後者は前のものと同等かそれ以下であり、RSIは50を超えているが傾斜が負である)になったときに登録されます。価格が直近の小さなスイングローを下抜けた時点でエントリーが可能です。上記のソースでは、常に少なくとも5以上となるルックバックウィンドウ内でDeMarkerのローカル極値を特定し、さらにプライスアクションの裏付けを確認する前にオシレーターのスロープも検証しています。Pattern_7のフォワードテストは、次のレポートの通りです。

r7

8番目のシグナルパターンは、1万ドルの初期資金を52回の取引で2,570ドル増加させるという、明確な収益プロファイルを示しました。今回も、そしておそらく驚くことではありませんが、このインジケーターのミスマッチというアイデアを用いることで、100%の勝率を達成することができました。シャープレシオは8.17で、これまでに検証した他の2つのパターンを上回り、LR相関も0.99とほぼ完璧な値でした。つまり、エントリーはNVDAの価格推移を適切に追随し、不必要な逆行を回避できていることを示しています。最大エクイティドローダウンは9%で、決して小さくはありませんが、管理可能な範囲であり、ブレイクアウト継続型の市場レジームにおいては、より安定したエクイティカーブの推移を示唆しています。Pattern_7はRSIとDeMarkerの確認シグナルに依存しており、タイミングを同期させることで、レンジ相場のノイズを回避しながら、市場の継続的な動きを一貫して捉えることに成功しています。 

コンセプトとしては、このパターンはDeMarkerを主要トレンドの強弱を示す先行シグナルとして活用し、RSIをより遅行的なモメンタムフィルターとして機能させることを狙っています。テスト結果から見ると、この組み合わせは綱引きのような対立関係ではなく、制御されたバトンタッチのように機能しています。最大の勝ちトレードは600ドルを超え、平均利益もそれに近い水準でした。損失が一度も発生しなかったため、大きな勝ちトレードがエクイティカーブの落ち込みを補う必要もなく、リカバリーファクターについて言及する必要もありませんでした。ややボラティリティが高いながらも概ね強気の環境下で52勝を記録しており、他のパターン同様、この期間外での再テストをおこなわなければ、より確かな結論を導くことは難しいことを示唆しています。この先行・遅行の相互作用は非常に有望ですが、想定される得意な市場環境の外でもテストをおこない、さらなる改良を加えることが適切でしょう。その際には、前述のボラティリティフィルタやストップロス管理手法を補助的に組み合わせることも検討できます。



Pattern_8:シーケンシャルスロープラダー

最後から2番目のパターンでは、RSIのスロープを短期、中期、長期の複数期間で確認する多時間軸スロープチェック戦略を採用し、モメンタムフィルタを積み重ねることで予測の信頼性向上を狙います。これに、現在のDeMarkerのスロープをトレンド確認として組み合わせます。買いシグナルのチャート上の条件は以下の通りです。

RSIのスロープ(1)>0、スロープ(3)>0、スロープ(5)>0(ショート→ロングにわたる単調な正のスロープ)かつDeMarkerのスロープ(1)>0。

p8

このロジックでは、1本、3本、5本の各バーにおけるRSIがすべて正の傾きを示し、さらにDeMarkerの傾きも正である場合に買い条件が成立します。これは、時間軸が拡大するにつれて単調に上昇する「傾きのはしご(ラダー)」を描くことを意味し、上昇モメンタムの存在を示唆するものです。これをMQL5で次のように実装します。

//+------------------------------------------------------------------+
//| Check for Pattern 8.                                             |
//9) Sequential Slope Ladder (multi-period confirmation)
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker_SL::IsPattern_8(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(RSI(X()) - RSI(X() + 1) > 0.0 &&
             RSI(X()) - RSI(X() + 3) > 0.0 &&
             RSI(X()) - RSI(X() + 5) > 0.0 &&
             DeMarker(X()) - DeMarker(X() + 1) > 0.0);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(RSI(X()) - RSI(X() + 1) < 0.0 &&
             RSI(X()) - RSI(X() + 3) < 0.0 &&
             RSI(X()) - RSI(X() + 5) < 0.0 &&
             DeMarker(X()) - DeMarker(X() + 1) < 0.0);
   }
   return(false);
}

反対側の売り条件では、RSIが1本、3本、5本すべてで負の傾きを示し、DeMarkerも現在負の傾き領域にある必要があります。本シグナルは、プライスアクションをまったく考慮しない最初のパターンであり、それ自体がリスクを内包していると言えるでしょう。2021年8月1日から2023年6月1日までを学習期間とし、2023年6月1日から2024年6月1日までフォワードテストをおこなった結果、以下のレポートが得られました。

r8

Pattern_8は、RSIとDeMarkerの傾きを積み重ねてモメンタムを捉えるシーケンシャルスロープラダー戦略であり、NVDAの強気相場の中でロング専用で運用した結果、再び良好なパフォーマンスを示しました。1万ドルの初期資金に対して2,094ドルの純利益を計上し、1取引あたりの利益は54.6ドルとなりました。合計53ポジションを保有し、すべてが利益確定で終了したため、プロフィットファクターは無限大(表示上はNaN)となり、表示上のゼロはプレースホルダーにすぎません。エクイティドローダウンは8.8%、絶対額で約900ドル強でした。初期資金1万ドルを基準とすれば、これらの数値はリスク許容範囲内に収まっており、取引中のノイズにも耐えられる余地を残しています。

さらに分析すると、純粋なモメンタムベースのエントリーは、53回すべてが勝利という100%の勝率から見ても、非常に正確かつ継続的である可能性が示唆されます。しかし、このパフォーマンスは慢心を招く危険もあります。他のパターン同様、実際に損失が発生した場合にどれほど大きくなるのか、あるいはタイミングの悪い数回の反転によって積み上げた利益の大部分が失われる可能性があるのかについては、十分に把握できていません。平均利益が49~55ドル程度であることからも、Pattern_8の優位性は一発大勝ではなく、反復による積み重ねに基づいていることが分かります。

したがって、Pattern_5~Pattern_7で推奨した対策は本パターンにも引き続き適用されます。明確なストップロスの設定とボラティリティフィルタは不可欠です。また、プライスアクションによる確認を追加することで、NVDAの市場レジームがこのスロープラダー戦略を報いてくれなくなった場合でも、不可避のドローダウンがエクイティカーブを破壊することを防ぎ、次の機会に備えて市場に留まり続けることができるでしょう。


Pattern_9:フェイクブレイク検出

RSIとDeMarkerオシレーターを用いてNVDAをロングする最後のシグナルパターンは、プライスアクションの失敗とRSIおよびDeMarkerの「非確認」を組み合わせることで、フェイクブレイクやトラップを検出しようとするものです。理論上は、リスクリワード比に優れた非対称なエントリー機会を示すことを目的としています。チャート上では、以下のように表現されます。

価格が一時的にサポートを下抜けて終値がその下で確定しますが、3本以内に再びサポートを回復(終値が再び上回る)し、かつRSIが直近バーより上昇している場合です。さらにDeMarkerが上昇傾きを示しています。→ ベアトラップと解釈し、回復時にロングエントリーします。

p9

ロングエントリーの条件は、まず価格が重要なサポート水準を終値ベースで下抜けることです。その後、3本以内に価格がその下落を打ち消し、再びサポートの上で終値を付ける必要があります。この際、RSIが価格下落を裏付ける新安値を形成していない(=モメンタムの弱化を確認していない)こと、さらにDeMarkerが上昇傾きを示していることが条件となります。これらは買い圧力の存在を補強する証拠となります。価格がサポート上でクローズし、次の足もその上で始まるタイミングで買いエントリーをおこないます。MQL5での実装は以下の通りです。

//+------------------------------------------------------------------+
//| Check for Pattern 9.                                             |
//10) False Break / Trap Detection (price action deviation)
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker_SL::IsPattern_9(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(Close(X() + 2) < Cl(X() + 2) && Close(X() + 1) < Cl(X() + 1) && Close(X()) >= Cl(X()) &&
             RSI(X()) - RSI(X() + 1) > 0.0 &&
             DeMarker(X()) - DeMarker(X() + 1) > 0.0);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(Close(X() + 2) > Cl(X() + 2) && Close(X() + 1) > Cl(X() + 1) && Close(X()) <= Cl(X()) &&
             RSI(X()) - RSI(X() + 1) < 0.0 &&
             DeMarker(X()) - DeMarker(X() + 1) < 0.0);
   }
   return(false);
}

売りシグナルはこれと対称的です。価格がレジスタンスを上抜け、終値もその上で確定した後、3本以内に再び下落してレジスタンスの下で終値を付けるケースです。この際、RSIが新高値を付けずにブレイクを確認しないこと、さらにDeMarkerが下降傾きを示していることが条件となります。価格がレジスタンスの下でクローズし、次の足もその下で始まった時点でショートエントリーをおこないます。Pattern_9のストラテジーテスターでのフォワードテスト結果は以下の通りです。

r9

この最終シグナルパターンは、改良されたフェイクトラップ検出ロジックを用い、37回のトレードで初期資金1万ドルを1,300ドル増加させるという、より抑制されたパフォーマンスを示しました。導入部で述べた通り、すべてロングポジションで運用し、今回も全勝という結果になりました。損失が存在しないため、表示上のプロフィットファクターは0となっていますが、これは無限大を示す名目上の値にすぎません。期待値は他のパターンと比較すると小さく、平均利益は控えめでしたが、シャープレシオ14.19という数値は、このパターンの優位性が効率的かつ堅牢であることを示しています。エクイティドローダウンはNVDAのボラティリティ水準から見ればほぼ無視できるレベルで、2.6%(絶対額で277ドル)でした。これは、他のシグナルパターンや前回の記事で見られた40~50%近いドローダウンとは大きく異なります。1:100のレバレッジを使用しても、多くのトレーダーが「生き残れる」と判断する範囲内に収まっていると言えるでしょう。

この結果、方向性の正確さだけでなく、トレンドへの参加方法においてもより慎重なシグナルパターンに到達したことになります。37連勝という結果はやや出来すぎにも見えますが、平均利益36ドル、最大利益85ドルという控えめな数値は、エクイティカーブが一攫千金的な期待を示唆していないことを裏付けています。これは「一攫千金」ではなく「積み上げ」です。ただし、使用するレバレッジについては重要な検討事項です。主要な法域ではレバレッジ制限が課される可能性があり、それによりリターンは低下する一方で、リスクプロファイルは改善されます。NVDAの強気相場であっても、順行、逆行ともに激しい値動きが存在するため、実運用ではポジションサイズ管理を徹底し、テスト期間だけが唯一の将来像であると想定しないことが重要です。さらに、前述の各パターンで提案したリスク管理策を併用することが望まれます。


最大10個の選択によるマルチパターン運用

今回はロング条件のみを実装しています。これは、過去にロングとショートの両方を組み合わせたマルチパターン検証をおこなった際よりも、フォワードテストでより良い結果が得られるかどうかを検証するためです。もちろん、今回分析しているNVDAの強気相場に大きく依存しているため、条件は大幅にロング寄りに偏っています。また、同社が実施した株式分割の影響も考慮し、検証期間を制限しています。ロングおよびショート条件のMQL5コードは以下の通りです。

//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//+------------------------------------------------------------------+
int CSignalRSI_DeMarker::LongCondition(void)
{  PatternsUsed(GetDualMap(m_dual_map));
   int result  = 0, results = 0;
//--- if the model 0 is used
   if(((m_patterns_usage & 0x01) != 0) && IsPattern_0(POSITION_TYPE_BUY))
   {  result += m_pattern_0;
      results++;
   }
//--- if the model 1 is used
   if(((m_patterns_usage & 0x02) != 0) && IsPattern_1(POSITION_TYPE_BUY))
   {  result += m_pattern_1;
      results++;
   }
//--- if the model 2 is used
   if(((m_patterns_usage & 0x04) != 0) && IsPattern_2(POSITION_TYPE_BUY))
   {  result += m_pattern_2;
      results++;
   }
//--- if the model 3 is used
   if(((m_patterns_usage & 0x08) != 0) && IsPattern_3(POSITION_TYPE_BUY))
   {  result += m_pattern_3;
      results++;
   }
//--- if the model 4 is used
   if(((m_patterns_usage & 0x10) != 0) && IsPattern_4(POSITION_TYPE_BUY))
   {  result += m_pattern_4;
      results++;
   }
//--- if the model 5 is used
   if(((m_patterns_usage & 0x20) != 0) && IsPattern_5(POSITION_TYPE_BUY))
   {  result += m_pattern_5;
      results++;
   }
//--- if the model 6 is used
   if(((m_patterns_usage & 0x40) != 0) && IsPattern_6(POSITION_TYPE_BUY))
   {  result += m_pattern_6;
      results++;
   }
//--- if the model 7 is used
   if(((m_patterns_usage & 0x80) != 0) && IsPattern_7(POSITION_TYPE_BUY))
   {  result += m_pattern_7;
      results++;
   }
//--- if the model 8 is used
   if(((m_patterns_usage & 0x100) != 0) && IsPattern_8(POSITION_TYPE_BUY))
   {  result += m_pattern_8;
      results++;
   }
//--- if the model 9 is used
   if(((m_patterns_usage & 0x200) != 0) && IsPattern_9(POSITION_TYPE_BUY))
   {  result += m_pattern_9;
      results++;
   }
//--- return the result
//if(result > 0)printf(__FUNCSIG__+" result is: %i",result);
   if(results > 0 && result > 0)
   {  return(int(round(result / results)));
   }
   return(0);
}
//+------------------------------------------------------------------+
//| "Voting" that price will fall.                                   |
//+------------------------------------------------------------------+
int CSignalRSI_DeMarker::ShortCondition(void)
{  return(0);
}

これまでの記事と同様、コードは本質的に「重み付き投票システム」です。MQL5ウィザードで構築された取引システムにおいて、買い方向への確信度を数値化します。10個のシグナルパターン(RSIとDeMarkerの組み合わせから派生)は、それぞれ独立して強気条件を評価します。通常、IsPattern_0()からIsPattern_9()までが用意され、ダイバージェンス、同期モメンタム変化、M/W構造など、異なるテクニカル特徴を評価します。LongCondition()関数は、選択されたすべてのパターンの判定を統合し、それらの集合的な「強気票」の重み付き平均スコアを出力します。

使用するパターンは整数変数m_patterns_usageによって制御されます。この変数を2進数(0と1)で表したときの各「ビット」が、10個の独立したシグナルパターンのいずれか1つに対応します。たとえば、この変数に1を代入するとパターン0のみが有効になります。一方、2、4、8、16、…、512を代入すると、それぞれインデックス1から9のパターンが個別に有効化されます。これは排他的に単一パターンを使用する場合の動作です。複数パターンを組み合わせる場合には、通常0から1023の範囲で異なる整数値を割り当てます。10個のパターンがあるため、2の10乗である1024未満、すなわち1023までを上限としています。

PatternsUsed()関数は入力値に基づいてm_patterns_usageに値を設定し、ビットマスクの解釈はLongCondition()関数内でおこなわれます。RSIとDeMarkerについては、単一パターンの場合と同様に、2021年8月1日から2023年6月1日の期間で最適なパターンの組み合わせを最適化(学習)し、その後2023年6月1日から2024年6月1日の期間でフォワードテストを実施しました。結果は以下のとおりです。

r-all

上記のテストレポートは、使用パターンの入力値を605に設定してエキスパートアドバイザー(EA)を実行したものです。これはPattern_0、Pattern_2、Pattern_3、Pattern_4、Pattern_6、Pattern_9を使用していることに対応します。このフォワードウォークは堅牢であるように見えます。初期資金1万ドルから、2,309ドルの純利益を得ることができました。正直なところ、利用可能な10個のシグナルパターンを考えると、やや控えめな結果です。特に、本稿および前回の記事で示したように、単一パターンでもより高いリターンを達成できていたことを踏まえると、その印象は否めません。取引回数は40回で、すべて利益となりました。リカバリーファクターは2.95、シャープレシオは6.99であり、ボラティリティに対して健全なリターンが得られています。

リスクも比較的抑えられており、最大エクイティドローダウンは7.61%(703ドル)でした。モデリング品質も99%と良好な水準です。

総じて、このフォワードウォークは一応の概念実証として成立していると言えます。本記事の冒頭では、複数パターンを同一方向で運用する検証を目的として、ロングポジションのみに限定しました。これまでの記事では、EAに複数パターンを組み込むことの問題点について述べてきました。最適化段階では良好な結果が得られても、それはロングとショートが互いに相殺する形でカーブフィットしているに過ぎず、フォワードテストでは再現されないことが多いためです。

今回は40回すべてが勝ちトレードであり、バランスのドローダウンもほぼ見られませんでした。この点から、複数パターンを使用する場合は、一方向のポジションに限定する方が有効である可能性が示唆されます。しかしながら、複数パターンを用いる本来の目的は、単一パターンを上回る「相乗効果」によってより大きなリターンを得ることでした。その基本的な目標については、今回の結果は明確に達成できていません。より広い期間での検証や、ストップ管理、提案してきたボラティリティフィルターの導入を行わない限り、すでに30%超のリターンを示している単一の優秀なシグナルパターンを用いた方が、より賢明な戦略であると主張することもできるでしょう。


結論

前回の記事から本記事にかけて、NVDAに対して10種類のシグナルパターンを検証してきましたが、総括すると、多くのトレーダーが内心では感じていながらも明言しないであろう共通テーマが浮かび上がります。それは、市場は精度を報いる一方で、過信を厳しく罰するということです。いくつかのシグナルパターンモデルは確かに良好な成果を示しましたが、慢性的な問題は利益と損失の非対称性の弱さでした。たとえば、Pattern_5のレンジ拡大や傾きのコンフルエンスは見事なモメンタム捕捉を示しましたが、その代償として大きなドローダウンを伴い、多くのトレーダーがポジションを疑いかねない状況を生みました。Pattern_6では、先行する価格と遅行指標を組み合わせるという手法を採用し、一定のドローダウンに抑えつつ効率的な結果を示しましたが、それでも長期的なボラティリティ局面を乗り切るためには、より厳格なストップ設定が必要でした。 

これら初期のシグナルパターンとは対照的に、パターン8では「シーケンシャルスロープラダー」に依拠しましたが、シグナルロジックを価格構造から切り離すことの危険性が明らかになりました。モメンタムのみの手法は、方向性バイアスの影響によりフォワードテストで崩れました。勝率が高くても、損失が無制限であれば、積み上げた利益が一掃される可能性があることを示しています。

しかし真のハイライトは、やはりマルチパターン構成でしょう。直前でおこなった最終テストでは、最大10個のパターンを重み付きビットマスクによって投票させました。最適化で得られた最良のビットマスクは883で、Pattern_0、Pattern_1、Pattern_4、Pattern_6、Pattern_9を使用する構成でした。この組み合わせは、プロフィットファクター3.0、シャープレシオ20超、最大エクイティドローダウン19%未満という成績を示しました。しかも、初期資金を2.5倍に増加させるという、非常に攻撃的なパフォーマンスを達成しています。レバレッジは1:100を使用しましたが、仮に1:50に抑えたとしても、理論上は年間75%程度のリターンが見込める可能性があります。ここでの大きな示唆は、パターンの多様性が個々のパターン固有の弱点を補完するという点です。別の言い方をすれば、複数パターンのアンサンブルは、確認シグナル、反転、レンジ拡大といった異なる要素を統合し、単一の意思決定層に融合させる機械学習モデルのように振る舞ったとも言えます。

とはいえ、取引に「ただ飯」はありません。今回のフォワード結果は有望に見えるものの、テスト期間はNVDAの株式分割日程に制約されており、非常に強気な相場局面と重なっていました。ロングのみでストップを設定していたとはいえ、テスト期間全体が強気相場であったことは否定できません。では、弱気相場ではどうなるのでしょうか。カーブへの適合をそのままモデルの堅牢性とみなすことには常に危険が潜んでいます。マルチパターンを含むこれらすべての戦略は、異なるボラティリティ環境で再検証されるべきでしょう。また、レジーム外テストでは、約定遅延、スプレッドの変化、そしてレバレッジ感応度も考慮すべきです。というのも、今回の検証では1:100のレバレッジを前提としましたが、多くのトレーダーは1:50を超えるレバレッジを利用できないからです。

名前 説明
EMC-1.mq5 ヘッダに参照を含む、ウィザードで組み立てられたEA
SignalEMC-1.mq5 MQL5ウィザードで使用されるEAのシグナルクラスファイル


MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20045

添付されたファイル |
EMC-1.mq5 (8.42 KB)
SignalEMC-1.mqh (50.56 KB)
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
MQL5における二変量コピュラ(第2回):MQL5でのアルキメデスコピュラの実装 MQL5における二変量コピュラ(第2回):MQL5でのアルキメデスコピュラの実装
連載第2回では、二変量アルキメデスコピュラの特性と、それらをMQL5で実装する方法について解説します。また、コピュラを活用したシンプルなペアトレード戦略の開発についても取り上げます。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
プライスアクション分析ツールキットの開発(第49回):トレンド系、モメンタム系、ボラティリティ系インジケーターを1つのMQL5システムに統合する プライスアクション分析ツールキットの開発(第49回):トレンド系、モメンタム系、ボラティリティ系インジケーターを1つのMQL5システムに統合する
Multi Indicator Handler EAでMetaTrader 5のチャートをシンプルにしましょう。このインタラクティブなダッシュボードは、トレンド系、モメンタム系、ボラティリティ系インジケーターを1つのリアルタイムパネルに統合します。用途に応じてプロファイルを瞬時に切り替え、ワンクリックで表示と非表示を切り替えてチャートを整理し、プライスアクションに集中できます。本記事では、これをMQL5で自作してカスタマイズする手順をステップバイステップで解説します。