知っておくべきMQL5ウィザードのテクニック(第65回):FrAMAとForce Indexのパターンを活用する
はじめに
連載を続けていきます。前回はDeMarkerとEnvelope Channelsを見てきましたが、今回はFractal Adaptive Moving Average (FrAMA)とForce Indexオシレーターの組み合わせを考えます。FrAMAは移動平均でありトレンドを示すインジケーターである一方、Force Indexはトレンドに持続性があるかどうかを確認するための出来高指標を提供します。過去の記事と同様、この2つのインジケーターを組み合わせて生成される典型的な10種類のパターンを検討します。訓練または最適化は、2023年のEUR/USDの4時間足でおこないます。フォワードウォーク(テスト)は、この銘柄を用い2024年のデータで実施します。
FrAMAとForce Indexのダイバージェンス(Pattern_1)
最初のパターンは、FrAMAとForce Indexのダイバージェンスから生じます。強気シグナルは、FrAMAが下降トレンドを示しており、価格が安値を更新するかFrAMAを下回って推移している一方で、Force Indexが安値を切り上げている場合に発生します。これは売り圧力の弱まりを意味します。この比較的限定された定義であっても、実装にはさまざまな方法が考えられます。私たちは「価格がFrAMAを下回って推移している間に、Force Indexが前回の安値を上回りつつもゼロ未満にとどまっている」状態を検出することで実装することにしました。
弱気シグナルはその逆で、FrAMAが上昇トレンドを示しており、価格が高値を更新している状況で、Force Indexが高値を切り下げている場合に現れます。これは買い圧力の弱まりの兆候です。MQL5では、強気と弱気の両パターンを次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) < FRM(X()) && Close(X() + 1) > FRM(X() + 1) && 0.0 > FRC(X()) && FRC(X()) > FRC(X() + 1)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) > FRM(X()) && Close(X() + 1) < FRM(X() + 1) && 0.0 < FRC(X()) && FRC(X()) < FRC(X() + 1)) { return(true); } return(false); }
このパターンは、FrAMAのトレンド方向とForce Indexのモメンタムを比較することで、潜在的なトレンド反転を検出します。しばしば強い強気/弱気のダイバージェンスはトレンドの弱まりを示し、これが重要なエントリーの根拠となります。したがって、このパターンは適応性と出来高加重モメンタムを組み合わせたものといえます。
FrAMAはフラクタル幾何学に基づき平滑化期間を調整するため、価格変動への反応が非常に速く、ノイズを除去しながら変化を捉えます。一方、Force Indexは価格変動に出来高を掛けることで価格の動きの強さを測定し、買い/売り圧力の代理指標として機能します。強気/弱気のダイバージェンスは、例えばFrAMAが下降トレンドを示しているのに対しForce Indexが安値を切り上げる場合に発生し、現在のロングトレンドの弱さを示します。弱気のダイバージェンスはこれと逆の状況です。このパターンは本質的に、スイングポイントや市場の転換点を捉えることを目的としています。訓練/最適化後のテスト結果は以訓練および最適化後のテスト結果は以下に示されますが、このパターンは指定された1年間(2024年)ではフォワードウォークに成功しませんでした。

