English
preview
知っておくべきMQL5ウィザードのテクニック(第83回): ストキャスティクスとFrAMAのパターンの使用 - 行動アーキタイプ

知っておくべきMQL5ウィザードのテクニック(第83回): ストキャスティクスとFrAMAのパターンの使用 - 行動アーキタイプ

MetaTrader 5トレーディングシステム |
10 0
Stephen Njuki
Stephen Njuki

はじめに

MetaTrader 4/5は、登場から20年以上にわたり、手動取引と自動取引の両方に対応できる柔軟性で広く受け入れられてきました。手動取引用にはイベントニュースカレンダー、自動取引用にはストラテジーテスターなど、各種ツールが用意されており、様々な取引アプローチに対応しています。

その中でも、MQL5ウィザードは陰で自動取引を支援する重要な役割を果たします。複数のシグナルを組み合わせたシステムをプロトタイプ化でき、カスタマイズ可能なトレーリングストップやマネーマネジメントルールを組み込むことができます。ウィザードで作成されるエキスパートアドバイザー(EA)は、基本的に、1つ以上のシグナルクラス、トレーリングストップロジック、マネーマネジメントルールで構成されます。本連載では、パターンを検出し、確率を推定し、取引判断を生み出すシグナルクラスに特に注目しています。 

今回の記事では、ストキャスティクスとFrAMAを統合したカスタムシグナルクラスを作成し、詳細に検証します。2つのよく知られたインジケーターを統合することで、それらのロジックを「パイプライン化したバイナリ表現」として出力することを目的とした、強力なハイブリッドシステムを構築します。この表現は、主に市場パターンに含まれるデジタルノイズをフィルタリングする役割を果たします。今回も、異なる市場環境に対応する10種類の指標パターンを検討します。想定する市場タイプは、トレンド型/平均回帰型、市場間の相関/非相関、低ボラティリティ/高ボラティリティです。カスタムシグナルクラス内で定義するこれら10個のパターンは、それぞれ、FrAMAの傾き、ストキャスティクスの位置関係、あるいは特定の価格パターンを表しています。

したがって、カスタムシグナルクラスの設計は、MQL5ウィザードのモジュール型構造と非常によく整合しています。記事末尾に添付されているコードは、MQL5\Include\Expert\Signal\Customフォルダ、もしくは添付された「.mq5」ファイルのヘッダに記載されている場所へ配置することを想定しています。これらの手順や、ウィザードを使ったEAの組み立て方法については、新しい読者向けにこちらで説明しています。カスタムシグナルクラスに含まれる10個の各パターンはすべて「自己完結型」であり、同一の計算フレームワークを共有しながらも、ユーザーはそれぞれを有効/無効に切り替えたり、個別に重みを設定したり、ストラテジーテスターで条件を個別に最適化したりすることができます。そのため、EA全体の構成はブラックボックスではなく、できる限り透明性の高いものになっています。高いカスタマイズ性を備えていることから、本質的に適応性があり、トレンド相場やレンジ(平均回帰)相場、相関/非相関市場、低ボラティリティ/高ボラティリティといったさまざまな市場環境に対して、ハイパーチューニングレベルで対応できる設計となっています。

本記事で提示するテストフレームワークでは、10種類のシグナルパターンが、それぞれの市場レジームにおいてどのような特性を示すのかを検証します。具体的には、1年間の学習(最適化)をおこなった後、続く1年間でフォワードテストを実施するという、一般的な手法を採用しています。また、異なる市場レジームを考慮するにあたり、コモディティ、株式、FXといった異なる資産クラスでのテストも取り入れています。検証対象は、XAU/USD(ゴールド)、S&P500指数、そしてUSDJPY通貨ペアです。すべてのテストは4時間足でおこない、学習期間は2023年7月から2024年7月まで、フォワードテスト期間は2024年7月から2025年7月までとしています。

記事の最後では、これら2つのシンプルで補完的なインジケーターの組み合わせが、文脈に依存したパターンを捉える可能性を持つ意思決定システムへとどのように変換できるのかを示したいと考えています。単なる実験の枠組みを提示するだけでなく、読者自身の取引セットアップやシステムに統合可能なアイデアをふるいにかけるためのフレームワークとしても活用できることを目指しています。


