
知っておくべきMQL5ウィザードのテクニック(第56回):ビル・ウィリアムズフラクタル
はじめに
ビル・ウィリアムズのフラクタルインジケーターは、彼の手法群の中でも極めて重要なインジケーターです。このインジケーターは主に、取引される銘柄のプライスアクションにおける反転ポイントを特定するために使用されます。フラクタルの概念に基づいており、5本のローソク足から成る反復パターンとして捉えられます。中心のバーが最も高い高値を付けている場合は弱気(売り)フラクタル、逆に中心のバーが最も低い安値であれば強気(買い)フラクタルと判断されます。この記事では、過去のMQL5ウィザード記事と同様に、このインジケーターのパターンのうち、トレーダーが活用できるいくつかのパターンについて考察していきます。
同方向への連続したフラクタル(Pattern-0)
最初のパターン(Pattern-0)では、連続する強気フラクタルの安値が以前の安値付近で形成される場合、市場がその価格帯でサポートを見つけていると解釈されます。ここでの「連続したフラクタル安値」とは、間にフラクタル高値が挟まっていない複数のフラクタル安値が並ぶ状態を意味します。これは重要なシグナルです。通常、フラクタルは安値と高ねが交互に現れるものです。しかしこのように安値だけが続く場合、異なる買い手が同じ価格帯で再び市場に参加している可能性を示しており、上昇前の蓄積フェーズを表す可能性があります。
逆に、複数の連続した弱気フラクタル高値は、価格が突破できないレジスタンスレベルを示している可能性があります。特に大きな時間足で何度も拒否されている場合、それは強い売り圧力の存在と下落トレンドの継続または開始の兆候とみなされるでしょう。
MQL5でPattern-0を次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X() + 1) != 0.0 && FractalLow(X()) != 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + 1) != 0.0 && FractalHigh(X()) != 0.0) { return(true); } return(false); }
デフォルトでは、ビル・ウィリアムズのフラクタルインジケーターはMetaTraderに組み込まれている標準インジケーター群の一つとして提供されています。しかしそのまま使用するには多少の調整が必要です。というのも、このインジケーターのHigh(上部)バッファやLow(下部)バッファの多くの値は、初期使用時にNaN(非数)を返すことがあるためです。そのため、私たちはこの問題を回避するために、FractalHigh関数とFractalLow関数の2つの関数を導入して、修正版のフラクタルインジケーターを作成します。以下にその両関数のコードを示します。
double FractalHigh(int ind) { // m_high.Refresh(-1); if(m_high.MaxIndex(ind, 5) == ind) { return(m_high.GetData(ind)); } return(0.0); }
double FractalLow(int ind) { // m_low.Refresh(-1); if(m_low.MinIndex(ind, 5) == ind) { return(m_low.GetData(ind)); } return(0.0); }
pattern-0関数では、強気シグナルをチェックする際に、2本前までの連続したバーに対してFractalLow関数を呼び出すだけです。また、弱気パターンを探す場合には、同様にFractalHigh関数を使います。この連続バーの本数は読者が自由にカスタマイズ可能です。たとえば、より多くの騙しシグナルを排除したい場合は本数を増やすことで対応できます。ただし、よくあるケースとしては、取引の発生頻度が少ないほど、長期間にわたる検証が必要になる点には注意が必要です。 このインジケーターの各パターンに対するすべてのテストは、通貨ペアGBP/USD、4時間枠、および2024年のデータを用いて実施しました。なお、パターンの最適化は2023年のデータを使用しておこなっています。そして、pattern-0のフォワードウォーク(将来期間での検証)により、次のようなレポートが得られました。
pattern-0は強いトレンドの継続を示します。そのため、利確後に既存のトレンド方向へポジションを再度エントリーする際の判断材料として活用できます。
フラクタルトレンドブレイクアウト(Pattern-1)
Pattern-1は、2番目に紹介するもので、強気フォーメーションはまずレジスタンスとして機能していた弱気フラクタル(Fractal High)の存在によって定義されます。その後、価格がこのフラクタル高値を明確に上抜けたときに強気フォーメーションが成立します。このブレイクアウトは、売り手に対して買い手が優勢となり、これまでのレジスタンスラインがサポートラインへと転換するシグナルとして解釈されます。この現象が、より広範囲な上昇トレンドの中で発生した場合には、明確に見えづらくなっていたトレンドの継続を再確認する強い根拠にもなります。
一方で、Pattern-1の弱気バージョンは当然ながらその逆です。すなわち、サポートとして機能していた強気のフラクタル安値の後、価格がそのフラクタル安値を下抜けることでブレイクが成立します。このブレイクは、買い手に代わって売り手が主導権を握り、下降トレンドが始まる可能性を示すシグナルとなります。MQL5では、これを次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalHigh(X() + 1) != 0.0 && Close(X()) > FractalHigh(X() + 1)) { return(true); } else if(T == POSITION_TYPE_SELL && FractalLow(X() + 1) != 0.0 && Close(X()) < FractalLow(X() + 1)) { return(true); } return(false); }
上記のコードでは、前のローソク足におけるフラクタルポイントを検出し、その後、現在の終値とそのフラクタル価格を比較しています。ロジックで述べたように、強気パターンにおいては「フラクタル高値(弱気フラクタル)」が重要であり、弱気パターンにおいては「フラクタル安値(強気フラクタル)」が注目されます。
2023年の始値・終値の閾値を最適化したうえで、2024年のフォワードテストを実施したところ、以下のレポートが得られました。
Pattern-1は、Pattern-0がトレンドの継続を示すのに対し、トレンドの反転を示す可能性がある点で特に重要です。そのため、他のインジケーターと組み合わせて使うのが常に効果的です。
インサイドフラクタル(高値の切り下げ、安値の切り上げ)(Pattern-2)
Pattern-2の強気の形成は、強気のフラクタル安値(スイングロー)が、以前のより広い範囲のフラクタル安値付近で形成されることで定義されます。価格はこの範囲内で収縮し、フラクタル安値がほぼ水平に近い状態となります。この狭いレンジを価格が上抜けすると、買い手がレンジの収束を突破して価格を押し上げていることを示し、強気のシグナルとなります。
一方、弱気のフラクタル高値(スイングハイ)が以前の弱気フラクタル範囲内で密集して形成される場合、これは価格の迷いの期間を示します。このレンジの下限を価格が下回りサポートが崩れると、下抜けのブレイクアウトが発生し、弱気の動きが確定します。これをMQL5で以下のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_2(ENUM_POSITION_TYPE T) { CArrayDouble _buffer; if(T == POSITION_TYPE_BUY) { for(int i = 0; i < m_periods; i++) { if(FractalLow(X() + i) != 0.0) { _buffer.Add(FractalLow(X() + i)); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] - _buffer[_buffer.Minimum(0, _buffer.Total())] <= fabs(Close(X()) - Close(X() + 10))) { return(true); } } else if(T == POSITION_TYPE_SELL) { for(int i = 0; i < m_periods; i++) { if(FractalHigh(X() + i) != 0.0) { _buffer.Add(FractalHigh(X() + i)); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] - _buffer[_buffer.Minimum(0, _buffer.Total())] <= fabs(Close(X()) - Close(X() + 10))) { return(true); } } return(false); }
このパターンの実装には、私たちの方法論に従い、配列の標準クラスを使用する必要があります。なぜなら、一定期間のフラクタルポイントを探すためであり、取得するポイントの数が不確定だからです。また、これらのフラクタルポイントの標準偏差を把握する必要もあります。
しかし、配列クラスにはベクトル型のような標準偏差を計算する関数がなく、計算コストも高いため、代わりにこれらのポイントの範囲を使うことにしました。範囲が圧縮されているかどうかを判断するために、範囲の大きさを終値のトレンドの変動幅と比較し、範囲のほうが小さければ「圧縮されている」と判断します。
厳密に言えばこれは粗い評価で、トレンドが強く終値の変動が大きくなる市場では、どんなフラクタルポイントの範囲でもこの条件を通過してしまうことがあります。だからこそ、読者の皆さんにはフラクタルポイントの範囲や標準偏差を絶対値と比較するなど、工夫して最適化できるように改良することをおすすめします。
私たちのウィザード組み込みのEAを最適化した後、USD/JPYの4時間枠でフォワードテストをおこなった結果は以下の通りです。
Pattern-2は、レンジ収縮のパターンであり、ブレイクアウトの可能性を示唆します。複数の時間枠で、小さなフラクタルがより大きなフラクタルの内部に形成されている場合、これは通常、拡大の前の圧縮を示しています。
価格動向とのフラクタルダイバージェンス(Pattern-3)
Pattern-3は価格動向とのダイバージェンスです。ここでは、価格が安値を更新している(持続的な下押しを示す)にもかかわらず、対応する強気のフラクタル(スイングロー)が前のスイングよりも高い場合に強気のダイバージェンスが見られます。このダイバージェンスは、価格が下落しているものの基盤となるサポートが強まっていることを示し、近い将来の強気の反転を示唆すると解釈されます。
一方、弱気のダイバージェンスは、価格が高値を更新しているにもかかわらず、弱気のフラクタル高値が前のものよりも低い場合を指します。この状況は、価格が上昇しているものの、レジスタンスが価格を抑え込んでいることを示し、買い圧力の弱まりと下落への反転の前兆と考えられます。このパターンは、MQL5では以下のように実装されます。
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_3(ENUM_POSITION_TYPE T) { CArrayDouble _buffer; if(T == POSITION_TYPE_BUY) { for(int i = 0; i < m_periods; i++) { if(FractalLow(X() + i) != 0.0) { _buffer.Add(FractalLow(X() + i)); } if(_buffer.Total() >= 2) { break; } } if(_buffer[0] > _buffer[1] && Low(X()) < Low(X() + 1)) { return(true); } } else if(T == POSITION_TYPE_SELL) { for(int i = 0; i < m_periods; i++) { if(FractalHigh(X() + i) != 0.0) { _buffer.Add(FractalHigh(X() + i)); } if(_buffer.Total() >= 2) { break; } } if(_buffer[0] < _buffer[1] && High(X()) > High(X() + 1)) { return(true); } } return(false); }
Pattern-3のコーディングでも、MQL5 IDEに用意されている標準配列クラスを使用する必要があります。これはPattern-2で述べた理由とほぼ同じですが、今回は入力パラメータ「m_periods」で設定された期間内の複数のフラクタルポイントを探すのではなく、2つのフラクタルポイントだけを対象としています。これら2つのフラクタルポイントと、2つの極端な価格ポイントを組み合わせてシグナルの可能性を判断します。
先ほどのパターンと同様の通貨ペア、時間枠、検証期間で最適化後におこなったフォワードテストの結果は以下の通りです。
双対対向フラクタル(反転ゾーン)(Pattern-4)
Pattern-4は「双対対向フラクタル」です。このパターンの強気形成は、同じ位置に配置された2つのフラクタル、すなわち強気のフラクタル(安値側)と弱気のフラクタル(高値側)が関係します。この2つが交差することで、相場の迷いゾーンが形成されます。価格が強気フラクタルで反発し、弱気フラクタルを上抜けると、強気シグナルが確定します。
弱気形成の場合は、強気フラクタルの直後に弱気フラクタルが出現する流れです。 価格が弱気フラクタル(高値)で反発して、強気フラクタルを下抜けると、売りシグナルが確定します。これをMQL5で次のようにコード化します。
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_4(ENUM_POSITION_TYPE T) { bool _1 = (FractalHigh(X() + 1) != 0.0 && FractalLow(X() + 1) != 0.0); bool _2 = (FractalHigh(X() + 2) != 0.0 && FractalLow(X() + 2) != 0.0); if(_1 || _2) { if(T == POSITION_TYPE_BUY) { if((_1 && Close(X()) > FractalHigh(X() + 1)) || (_2 && Close(X()) > FractalHigh(X() + 2))) { return(true); } } else if(T == POSITION_TYPE_SELL) { if((_1 && Close(X()) < FractalLow(X() + 1)) || (_2 && Close(X()) < FractalLow(X() + 2))) { return(true); } } } return(false); }
コードでは、双対フラクタルパターンを検出するために2つのブール値を使っています。このパターンの特徴として、遅延ではなく、やや引きずるような効果があるため、2つの値を用いることを選びました。それぞれのブール値は、最後に確定したまたはその一つ前のバーを示しています。パターンが検出されると、先に説明した通り、終値がどの重要レベルを突破したかを単純にチェックします。
このパターンの最適化後のフォワードウォークテストの結果は以下の通りです。
強気と弱気のフラクタルが連続して現れることも、市場における別の迷いのポイントを示しています。したがって、このPattern-4では、その両方のいずれかでのブレイクアウトがシグナルとして利用されます。
スイングハイとスイングローに対するフラクタルの確認(Pattern-5)
このパターンでは、一連のローソク足の値動きがフラクタルの基準点とどのように関連しているかを見ます。強気の形成は、強気のフラクタル(多くの場合、潜在的なサポートレベル)が形成され、その後の価格がその水準を大きく下回らない場合に定義されます。価格がこのレベルで何度も反発するならば、そこが強気のサポートゾーンであるという見方が強まります。
逆に、弱気の形成はフラクタルの高値が形成され、その後の価格がそのフラクタル高値を上回れない場合に確立されます。このことは、価格がフラクタル高値を越えられないことがレジスタンス帯としての役割を強め、弱気のシグナルとなることを示しています。このパターンは、MQL5では以下のように実装されます。
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_5(ENUM_POSITION_TYPE T) { vector _std; _std.Init(5); _std.Fill(0.0); if(T == POSITION_TYPE_BUY && FractalLow(X() + m_periods) != 0.0) { if(_std.CopyRates(m_symbol.Name(), m_period, 4, 0, m_periods) && _std.Std() <= fabs(Close(X()) - Close(X() + m_periods))) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + m_periods)) { if(_std.CopyRates(m_symbol.Name(), m_period, 2, 0, m_periods) && _std.Std() <= fabs(Close(X()) - Close(X() + m_periods))) { return(true); } } return(false); }
上記のコードでは、必要なレートのバッファをコピーするだけでなく、標準偏差を効率的に算出するためにベクターを使用しています。得られた標準偏差は、Pattern-2でおこなったように、終値の現在のトレンドの大きさと比較しています。Pattern-2で指摘した欠点や注意点はここでも当てはまるため、添付のコードを適宜修正して活用していただいて構いません。
同じ通貨ペア、時間枠、検証期間で最適化後におこなったフォワードウォークの結果は以下の通りです。
これまでこのシリーズではフォワードウォークをおこなっていませんでしたが、テスト期間が非常に短いため、今後は標準としてフォワードウォークも含めることにしました。ただし、記事が冗長になりすぎるため、トレーニング期間における最適化の詳細な検証は省略する予定です。
フラクタル失敗スイング(Pattern-6)
Pattern-6は、価格がフラクタル水準を突破できずに「失敗」する動きに注目します。強気のケースでは、強気のフラクタル・スイングが形成された後、価格がさらに下へ抜けようとしますが、その試みが失敗し、素早く反転して上昇した場合、これは売り手の力が尽き、買い手が市場に入り込む必要があることを示すことが多いです。
逆に弱気の場合は、フラクタル高値が形成された後、価格がこのフラクタル高値を上回ろうとするも失敗した場合、この「スイング失敗」は売り手が優勢であり、価格は下落トレンドへ向かう可能性が高いことを示唆します。以下にMQL5での実装を示します。
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_6(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X() + 2) != 0.0) { if(Low(X() + 1) <= FractalLow(X() + 2) && Close(X()) >= High(X() + 2)) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + 2) != 0.0) { if(High(X() + 1) >= FractalHigh(X() + 2) && Close(X()) <= Low(X() + 2)) { return(true); } } return(false); }
このパターンは、実装という観点では最もシンプルなものの一つです。前述のとおり、強気パターンにおいては、直近の安値をその前のフラクタル安値と比較し、さらに終値を2本前の高値と比較するだけです。弱気パターンではその逆をおこないます。どれだけ過去に遡って比較するかは、読者が必要に応じて調整できます。
パターン0〜5と同様に、本パターンの始値および終値の閾値を最適化した後、フォワードウォークテストをおこなった結果、以下のようなレポートが得られました。
フラクタル高値(または安値)がその後のローソク足によって上回られ(または下回られ)ない場合、それは拒否のサインと見なされます。これは、トレンドの勢いが尽きたことを示す強力なシグナルとなります。
移動平均線付近でのフラクタルの集中(Pattern-7)
8つ目のパターン、Pattern-7は、フラクタルインジケーターと移動平均線を組み合わせたものです。強気のセットアップでは、一連のフラクタル安値が移動平均線(たとえば50期間のMA)の近辺に集中して形成されると、それはその移動平均線が強力なサポートとして機能していることを示唆します。こうしたフラクタル安値は、買いエントリーの機会とされ、価格が直近のレジスタンスや移動平均線そのものを明確に上抜けた場合、その強気のシナリオが確認されます。
弱気のパターンでは、複数のフラクタル高値が移動平均線の周辺に密集しており、これがレジスタンスとして機能していると解釈されます。こうしたレベルで価格が繰り返し反落し、最終的にサポートまたは移動平均線を明確に下抜けた場合、弱気バイアスが確認されることになります。MQL5での実装は次の通りです。
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_7(ENUM_POSITION_TYPE T) { CArrayDouble _buffer; if(T == POSITION_TYPE_BUY) { for(int i = 1; i < m_periods; i++) { if(FractalLow(X() + i) != 0.0) { _buffer.Add(fabs(FractalLow(X() + i) - MA(X() + i))); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] <= fabs(Close(X() + 1) - Close(X() + m_periods)) && Close(X() + 1) <= MA(X() + 1) && Close(X()) > MA(X())) { return(true); } } else if(T == POSITION_TYPE_SELL) { for(int i = 1; i < m_periods; i++) { if(FractalHigh(X() + i) != 0.0) { _buffer.Add(fabs(FractalHigh(X() + i) - MA(X() + i))); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] <= fabs(Close(X() + 1) - Close(X() + m_periods)) && Close(X() + 1) >= MA(X() + 1) && Close(X()) < MA(X())) { return(true); } } return(false); }
Pattern-7は、Pattern-2やPattern-3と同様に標準の配列クラスを使用していますが、今回はフラクタルポイントと移動平均線とのギャップの大きさを記録するために使用されます。前述のように、ここで探しているのはこのギャップができる限り小さい場面であり、そのため、バッファに格納されたすべてのギャップ値の中から最大値を取得します。今回もこの大きさを現在の終値におけるトレンドの変動幅と比較します。Pattern-6などで述べた通り、この比較方法には注意点があるため、読者がコードを修正して調整できるよう推奨します。
先に紹介した他のパターンと同様に、同じ通貨ペア・時間足を用いて、Pattern-7の入力パラメータを最適化した後にフォワードウォークを実施した結果は以下の通りです。
多くのフラクタルが移動平均線付近に形成されると、その付近が転換点であることが示唆されます。そこからのブレイクアウトは、トレンドの継続または反転を確認するシグナルとなります。
フラクタルギャップパターン(Pattern-8)
Pattern-8では、強気シグナルは、強気のフラクタル安値が価格ギャップ付近に現れたときに発生します(このようなギャップは通常、高ボラティリティやニュースによる急変時に生じます)。この場合、ギャップがサポート領域として機能します。ギャップ付近にフラクタルが存在することは、「この価格帯を買い手が注目しているサイン」と解釈されます。ギャップが「埋められる」か、価格がその上で推移すれば、上昇への動きが見込まれます。
弱気パターンでは、弱気のフラクタル高値が上方向に開いた価格ギャップ付近に出現することが条件です。このケースでは、ギャップがレジスタンス(レジスタンス線)の役割を果たします。ギャップにフラクタルが現れるということは、「売り手がその水準を守っている」ことを示唆します。もし価格が下落を始めれば、弱気トレンドが確定する可能性があります。このパターンは、MQL5では以下のように実装されます。
//+------------------------------------------------------------------+ //| Check for Pattern 8. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_8(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X() + 2) != 0.0) { if(Low(X() + 1) > High(X() + 2) && Close(X()) >= High(X() + 2)) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + 2) != 0.0) { if(High(X() + 1) < Low(X() + 2) && Close(X()) <= Low(X() + 2)) { return(true); } } return(false); }
Pattern-8では、価格ギャップの存在に注目するだけでよいため、上記の実装はPattern-6と同様に非常にシンプルです。
また、これまでと同様の銘柄(USD/JPY)、テスト環境(4時間枠)、および2023年というテスト期間におけるフォワードウォークの結果は以下の通りです。
価格ギャップとフラクタルのブレイクアウトが重なると、価格の動きが一段と強まる傾向があります。ただし、こうしたセットアップはニュース主導の相場でよく見られます。
フラクタルとフィボナッチ水準の一致(Pattern-9)
最後のパターンは、フラクタルとフィボナッチリトレースメントを組み合わせたものです。強気のパターンは、安値フラクタルが主要なフィボナッチ水準と重なる場合に成立します。フラクタルによって特定されたサポートと、フィボナッチ水準が一致することで、そのサポートの信頼性が高まります。この二重の根拠は、価格がその水準を維持すれば、反発またはトレンド継続の強力なシグナルとなります。通常、これは反発またはトレンド継続のシグナルである可能性があります。
弱気のパターンでは、高値フラクタルが重要なフィボナッチ水準と一致します。この一致は、その価格帯におけるレジスタンスをより強固にします。価格がフィボナッチゾーンを超えられず、代わりにこの一致ゾーンから下落した場合、これは弱気シグナルの確定となります。両方のセットアップは以下のようにMQL5で実装されます。
//+------------------------------------------------------------------+ //| Check for Pattern 9. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_9(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X()) != 0.0) { if(Is_Fibo_Level(X())) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X()) != 0.0) { if(Is_Fibo_Level(X())) { return(true); } } return(false); }
最後のパターンのコードは少し考えにくかったです。なぜなら、手動取引では常に明白で明確なことが、自動化になると必ずしもそうではないからです。たとえば、フィボナッチ水準をどのように「プロット」し、マーキングするのでしょうか。これを助けるために、Is_Fibo_Level()という簡単な関数を考案しました。以下がそのコードです。
bool Is_Fibo_Level(int ind) { double _r=0.0; vector _h,_l; int _size = 3 * PeriodSeconds(PERIOD_MN1) / PeriodSeconds(m_period); _h.Init(_size); _l.Init(_size); if(_h.CopyRates(m_symbol.Name(),m_period,2,0,_size) && _l.CopyRates(m_symbol.Name(),m_period,4,0,_size)) { _r = _h.Max()-_l.Min(); if(_l.Min()-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+ATR(ind)) { return(true); } else if(_l.Min()+(0.236*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.236*_r)+ATR(ind)) { return(true); } else if(_l.Min()+(0.382*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.382*_r)+ATR(ind)) { return(true); } else if(_l.Min()+(0.5*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.5*_r)+ATR(ind)) { return(true); } else if(_l.Min()+(0.618*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.618*_r)+ATR(ind)) { return(true); } else if(_h.Max()-ATR(ind) <= Close(ind) && Close(ind) <= _h.Max()+ATR(ind)) { return(true); } } return(false); }
この関数は単に過去3ヶ月間の価格をサンプリングしているだけであり、この任意の期間では、手動の環境で重要な価格レベルを捉えるほど正確ではありません。よく「結果がすべてを証明する」と言われるように、手動トレードでの見方が必ずしも取引の成績に直結するわけではないため、これをPattern-9として発展させ、フラクタルポイントとこの関数で得られたレベルの一致を単純に探す形にしています。ATRも非常に簡素な形で使われ、レベルの幅を設定するために利用されています。したがって、3ヶ月間の期間にボラティリティが低い場合は多くの重なりが発生する可能性が高くなります。これは、改良を加えたい読者にとっての出発点となるでしょう。
他の5つのパターン同様、フォワードウォークをおこなった結果が以下の通りです。
したがって、このパターンは重要な反転ゾーンの確認として機能します。本シリーズでは、パターンを検証する際に、これまで紹介してきた10種類のパターンそれぞれだけでなく、すべてのパターンを組み合わせて使う可能性も検討してきました。
パターンの組み合わせ
添付したコードは、10種類すべてのパターンをカスタムシグナルクラスの形で実装しています。このクラスはMQL5ウィザード内で利用し、EAを組み立てます。これをおこなう方法については、こちらとこちらにガイドがあります。 上記でおこなった個別パターンの最適化やテスト実行では、入力パラメーター「maps_used」にパターンのインデックスの2のべき乗という特別な値を割り当てていました。たとえばパターン5なら2^5=32、パターン7なら128、という具合です。しかし複数パターンを同時に取引する場合、このパラメーターは特定のパターンを指すポインタではなく「マップ」として機能します。パターンが10個あるため、maps_usedの最大値は2^10−1、すなわち1023となります(カウントは0から始まるため)。
標準の始値・終値の閾値で最適なパターンの組み合わせを求めたところ、最良の入力設定は以下の通りです。
訓練データに対するテスト実行では、以下のレポートが得られました。
そして翌年2024年のフォワードウォークでは、以下の結果が得られました。
これらの結果は、これまでの記事で強調してきたことを示していると思います。つまり、パターンの組み合わせにはトレーダーの専門的な知識が必要であり、非常に慎重にパターンを組み合わせるべきだということです。最適化の結果だけに頼って答えを求めるべきではありません。上記の個別パターンはフォワードウォークに耐えられるものでしたが、これは1年間のテストに基づくものであり、より長いテスト期間が望ましいことは言うまでもありません。そして、過去の成績が未来の結果を保証するものではないことも常に念頭に置くべきです。しかしながら、このことはシグナルとして用いるパターンを選択する際、単に平均化するのではなく、より焦点を絞ったアプローチを取ることの重要性を物語っています。
時間枠の重要性
フラクタルの解釈は、使用する時間枠によって大きく左右されます。H4(4時間足)、日足、週足といった高時間足は、市場のノイズを多く取り除くため、より強力で信頼性の高いシグナルを提供します。これらの時間枠上のフラクタルは、機関投資家や長期トレーダーが注目する重要なサポート・レジスタンスレベルを示すことが多いです。シグナルの形成はゆっくりですが、その分確度が高いセットアップとなるため、多くのトレーダーにとっては待つ価値があります。
一方で、M15、M20、M30などの短時間枠はシグナルの出現頻度は高いものの、短期的な価格変動の影響を受けやすく信頼性が低いことがあります。これらは素早い反応が求められるスキャルピング戦略に適していますが、偽のブレイクアウトが多発する傾向があるため、追加のフィルターが必要です。
また、H1、H2といった中間的な時間枠もあり、理論上は高時間足と短時間足の良いとこ取りが期待されます。読者の方にはぜひご自身でその有効性を検証いただきたいですが、実務的には高時間枠のフラクタルと組み合わせて使うことで効果的に機能するとされています。
結論
フラクタルは流動性が高く、機関投資家の関心が強い市場においては信頼性の高い指標となる傾向があります。一方で、取引量の少ない相場の急激な価格変動は、すぐに無効化される偽のフラクタルを生み出しやすいため、フラクタルに基づく判断には出来高分析やフットプリントチャートを併用して信頼性を高めることが推奨されます。
以上を踏まえ、本稿ではこの非常に「重要な」インジケーターの10種類のパターンを検証しました。小さい時間足では大きな欠点もありますが、大きな時間枠で辛抱強く使うことで、いくつかのパターンで1年間のテストを通じてフォワードウォークによる興味深い結果が得られる可能性が示されました。
ファイル | 説明 |
---|---|
SignalWZ_56.mqh | シグナルクラスファイル |
WZ_56.mq5 | 含まれているファイルを紹介するEAファイル |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/17334
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索