FrAMAクロスオーバーとForce Indexによる確認(Pattern_1)
Pattern_1は、FrAMAのクロスオーバーとForce Indexによる確認に基づいています。強気シグナルは、価格がFrAMAを上抜ける場合、あるいは高速FrAMAが低速FrAMAを上抜ける場合に発生します。この際、Force Indexもゼロラインを上抜けることが条件となります。弱気シグナルは、価格がFrAMAを上から下に抜ける場合に発生し、同時にForce Indexもゼロラインを下抜けて負の値に転じる場合です。MQL5では、これを次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > FRM(X()) && Close(X() + 1) < FRM(X() + 1) && 0.0 > FRC(X() + 1) && FRC(X()) > 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < FRM(X()) && Close(X() + 1) > FRM(X() + 1) && 0.0 < FRC(X() + 1) && FRC(X()) < 0.0) { return(true); } return(false); }
このパターンは2つのクロスオーバーに基づいています。1つはFrAMAによるトレンド変化のシグナル、もう1つはForce Indexによる出来高を伴ったモメンタムのシグナルです。これにより、レンジ相場やノイズの多い市場での誤シグナルを減らすことができます。FrAMAクロスオーバーは、価格ではなく高速FrAMAと低速FrAMAのクロスを用いて実装することも可能です。たとえば期間は14と50を考慮できます。Force Indexは二次的な役割として、トレンド変化が出来高に裏付けられているかを確認するバリデーションとして機能します。
このパターンはトレンド市場で有効です。FrAMAの適応性によりトレンドを「タイムリー」に検出でき、Force Indexは出来高の少ないブレイクアウトをフィルタリングします。実装する際は、中期トレンドを捉えるためにFrAMAの期間を12~50の範囲で設定するのが望ましいです。Force Indexがゼロラインをクロスするという条件は、もし移動平均を利用できる場合には、そのクロスに置き換えることも可能です。このパターンは、フラットなレンジ相場では使用すべきではありません。FrAMAクロスオーバーはレンジ中で鞭打ちのように騙しシグナルを出すことが知られているためです。適切な結果を得るための鍵は、FrAMAとForce Indexの期間をバックテストで最適化することですが、ここでは両方とも期間14を使用しています。訓練およびテスト期間をカバーしたストラテジーテスターの結果は以下に示します。このパターンもフォワードウォークには成功しませんでした。

FrAMAトレンド方向とForce Indexの買われすぎ/売られすぎ
Pattern_2は、FrAMAのトレンド方向とForce Indexの買われすぎ/売られすぎの値を組み合わせて使用します。強気シグナルは、価格がFrAMAの上にありロングトレンドを示す状態で、さらにForce Indexが売られすぎ水準に達した後に戻りが発生する場合です。このForce Indexの反発を買いのチャンスと見なします。逆に、弱気シグナルは、価格がFrAMAの下にあり、Force Indexが買われすぎ水準に達した後に下落し始める場合に発生します。これは反発の兆候を示します。このパターンは、MQL5では以下のように実装されます。
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_2(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > FRM(X()) && 0.0 >= FRC(X()) && FRC(X()) > FRC(X() + 1)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < FRM(X()) && 0.0 <= FRC(X()) && FRC(X()) < FRC(X() + 1)) { return(true); } return(false); }
このシグナルパターンは、FrAMAのトレンド確認とForce Indexの極端な値を組み合わせ、反発や反転を検出します。トレンド内での平均回帰戦略に適しており、買われすぎ/売られすぎ水準での出来高の急増はシグナルの信頼性を高めます。このパターンは、FrAMAのトレンドの明瞭さとForce Indexの出来高加重の極端値を活用しています。Force Indexの閾値は資産のボラティリティに応じて調整可能です。今回の目的では、買われすぎ/売られすぎの絶対値は使用していません。これは、これらの値が資産の価格単位によって変動するためです。その代わりに、Force Indexのパターンを使って閾値到達を判断しています。したがって、主要なサポートレベルからの価格反発やローソク足パターンによる確認は、このシグナルの精度を高める上で非常に有効です。
このパターンは、1時間足のような短期時間足でのデイトレードにも使用でき、高い時間足との整合性も保てます。ただし、Force Indexが極端なダイバージェンスを示さない限り、強いトレンドに逆らった取引には使用すべきではありません。このパターンもフォワードウォークには成功しませんでした。テストレポートは以下の通りです。