ストキャスティクスとFrAMAの融合

ストキャスティクスとFrAMAがどのように互いを補完し合うのかをより深く理解するためには、まずそれぞれのインジケーターが何を測定しているのかを把握することが重要です。ただし、それだけにとどまらず、インジケーターシグナルに対する追加のチェックやフィルタとして、ベクトル化されたバイナリパターンを活用する意義についても考える余地があります。 

まずFrAMAから見ていくと、これは価格変動のフラクタル次元に応じて感度を調整する移動平均です。その目的は、市場がトレンドを形成している局面では滑らかに、レンジや「フラクタル的」な価格状況ではより反応的に振る舞うことにあります。FrAMAの数式は以下のとおりです。

f1

ここで

f2

かつ

です。ここで

  • P(t):現在の価格(通常は終値)
  • D:フラクタル次元(市場の粗さを示す指標)
  • N1、N2:FrAMAのルックバック期間内における連続セグメントの値幅

市場が滑らかで方向性のある動きを見せる場合、Dの値は1に近づく傾向があります。これによりαは大きくなり、FrAMAは高速移動平均のように価格に密着して推移します。一方で、市場がカオス的、またはレンジ相場になると、Dは2に近づきます。この場合、FrAMAはより滑らか、または横這いに近い動きとなり、ノイズをフィルタリングする役割を果たします。このように、本記事で採用するカスタムシグナルクラスにおいて、FrAMAは文脈を認識するトレンドのバックボーンとして機能します。ボラティリティや価格構造に応じて傾きを動的に再調整する点が特徴です。

次に、George Laneによって考案されたストキャスティクスですが、これは最も古く、かつ広く利用されているモメンタム系インジケーターのひとつで、一定期間における高値と安値の値幅に対して、現在の終値がどの位置にあるのかを定量化します。このインジケーターは、KとDという2つのバッファで構成されています。それぞれの数式は以下のとおりです。

f4

ここで

  • Ct:現在の終値
  • Hn​ :過去n期間における最高値
  • Ln:過去n期間における最安値
  • SMAm​ :%Kのm期間単純移動平均

MQL5に組み込まれているインジケーターライブラリでは、この指標に対応するクラスは予想どおり「CiStochastic」です。このクラスのインスタンスから、Main関数およびSignal関数を通じて、KおよびDの2つのバッファにアクセスできます。よく知られているように、Kの値は0から100の間を推移し、20以下であれば売られ過ぎ、80以上であれば買われ過ぎと判断されることが一般的です。KとDのクロス、ならびにこれらの水準付近での挙動は、反転やトレンド継続を見極める上で重要な手がかりとなります。本記事では、これらをバイナリ表現へと変換し、シグナルとして利用します。 