FrAMAの傾きとForce Indexの平滑化
Pattern_3は、FrAMAの傾きとForce Indexの平滑化を用います。強気シグナルは、FrAMAが急角度で正の傾きを示し、Force Indexも正領域で急上昇する場合です。逆に、弱気シグナルは、FrAMAが急角度で負の傾きを示し、平滑化されたForce Indexも負で下降している場合に発生します。このパターンは、MQL5では以下のように実装されます。
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_3(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FRM(X()) - FRM(X() + 1) > FRM(X() + 1) - FRM(X() + 2) && FRM(X() + 1) - FRM(X() + 2) > 0.0 && FRC(X()) - FRC(X() + 1) > FRC(X() + 1) - FRC(X() + 2) && FRC(X() + 1) - FRC(X() + 2) > 0.0) { return(true); } else if(T == POSITION_TYPE_BUY && FRM(X()) - FRM(X() + 1) < FRM(X() + 1) - FRM(X() + 2) && FRM(X() + 1) - FRM(X() + 2) < 0.0 && FRC(X()) - FRC(X() + 1) < FRC(X() + 1) - FRC(X() + 2) && FRC(X() + 1) - FRC(X() + 2) < 0.0) { return(true); } return(false); }
私たちは、平滑化されたセカンダリーバッファを直接参照しているのではなく、Force Indexの変化を追跡しています。しかし、これらの変化の大きさを追跡し、その変化が増加している箇所に注目することで、平滑化されたForce Indexをシミュレートしています。このパターンは、FrAMAの傾きを測定し、平滑化されたForce Indexと組み合わせてトレンドの強さを評価することを目的としており、一定の出来高を伴うトレンド市場で効果的です。
代替実装では、FrAMAの角度に注目し、傾きを変化率として計算することもできます。変化率が高いほど急な角度を意味し、変化率が低いほど角度は緩やかになります。したがって、私たちはFrAMAの変化率を傾きの増加の代理指標としても使用しています。使用している平滑化されたForce Indexは、短期的なノイズを除去し、持続的なモメンタムを伴った価格変動を強調します。この2つを組み合わせると、FrAMAの傾きが急で平滑化されたForce Indexが上昇している場合は強い強気トレンドを確認でき、傾きが下降しForce Indexも下落している場合は強い弱気モメンタムを示します。このパターンにおける2つのインジケーターの組み合わせは、持続的なトレンドに注目するためスイングトレードに対して堅牢です。このパターンもフォワードウォークには成功しませんでした。そのレポートは以下に示されています。

実装にあたって、FrAMAの傾きの計算は、変化率が十分に感度が高くない場合には調整が必要になることがあります。変化率アプローチを使用する場合、期間を13~21の範囲に設定すると、応答性とノイズ除去のバランスが取りやすくなります。取引のエントリーは、両方のインジケーターが一致したとき、すなわち両方が正の傾きまたは両方が負の傾きのときにおこなうのが望ましいです。エグジットは、FrAMAの傾きが平坦になるか、Force Indexが反転したときに判断でき、トレンドの息切れを示すサインとなります。
FrAMAブレイクアウトとForce Indexの出来高急増
Pattern_4は、FrAMAのブレイクアウトとForce Indexの急上昇に基づきます。強気シグナルは、価格がFrAMAを決定的に上抜ける場合に発生し、通常は1%以上の上昇が目安です。この条件が成立する際、Force Indexも平均値の約2倍の急激な正のスパイクを示し、強い買い出来高を示します。逆に、弱気シグナルは、価格がFrAMAを明確に下抜け、かつForce Indexが再び約2倍の急激な負のスパイクを示す場合に発生し、強い売り出来高を示します。MQL5では、これを次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_4(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > FRM(X()) && Close(X() + 1) < FRM(X() + 1) && Close(X()) - Close(X() + 1) >= High(X() + 1) - Low(X() + 1) && FRC(X()) >= 2.0 * FRC(X() + 1) && FRC(X() + 1) > 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < FRM(X()) && Close(X() + 1) > FRM(X() + 1) && Close(X()) - Close(X() + 1) <= High(X() + 1) - Low(X() + 1) && FRC(X()) <= 2.0 * FRC(X() + 1) && FRC(X() + 1) < 0.0) { return(true); } return(false); }
このパターンは、価格がFrAMAを急激に上抜けまたは下抜けした際にブレイクアウトを検出し、Force Indexが出来高の急増でこのブレイクアウトを確認します。ボラティリティの高い市場では、高確率のセットアップとなる傾向があります。FrAMAのブレイクアウトは新しいトレンドを示すシグナルとなり、Force Indexはその確認のフィルターとして機能します。このパターンのインジケーターの組み合わせは、仮想通貨や小型株のようなボラティリティの高い資産に理想的で、出来高の急増が持続的な価格変動に先行する場合に有効です。FrAMAの適応性によりブレイクアウトをタイムリーに検出でき、Force Indexが誤ったブレイクアウトをフィルタリングします。
このパターンでは、Force Indexのスパイクが平均値または直前値の少なくとも2倍であることが条件となります。主要価格レベルでの三角形やフラッグといったチャートパターンによる追加確認も有効です。FrAMAの上下にストップロスを置くことでリスクを軽減できます。また、出来高トレンドを監視し、流動性の低い市場でのブレイクアウトの失敗を避けることも重要です。このパターンは以下のようにテストされましたが、残念ながら、14期間のこのインジケーターペアを使用したほとんどのパターン同様、フォワードウォークは成功しませんでした。

FrAMAサポート/レジスタンスとForce Indexの反転
Pattern_5は、FrAMAをサポート/レジスタンスとして、Force Indexの反転を組み合わせて使用します。強気シグナルは、価格がFrAMAを動的サポートとして反発する場合に発生します。この場合、価格は上からFrAMAに接近またはタッチした後、反発します。この際、Force Indexはゼロラインを上抜けるか、別の実装では5期間または13期間のEMAを上抜けます。これにより、強気の出来高の増加が示されます。
逆に、弱気シグナルは、価格がFrAMAを動的レジスタンスとして反発する場合に発生します。価格が下降トレンドでFrAMAに接近またはタッチし、Force IndexがゼロラインまたはEMAを下抜けることで、弱気の出来高の増加を示します。このパターンは、MQL5では以下のように実装されます。
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) >= FRM(X()) && Close(X() + 1) <= FRM(X() + 1) && Close(X() + 2) >= FRM(X() + 2) && FRC(X()) > 0.0 && FRC(X() + 1) < 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) <= FRM(X()) && Close(X() + 1) >= FRM(X() + 1) && Close(X() + 2) <= FRM(X() + 2) && FRC(X()) < 0.0 && FRC(X() + 1) > 0.0) { return(true); } return(false); }
このパターンは、トレンドの文脈とモメンタムの変化を組み合わせており、レンジ相場およびトレンド相場の両方で効果的です。FrAMAは動的なサポートおよびレジスタンスとして機能し、価格の反発や反落を捉え、Force Indexは反転のシグナルを提供します。この組み合わせは柔軟性があり、FrAMAが市場状況に適応し、Force Indexが正確なタイミングを示します。
FrAMAがサポート/レジスタンスとして信頼できるかどうかは、過去データでのテストにより確認する必要があります。より高速なForce Indexの確認を求める場合は、上記の方法ではなくForce EMAを使用した実装を検討することも可能です。このパターンは、より高い一致度を得るために、マクロ的な静的サポート/レジスタンスゾーンと組み合わせることもできます。取引は出来高が少ない期間には避けるべきであり、Force Indexが遅れる可能性があります。このパターンは、2023年のみを訓練期間とし、2024年をテスト期間とした場合でもフォワードウォークには成功しませんでした。両期間にわたるテストレポートは以下の通りです。

FrAMAトレンド継続とForce Indexのプルバック(Pattern_6)
7番目のパターンであるPattern_6は、FrAMAによるトレンド継続とForce Indexのプルバックに基づきます。強気シグナルは、価格がFrAMAの上にとどまり強気トレンドを確認する場合に発生します。この際、Force Indexはゼロ付近まで下落し、やや負になることもありますが、その後ゼロを超えて正の値に回復します。このForce Indexの動きは、新たな買い圧力に結びついています。
逆に弱気シグナルは、価格がFrAMAの下にとどまり弱気トレンドを確認する場合に発生します。この確認のため、Force Indexはゼロ未満からゼロに向かって上昇し、場合によってはゼロを超えることもありますが、再びゼロ未満に戻ります。これは強気の場合と同様に、新たな売り圧力の発生を示します。要するに、Pattern_6はプルバック時のトレンド継続の機会を捉えることを目的としています。FrAMAがトレンドを定義し、Force Indexが出来高の回復を確認します。理論上、このパターンは強いトレンド下で高いリスクリワード比を持つことが期待されます。MQL5では次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_6(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > FRM(X()) && Close(X() + 1) > FRM(X() + 1) && Close(X() + 2) > FRM(X() + 2) && FRC(X()) > 0.0 && FRC(X() + 1) <= 0.0 && FRC(X() + 2) >= 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < FRM(X()) && Close(X() + 1) < FRM(X() + 1) && Close(X() + 2) < FRM(X() + 2) && FRC(X()) < 0.0 && FRC(X() + 1) >= 0.0 && FRC(X() + 2) <= 0.0) { return(true); } return(false); }
このパターンは、修正後のトレンドにエントリーする際にも理想的です。FrAMAがトレンドの持続性を保証し、Force Indexが出来高を確認するためです。使用する際は、トレンドが持続する傾向があるため、意思決定をおこなう前にForce Indexがゼロ付近まで回復するのを待つことが重要です。フィボナッチリトレースメントレベルを補助的に使用することも可能で、プルバックがリトレースメントゾーンに一致する場合に役立ちます。ストップロスは、直近のスイング極値やFrAMAをガイドとして設定できます。
このパターンは、レンジ相場やノイズの多い市場では使用すべきではありません。プルバックが誤シグナルとなる可能性が高いためです。このパターンは、1年間のみの学習で翌年にフォワードウォークできる、わずか2つのパターンのうちの1つです。テストレポートは以下に示します。