2つのインジケーターを定義したところで、次にそれらの「融合」について考えます。FrAMAとストキャスティクスの組み合わせは、二次元的なロジックを構築します。FrAMAはトレンド方向を捉えつつ、その滑らかさを動的に調整することで、市場が上向き、下向き、横這いのいずれにあるのかというバイアスを示します。一方、ストキャスティクスは、現在の価格レンジに対するモメンタムの枯渇や、適切なエントリータイミングを検出します。この2つを併用することで、互いの弱点を補い合う効果が期待できます。  FrAMAは、トレンドのない局面での早すぎるシグナルによるノイズを抑え、ストキャスティクスは、反転局面での遅れたエントリーを回避する助けとなります。 以下では、このインジケーターの組み合わせに対して追加された、カスタム関数の一覧を示します。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::FlatFrama(int ind)
{  const double tol = m_pips * m_symbol.Point();
   for(int i = ind; i < m_past+ind; i++)
      if(MathAbs(FrAMASlope(i)) > tol) return false;
   return true;
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::FarAboveFrama(const int ind, double mult)
{  double dist = MathAbs(Close(ind) - FrAMA(ind));
   double atr  = High(ind + 1) - Low(ind + 1);
   if(atr <= 0.0) return false;
   //printf(__FUNCTION__ + " dist & atr are: %.5f, & %.5f ", dist, atr);
   return (Close(ind) > FrAMA(ind) && dist > mult * m_symbol.Point() * atr / 4.0);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::FarBelowFrama(const int ind, double mult)
{  const double dist = MathAbs(Close(ind) - FrAMA(ind));
   const double atr  = High(ind + 1) - Low(ind + 1);
   if(atr <= 0.0) return false;
   //printf(__FUNCTION__);
   return (Close(ind) < FrAMA(ind) && dist > mult * m_symbol.Point() * atr / 4.0);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::BullishDivergence()
{  int a = -1, b = -1;
   for(int i = 2; i <= m_past + 2; i++)
   {  if(Low(i) < Low(i - 1) && Low(i) < Low(i + 1))
      {  if(a == -1) a = i;
         else
         {  b = i;
            break;
         }
      }
   }
   if(a == -1 || b == -1) return false;
   bool priceLL = (Low(a) < Low(b));
   bool oscHL   = (K(a) > K(b));
   return (priceLL && oscHL);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::BearishDivergence()
{  int a = -1, b = -1;
   for(int i = 2; i <= m_past + 2; i++)
   {  if(High(i) > High(i - 1) && High(i) > High(i + 1))
      {  if(a == -1) a = i;
         else
         {  b = i;
            break;
         }
      }
   }
   if(a == -1 || b == -1) return false;
   bool priceHH = (High(a) > High(b));
   bool oscLH   = (K(a) < K(b));
   return (priceHH && oscLH);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::FramaTurningUp()
{  return (FrAMASlope(X() + 3) < 0 && FrAMASlope(X() + 2) < 0 && FrAMASlope(X() + 1) > 0 && FrAMASlope(X()) > 0);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::FramaTurningDown()
{  return (FrAMASlope(X() + 3) > 0 && FrAMASlope(X() + 2) > 0 && FrAMASlope(X() + 1) < 0 && FrAMASlope(X()) < 0);
}

初めて読む方のために補足すると、バイナリ表現を得るために、各インジケーターの条件はすべて、真か偽かのブール値フレームワークで検証されます。たとえば、傾きが存在するか、レンジ状態にあるか、といったチェックがおこなわれます。それぞれの判定結果は1ビットのシグナルとなり、これらを集約することでバイナリベクトルが構成されます。このベクトルにおいて、1はパターンの存在を示し、0はそのパターンが存在しないことを意味します。本質的に、この手法はアナログなプライスアクションをデジタル化するものであり、EAが市場をブール値ベクトルの集合として扱えるようにします。また、これらのベクトルは計算負荷が非常に軽いため、新しい価格バーごとに複数のパターンチェックを実行してもCPU負荷を最小限に抑えることが可能です。


テストフレームワーク

ストキャスティクスとFrAMAのシグナルパターンをテストする目的は、単一の戦略をバックテストすることに限定されているわけではありません。むしろ、10種類のユニークなインジケーターパターンが、異なる市場環境においてどのように振る舞うのかをより深く理解することにあります。統計的一貫性を保つため、すべてのテストは同一の入力最適化設定のもとで実施しており、例外として、資産タイプごとに異なる市場アーキタイプを割り当てています。

10種類すべてのシグナルパターンは、4時間足でテストしています。これは、時間足が小さすぎてノイズが増えることを避けつつ、十分な取引頻度も確保できる妥協点として選択したものです。前述のとおり、各パターンは2023年7月1日から2024年7月1日までの期間で学習/最適化をおこない、フォワードウォーク/検証は2024年7月1日から2025年7月1日までの期間で実施しています。この分割形式により、1年間のインサンプル学習に続いて、さらに1年間のアウトオブサンプル検証をおこなう構成となっています。

最適化において調整したパラメータは、カスタムシグナルクラスにおける典型的なエントリーおよびクローズの閾値、注文時の指値エントリーデルタ、そしてテイクプロフィットです。また、過去の記事と同様に、各シグナルパターンごとのオープン/トリガー閾値についても必ずチューニングをおこなっています。これらに加えて、新たにルックバック期間とpips閾値の調整も導入しました。ビットマスクパラメータであるPatternsUsedについても、前回までの記事で説明したとおり、各シグナルパターンの実行ごとに手動で調整しています。

すべてのバイナリパターンをより文脈的に理解するため、テスト結果は銘柄ごとに特定の市場アーキタイプに基づいてグループ化しました。選定した銘柄は、それぞれの市場特性を最もよく示すことを目的としたものです。これを以下のように表にまとめています。

市場タイプ テストしたパターン 使用銘柄 選定理由
トレンド型 0、6 XAU/USD マクロ要因が揃った際に、ゴールドは強いトレンドを形成しやすい
平均回帰型 1、7 XAU/USD ゴールドの短期的な保ち合いは、モメンタムのピークを示すことがある
相関型 2 SPX 銘柄間の相関が強く、モメンタムの整合性シグナルが出やすい
非相関型 3、9 SPX 乖離やデカップリングのロジックが、一部の非対称なセクターで機能しやすい
高ボラティリティ 4、8 USD/JPY 円の高いボラティリティは、オーバーシュートやミッドライン反転パターンを捉えやすい
低ボラティリティ 5 USD/JPY 低ボラティリティ環境ではレンジ相場やフラットなFrAMAが頻発しやすい

上記の表によるマッピングは、各シグナルパターンを「その概念設計上、最も適した環境」で評価できるようにすることを目的としています。

最適化の評価基準には、MQL5に内蔵されている「コンプレックスクライテリア」を使用しました。これは、純粋な利益額よりも、ロバスト性や汎化性能を重視する指標として理解できます。また、各シグナルパターンを自己完結型のバイナリロジックブロックとして構成しているため、テスト対象となる銘柄の市場アーキタイプに対して、そのパターンがどれほど文脈的に有効かを、より明確に検証または否定することが可能になります。その結果、開発者は最小限のコード変更をおこなうだけで、このフレームワークを独立したハイブリッド戦略へ再利用する立場に立つことができます。


Pattern_0:トレンド市場のブレイクアウト整合

最初に紹介するパターンは、方向性のあるモメンタム主導の市場で機能するよう設計されています。ロジックの中核は、FrAMAの適応的な傾きと、ストキャスティクスのクロスシグナルの組み合わせにあります。MQL5では次のように実装します。

売り:価格がFrAMAの下に位置し、FrAMAの傾きが負で下向きのモメンタムを示します。さらに、ストキャスティクスで%Kが%Dを下抜けする弱気クロスが発生しており、かつ%Kが80以上で買われ過ぎ状態となっています

p0_sell

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::IsPattern_0(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return((Close(X()) > FrAMA(X()) && FrAMASlope(X()) > 0 && CrossUp(K(X()), D(X()), K(X() + 1), D(X() + 1)) && K(X()) < 20) ? true : false);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return((Close(X()) < FrAMA(X()) && FrAMASlope(X()) < 0 && CrossDown(K(X()), D(X()), K(X() + 1), D(X() + 1)) && K(X()) > 80) ? true : false);
   }
   return(false);
}

売りシグナルは、買いシグナルの鏡像として構成されており、価格がFrAMAより下にあり、FrAMAが下向き、さらにストキャスティクスで%Kが%Dを下抜けし、%Kが80以上であることを確認します。Pattern_0は、価格の圧縮状態から拡張状態への移行、すなわちトレンド初動の特徴を捉えるパターンです。対象としてゴールド(XAUUSD)を選んだ理由は、ゴールドが方向性の強いトレンドと保ち合いの間を行き来しやすく、マクロ要因(インフレ期待や中央銀行の政策方針など)が価格を駆動するため、Pattern_0のトレンド感度を活かせるということです。フォワードテスト結果を以下に示します。

r0

フォワードウォークでもわずかながら利益を出すことができました。このパターンの成功は、2つの重要な要素を示唆しています。まず、テスト対象として選んだ銘柄が、XAUのマクロ主導の動きという高モメンタム資産に適していた可能性があります。ゴールドの日中の値幅は、ストキャスティクスが売られ過ぎ状態から早すぎる反転を起こさずに回復するのに十分な範囲を提供します。また、パターンの堅牢性も成功の要因と考えられます。これは、トレンド方向とモメンタム再加速という直交する2つの指標を組み合わせており、それぞれの指標がバイナリ判定に独自の情報を提供することで、学習期間だけでなくフォワード期間でも有効に機能するためです。


Pattern_1:平均回帰型フック反転

Pattern_0ではトレンド相場でのブレイクアウトを狙いましたが、このシグナルパターンではやや逆のアプローチを取り、平均回帰に注目します。価格が一時的に均衡から乖離した後、元の水準に戻ろうとする際の疲弊ポイントを捉えることが目的です。このパターンでは、短期的な極端値でのストキャスティクスの感度を活用し、FrAMAを動的な基準線として用いることで、適応レンジ内での過剰な伸びを識別します。

Pattern_1は、中心傾向の周りで頻繁に上下する資産に適しており、比較的安定したボラティリティのもとでモメンタムのピークや谷が多く記録されるような場合に有効です。ゴールドは、特に強いラリーや下落後の保ち合いでこの特性を示すことがあります。このパターンは、MQL5では以下のように実装されます。

売り価格がFrAMAの上に位置して過大評価されている状態で、%Kラインが85以上の強い買われ過ぎ状態にあり、かつ%Kラインが前のバーより下がっています

p1-sell

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::IsPattern_1(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return((Close(X()) < FrAMA(X()) && K(X()) < 15 && K(X()) > K(X() + 1)) ? true : false);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return((Close(X()) > FrAMA(X()) && K(X()) > 85 && K(X()) < K(X() + 1)) ? true : false);
   }
   return(false);
}

売買の両方のシグナルでは、極端なゾーンにあるときの%Kの最初の反転を捉えています。これは短期的な群衆行動に逆らう形でおこなわれます。FrAMAはフィルタとして機能し、価格が平均から大きく乖離しているタイミングでの注文エントリーを調整し続けることで、トレンド中の誤反転を減らす役割を果たします。

ゴールドはトレンド資産として知られていますが、保ち合い局面では平均回帰パターンにも適しています。特にマクロ経済のトリガーが一時停止している場合、狭く方向感のない値幅で価格が上下に振れることがあります。この際、FrAMAの傾きは平坦化し、適応型の均衡値として「フェアバリュー」を示します。さらに、ストキャスティクスが極端な領域(15未満や85超)でフックすると、投機ポジションの疲弊を反映し、反転エントリーの機会を示します。フォワードテストの結果も利益を伴い、以下のようなレポートが得られました。

r1



Pattern_2:相関型トレンド継続

3番目のパターンは、相関のある市場環境で継続するトレンドの延長を捉えることを目的としています。これは、資産が共通のマクロ要因によって同期した動きを示す場合に有効です。このパターンでは、強い傾きを持つFrAMAを活用します。買いの場合は正の傾きが強く、売りの場合は逆に負の傾きが強くなります。これに加えて、ストキャスティクスの位置も一貫している必要があります。具体的には、買いの際はKとDが50以上、売りの際は50未満で推移していることが望ましく、持続的なモメンタムを示すものと考えます。これをMQL5で次のように実装します。

売りFrAMAの傾きが強く負で下向きトレンドを確認し、過去のルックバック期間においてストキャスティクスの%Kおよび%Dがともに50未満で推移しています。

p2-sell

//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::IsPattern_2(ENUM_POSITION_TYPE T)
{  const double strong = m_pips * m_symbol.Point();
   bool up   = (FrAMASlope(X()) > strong);
   bool down = (FrAMASlope(X()) < -strong);
   bool over = true, under = true;
   for(int i = 0; i < m_past; i++)
   {  over  &= (K(X() + i) > 50 && D(X() + i) > 50);
      under &= (K(X() + i) < 50 && D(X() + i) < 50);
   }
   if(T == POSITION_TYPE_BUY)
   {  return((up   && over)  ? true : false);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return((down && under) ? true : false);
   }
   return(false);
}

厳密に言えば、このパターンのテストにはどの資産でも使用可能であり、私たちがSPYを使用したことは決して推奨ではありません。しかし、このインデックスは、この10パターンの中で特に相関に寄ったパターンであるため、適していると言えます。また、このインデックスは構成銘柄との相関が高くなる傾向があり、特定の期間では自己相関も高くなります。フォワードウォークのテスト結果は、下記の通りわずかに有望な結果を示しました。

r2



Pattern_3:非相関型ダイバージェンス認識

4番目のパターンは、単純な方向追従ルールから離れ、市場のデカップリング(乖離)に注目します。これは、価格とモメンタムが同期せずに動き始める状況を指します。このパターンでは、滑らかなトレンドを表すFrAMAと、内部エネルギーの短期的指標であるストキャスティクスとの構造的な対比を活用します。目的は、買いの場合は価格が新高値に達する直前、売りの場合は新安値に達する直前の強気と弱気のダイバージェンスを捉えることです。シグナル発生後は、ストキャスティクスがモメンタムの継続を確認できず、潜在的な疲弊を示す必要があります。これは、通常相関が強く同期的な動きを示す環境において、デカップリングの兆候を示すことを意図しています。これをMQL5で次のように実装します。

売り価格がFrAMAの上にあるもののモメンタムが一致せず、弱気のダイバージェンスが発生しています。具体的には、価格が高値を更新する一方で、ストキャスティクスの%Kが前の高値を下回っています

p3

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::IsPattern_3(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return((Close(X()) < FrAMA(X()) && BullishDivergence())  ? true : false);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return((Close(X()) > FrAMA(X()) && BearishDivergence()) ? true : false);
   }
   return(false);
}

このパターンにおいてSPYが適していたのは、構成銘柄との同期性が高く、自己相関が生じやすいためです。そのため、このセットアップでは、特定のセクターで「必然的な」乖離が発生する際に、一時的なデカップリングが生じやすくなります。例えば、短期的なテーマや突発的なニュースによって、テクノロジーセクターが強くなる一方でエネルギーセクターが弱まる、といった現象です。こうしたセクター間の乖離は、マクロの転換点で現れることが多く、インデックスレベルでの指標ダイバージェンスを示唆することがあります。この場合、FrAMAは構造的な「基準線」として機能し、ストキャスティクスは「短期的な加速度計」として作用します。両者が対立する状況は、通常、トレンドの疲弊やリバランス局面の前兆となります。Pattern_3のフォワードウォーク結果は以下の通りです。

r3

Pattern_3の好結果は、価格を追いかけるのではなく、相関の崩れを予測するアプローチにあると考えられます。この相関の崩れは、通常、市場全体の転換点に先立って発生することが多いためです。

 

Pattern_4:高ボラティリティオーバーシュート

本記事で最後に紹介する5番目のパターンは、ボラティリティによって生じる極端な値動きを捉えることを目的としています。これは、価格が適応型の平均値から大きく乖離した後に、調整またはトレンドの継続が起こる前の状況を指します。このルールでは、FrAMAの適応型基準線と距離フィルタを組み合わせています。本質的には、ボラティリティの拡大によって増幅された統計的に重要な逸脱を特定しようとするものです。

このパターンは、オーバーシュートが頻発し、トレンドの急伸が平均値を大きく超えてから正常化することが多い、値動きの速い市場で機能することを想定しています。このため、USD/JPYを対象として選びました。MQL5での実装は以下の通りです。

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//+------------------------------------------------------------------+
bool CSignalFrAMA_Stochastic::IsPattern_4(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return((FarAboveFrama(X()) && K(X()) > 60)  ? true : false);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return((FarBelowFrama(X()) && K(X()) < 40) ? true : false);
   }
   return(false);
}

このパターンでは、追加のハイパーパラメータとして動的距離distを使用しており、逸脱が統計的に有意な場合にのみシグナルが発動します。入力パラメータmultも調整可能ですが、ほぼε(微小値)として非ゼロ値で使用されています。読者は以下のコードを参照し、このパラメータを調整することでシグナルパターンのパフォーマンスに意味のある影響があるか確認できます。 

USD/JPYを選んだ理由に戻ると、この通貨ペアは、恐らくほとんどの円建てペアと同様に、ボラティリティを非対称に表現する傾向があります。特に、FRB(米連邦準備制度)と日本銀行(BOJ)の金融政策や金利差によってトレンドの急伸が起こる場合に顕著です。ただし、こうした動きはほぼ同等の反動で追随されることが多くあります。さらに、日中の流動性変化や主要経済指標の発表による強い反応も見られます。これらすべての要素が、このパターンの「高ボラティリティ」特性に寄与しています。フォワードウォークでのテストでも利益が出ており、レポートは以下の通りです。

r4

Pattern_4の好結果は、ボラティリティに応じたスケーリングへの依存によるものと考えられます。


結論

今回のインジケーターの組み合わせでは、通常のペアインジケーターシグナル同様に10パターンがありますが、本記事ではそのうち5つのみを取り上げました。次回の記事では、今回扱わなかった残りのパターンに焦点を当てます。今回見てきたように、FrAMAとストキャスティクスをカスタムシグナルクラスで組み合わせることで、限られたテスト期間を超えても一定の有用性が期待できることが示されました。今回取り上げた5つのパターンは、それぞれ特定の資産/銘柄で最も顕著に現れる行動パターンを体現していました。テスト対象としてXAU/USD、SPX、USD/JPYを用いましたが、次回の記事でもこれらの銘柄を用い、異なるが関連する市場パターンでの検証を続けていきます。


免責事項

これは金融アドバイスではありません。本記事の目的は、市場の動向を断定することではなく、アイデアの議論を促すことにあります。目的は「聖杯」を示すことではなく、利用可能なチャンスの幅を探り、それをどう活用できるかを示すことです。最終的な作業や重要な精査は、読者自身がおこなう必要があります。提示された内容を活用する場合も、自己責任での判断が求められます。

名前 説明
WZ-83.mq5 ヘッダにインクルードファイルの名前と場所を示すウィザード組み立てEA
SignalWZ_83.mqh ウィザードアセンブリで使用されるカスタムシグナルクラスファイル
(EAを組み立てる際にMQL5ウィザードで添付ファイルを使用する方法についての新しい読者向けガイダンスはこちら

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

添付されたファイル |
WZ_83.mq5 (8.5 KB)
SignalWZ_83.mqh (50.52 KB)
無効化されたオーダーブロックをミティゲーションブロックとして再利用する(SMC) 無効化されたオーダーブロックをミティゲーションブロックとして再利用する(SMC)
本記事では、以前に無効化されたオーダーブロックをスマートマネーコンセプト(SMC)におけるミティゲーションブロックとして再利用する方法を解説します。これらのゾーンは、オーダーブロックが失敗した後に機関投資家が再び市場に参入するポイントを示しており、支配的なトレンドに沿った取引継続の確率が高いエリアを提供します。
プライスアクション分析ツールキットの開発(第44回):MQL5でVWMAクロスオーバーシグナルEAを構築する プライスアクション分析ツールキットの開発(第44回):MQL5でVWMAクロスオーバーシグナルEAを構築する
本記事では、MetaTrader 5向けに開発されたVWMA(出来高加重移動平均)クロスオーバーシグナルツールを紹介します。このツールは、価格動向と出来高を組み合わせることで、強気および弱気の反転ポイントを特定することを目的としています。このエキスパートアドバイザー(EA)は、チャート上に明確な買いと売りシグナルを直接表示し、豊富な情報を持つパネルを備えるとともに、ユーザーによる詳細なカスタマイズが可能で、実践的な取引戦略の強力な補助となります。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
取引システムの構築(第5回):構造化された取引決済による利益管理 取引システムの構築(第5回):構造化された取引決済による利益管理
利益目標まであとわずかというところで価格が反転し、ストップロスにかかってしまう。トレーリングストップによって建値で決済された直後に、市場が元の方向へ大きく動き、当初の目標を超えていく。多くのトレーダーにとって、これはおなじみの悩みでしょう。本記事では、異なるリスクリワードレシオ(RRR)で複数のエントリーを配置する手法に焦点を当て、利益を体系的に確保しながら、全体のリスク曝露を抑えるアプローチを解説します。