すべてのテストおよび学習は1年間のみで行われており、厳密に言えば長期的な結論を導くには十分ではありません。これは、フォワードウォークできなかった他のパターンにも特に当てはまります。
FrAMAボラティリティ収縮とForce Index拡張(Pattern_7)
8番目のパターンは、FrAMAのボラティリティ収縮とForce Indexのトレンドを組み合わせたものです。強気シグナルは、FrAMAが平坦化している場合に発生します。これは傾きが小さいか、価格レンジが狭いことで示され、同時にForce Indexがゼロ付近から正方向に急上昇し、買われすぎ水準に近づく場合です。逆に、弱気シグナルは、FrAMAが平坦化しており、Force Indexがゼロから大きく下落して売られすぎ水準に近づく場合に発生します。
Force IndexオシレーターはRSIやストキャスティクスオシレーターとは異なり、極端値は絶対値で定義されません。極端値は資産ごとに変動します。これにより、買われすぎ/売られすぎ領域の定義は、コーディングの観点からやや問題となります。それにもかかわらず、MQL5ではこのパターンは以下のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_7(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && fabs(FRM(X()) - FRM(X() + 5)) <= fabs(Close(X()) - Close(X() + 1)) && FRC(X()) > 0.0 && FRC(X() + 1) < 0.0 && FRC(X()) - FRC(X() + 1) >= 2.0 * fabs(FRC(X() + 1))) { return(true); } else if(T == POSITION_TYPE_SELL && fabs(FRM(X()) - FRM(X() + 5)) >= fabs(Close(X()) - Close(X() + 1)) && FRC(X()) < 0.0 && FRC(X() + 1) > 0.0 && FRC(X()) - FRC(X() + 1) <= -2.0 * fabs(FRC(X() + 1))) { return(true); } return(false); }
Pattern_7は、FrAMAを用いて以前の低ボラティリティ期間を検出し、その後にForce Indexの拡張的な動きが続く場合を捉えます。これは、レンジ相場の収束後に発生する急騰・急落の動きを捉えることを目的としています。Force Indexによる出来高の裏付けが、信頼性を確立する上で重要な役割を果たします。FrAMAの収縮と出来高スパイクが組み合わさることで、FrAMAが低ボラティリティの識別器、Force Indexがシグナル強度の確認として機能し、レンジブレイクアウトの取引に適したパターンとなります。
FrAMAの平坦さを測定する方法としては、傾きを考慮したり、ATRなどの他のインジケーターと比較する方法もあります。Force Indexの閾値は重要であり、これを定義する方法が必要です。本ケースでは、ゼロ付近からの変動幅を測定することで設定しています。また、このパターンをボリンジャーバンドやケルトナーチャネルと組み合わせることで、ボラティリティ収縮の確認に役立ちます。ストップロスは、収束レンジ内に設定することが可能です。このパターンもフォワードウォークは成功しませんでした。テストレポートは以下に示します。

FrAMAトレンド強度とForce Indexダイバージェンスフィルター(Pattern_8)
最後から2番目のパターンは、FrAMAのトレンド強度とForce Indexのダイバージェンスを考慮します。強気シグナルは、FrAMAが急傾斜で強く上昇しており、Force Indexに弱気のダイバージェンスが発生していない場合に確認されます。これにより、強気の根拠が確定します。逆に弱気パターンはその反対で、FrAMAが強い下降トレンドを示し、Force Indexに強気のダイバージェンスが発生していない場合に確認されます。MQL5での実装は次のとおりです。
//+------------------------------------------------------------------+ //| Check for Pattern 8. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_8(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > Close(X() + 1) && FRC(X()) > FRC(X() + 1) && FRM(X()) - FRM(X() + 1) >= 2.0 * FRM(X() + 1)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < Close(X() + 1) && FRC(X()) < FRC(X() + 1) && FRM(X()) - FRM(X() + 1) <= -2.0 * FRM(X() + 1)) { return(true); } return(false); }
このパターンの鍵は、価格がFrAMAに対して強気の場合は十分上方に、弱気の場合は十分下方に位置していることです。FrAMAを用いてトレンド強度を評価し、Force Indexでフィルターすることで、誤シグナルを避け、トレンド市場での取引精度を向上させ、トレンドと出来高の分析のバランスを取ることができます。Pattern_8におけるこの組み合わせにより、トレーダーは強いトレンドに乗りつつ、Force Indexがフィルターとして働くことで勢いの弱まった局面でのエントリーを回避できます。
実装にあたっては、トレンド閾値を使用することでエントリー精度をさらに高めることが可能です。この閾値は、例えばFrAMAの傾きや価格の変化率に基づいて設定できます。また、Force Indexを監視して隠れたダイバージェンスを確認し、複数時間足でダイバージェンスが継続する場合には取引を終了すること、さらにFrAMAの入力設定を適切にバックテストしてトレンド強度の検出を最適化することも重要です。Pattern_8のフォワードテストでもウォークは発生しませんでした。テストレポートは以下に示します。

FrAMAマルチタイムフレームとForce Index整合(Pattern_9)
最後のインジケーター組み合わせであるPattern_9は、2つのインジケーターを2つの異なる時間足で使用するものです。強気シグナルは、FrAMAが短期時間足と長期時間足の両方で上昇しており、Force Indexも両方の時間足でゼロライン以上にある場合に発生します。テスト目的で、基準の4時間足に加えて、より長い時間足として日足を使用しました。逆に弱気シグナルは、FrAMAが短期・長期の両方で下降トレンドを示し、Force Indexも両時間足でゼロ未満にある場合に発生します。これをMQL5で次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 9. | //+------------------------------------------------------------------+ bool CSignalFRM_FRC::IsPattern_9(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > Close(X() + 1) && FRC(X()) > FRC(X() + 1) && FRM(X()) > FRM(X() + 1) && FRC(X()) > FRC(X() + 1) && FRM(X()) > FRM(X() + 1)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < Close(X() + 1) && FRC(X()) < FRC(X() + 1) && FRM(X()) < FRM(X() + 1) && FRC(X()) < FRC(X() + 1) && FRM(X()) < FRM(X() + 1)) { return(true); } return(false); }
2つの時間足におけるこの2つのインジケーターからの非常に基本的なシグナルの組み合わせにより、高確率の取引が可能となります。Pattern_9は、トレンドと出来高を整合させることでコンフルエンスを高めます。スイングトレードやポジショントレードに理想的なパターンです。コンフルエンスを最大化することで、誤シグナルを減らす効果があります。2023年に最適化・学習をおこなった後、2024年にテストした結果は以下の通りであり、本記事で紹介した全10パターンのうち、フォワードウォークを示す2番目のレポートとなります。

これを日足で実装しましたが、1年以上の期間でテストする場合には、さらに長い時間足を検討することで堅牢性を維持することも可能です。さらに、強気シグナルではForce Indexが上昇トレンドであること、弱気シグナルでは下降トレンドであることを、ゼロラインに対する相対的な位置に加えて条件とすることも可能です。また、FrAMAには標準期間14を使用しましたが、この数値は各時間足ごとにカスタマイズして広範なテストをおこなうことも可能です。
上で検証した10パ上記で検討した10パターンのうち、フォワードウォークに成功したのはわずか2つです。厳密に言えば、1年間のみでEAを学習・最適化しても、その翌年にフォワードウォークするとは限りません。多くの取引可能な証券では、資産市場の動向は 1 年以上持続する可能性があるため、より堅牢な取引システムを実現するには、バランスの取れた入力設定を求める際に、EAを数年にわたって訓練または最適化することが重要です。
とはいえ、過去の記事では、この1年間の短期学習ウィンドウの後に翌年でテストをおこなった場合でも、「より有望な」結果が得られることがありました。したがって、このインジケーターペアの結果には、将来のパフォーマンスを予測する上で問題となる可能性のある潜在的要因が存在する可能性があります。その理由については以下で考察します。
FrAMAとForce Indexの組み合わせが問題となり得る理由
FrAMAはトレンドフォロー型のインジケーターであり、価格変動のフラクタル次元に基づいて平滑化を適応させます。その結果、遅延を減らしつつ価格変動を追跡することが可能です。一方、Force Indexは価格変化に出来高を掛けたものであり、主要成分が価格変化であるため、価格変動の動態を反映しやすくなっています。このため、両インジケーターは価格トレンドの影響を強く受ける傾向があり、相補的な洞察というよりも冗長なシグナルを生む可能性があります。
これは予測において問題となり得ます。金融時系列の予測では、多様な入力が市場行動の異なる側面を捉えることが重要です。これにはトレンド、モメンタム、ボラティリティ、出来高などが含まれます。冗長なシグナルは、モデルがさまざまな市場条件に一般化する能力を制限し、予測に利用できる情報量を減らしてしまいます。たとえば、両方のインジケーターが同時に上昇トレンドを示した場合、ユニークな特徴量を提供するのではなく、ノイズを増幅している可能性があります。
FrAMAとForce Indexを組み合わせる代わりに、サポート/レジスタンスやモメンタムのような直交的な情報を捉える別のインジケーターと組み合わせる方が有効です。たとえば、ボリンジャーバンドやRSIが挙げられます。こうした組み合わせにより、モデルは多様な入力を受け取ることができ、価格変動の予測能力を向上させる可能性があります。
Force Indexの強い出来高依存ももう一つの弱点となり得ます。私たちは実際の出来高データを使用できないため、ティックボリュームで代替せざるを得ません。この妥協により、Force Indexの信頼性は低下します。また、FrAMAの適応平滑化とForce Indexの価格・出来高変化への迅速な反応の間にはラグや感度の不一致が生じることがあり、ボラティリティの高い期間に矛盾するシグナルが出る可能性があります。
さらに、どちらのインジケーターも本質的に将来の価格水準を予測するために設計されていないため、予測力は限定的であると考えられます。現在のトレンドや出来高レベルを把握するには適していますが、必ずしも将来の価格を予測することを目的としてはいません。
結論
今回の記事では、FrAMAとForce Indexオシレーターの組み合わせを検討しました。過去の記事で扱った一部のペアほど「収益性」が高いわけではありませんが、長期的な結論を導く前には常に多くの要素を考慮する必要があります。その中でも特に重要なのは、意図するブローカーの実ティックデータを用いて、複数年にわたってテストをおこなうことです。次回の記事では、このインジケーターペアに機械学習を適用することで、予測能力や信頼性を向上させられるかについて検討します。
| 名前 | 説明 |
|---|---|
| wz-65.mq5 | ヘッダにインクルードファイルを示すウィザード組み立てEA |
| SignalWZ-65.mqh | シグナルクラスファイル |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/18144
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
MQL5で取引管理者パネルを作成する(第11回):最新機能通信インターフェース(I)
MQL5取引ツール(第2回):インタラクティブな取引アシスタントの強化:動的視覚フィードバックの導入
MQL5開発用のカスタムデバッグおよびプロファイリングツール(第1回):高度なロギング
MQL5取引ツール(第1回):インタラクティブで視覚的なペンディングオーダー取引アシスタントツールの構築
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索