
知っておくべきMQL5ウィザードのテクニック(第42回):ADXオシレーター
はじめに
ADX指標(英語)は、市場の特定のトレンドが、それが関連付けられているセキュリティに対してどの程度強いかを測定することを目的としたオシレーターです。したがって、この記事では、これまでの記事と同様に、ウィザードで組み立てられたエキスパートアドバイザー(EA)のカスタムシグナルクラスファイルでこのインジケーターによって表示されるさまざまなパターンを調べます。RSI、ボリンジャーバンド、RSIを扱った以前の記事と同様に、一度に1つのパターンを確認し、最後にすべてのパターンを含むテストを実行して、どのパターンが最も重み付けされているかを把握します。
ただし、これに取り掛かる前に、パラボリックSARの検討をまだ終えていなかったので、その結論の章から始めます。
SARと出来高のダイバージェンス
この記事を要約すると、パラボリックSARは主に、潜在的な反転ポイントを特定し、トレンド市場でストップロスを追跡するために使用されます。これらは「潜在的な反転ポイント」です。価格がこれらを突破すると、インジケーターは高値と安値の範囲の反対側にドットをマークして反転するため、価格チャートに生成されたポイントは価格アクションの潜在的な反転レベルになります。ドットでマークされたこれらのポイントは、価格を下回る(上昇トレンド)か上回る(下降トレンド)かのいずれかを追跡し、トレーダーがこれらの反転を監視できるようにします。
出来高のダイバージェンスとは、価格と取引量が反対方向に向かうことです。外国為替トレーダーにとって、「取引量」データは複数のブローカーやプラットフォームに分散しているため、実用的な概念ではありません。これを代用するインジケーターとしては、価格のバー範囲またはボラティリティが挙げられます。したがって、ボラティリティの低下と相まって、どの方向においても価格が上昇すれば、継続の形でシグナルインジケーターとして機能する可能性があります。
たとえば、パラボリックSARが価格の下から上に反転し(売りシグナルを示す)、これに価格バー範囲の低下が伴う場合、これは弱い売りシグナルとして解釈され、以前の長期トレンドの継続の前兆として解釈されます。同様に、価格がSARの上限ポイント(下降トレンドの価格より上)に達し、ボラティリティのダイバージェンスが見られる場合(価格、バー、範囲の減少)、これは下降トレンドが強まる可能性、または下降継続の始まりを示すシグナルとなります。このパターンは次のようにコーディングします。
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalSAR::IsPattern_7(ENUM_POSITION_TYPE T) { m_sar.Refresh(-1); m_sar_alt.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < Low(StartIndex() + 1) && Base(StartIndex()) > High(StartIndex())) { return(Range(StartIndex()) < Range(StartIndex() + 1) && Range(StartIndex() + 1) < Range(StartIndex() + 2)); } else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > High(StartIndex() + 1) && Base(StartIndex()) < Low(StartIndex())) { return(Range(StartIndex()) < Range(StartIndex() + 1) && Range(StartIndex() + 1) < Range(StartIndex() + 2)); } return(false); }
上記の情報源から注目すべき点は、現在、より大きな以前のトレンドに焦点を当てており、最初のパターン0などのパターンと同じ単純な方法でシグナルを使用していないことです。事実上、これは反トレンドシグナルです。なぜなら、弱い反転での継続パターンを探しているからです。この「弱い」反転は、価格バーの範囲が3バー以上下落することによって確認されます。この長さ3は調整可能ですが、テスト目的のため、この長さのままにします。
逆に、ボラティリティの上昇時に価格がいずれかのSARドット閾値に達した場合、それはSARの反転の確認としてシグナルとなるはずです。このシグナルも出来高のダイバージェンス理論に基づいており、本質的には、SARに関する以前の記事で説明したパターン0に、価格バー範囲の増加のチェックを加えたものになります。この特定のパターンは実装もテストもされていませんが、いつものように読者の皆さんはぜひ調べてみてください。
さらに、このパターンでは、トレーダーはパラボリックSARと並行して出来高のダイバージェンスを利用して、戦略的なストップロス調整をおこなうことができます。強い継続を示唆する弱い反転を探していた上記の最初の出来高のダイバージェンス設定に戻ると、これらのシグナルはトレンドの一時停止を意味し、主要なサポートまたはレジスタンスレベルを示している可能性があります。弱いSAR反転とボラティリティの低下によりこれらを特定することで、トレーダーは、ポジションがショートの場合はこれらのゾーンのすぐ上、ポジションがロングの場合はこれらのゾーンのすぐ下になるように、支配的なトレンドに従うポジションにストップロスを設定または移動できます。
パラボリックSARは、レンジ相場や不安定な市場で多くの誤ったシグナルを生成する可能性があるため、理論上は出来高のダイバージェンスチェックが有益となる可能性があります。特にボラティリティが上昇している場合は、SARのマーカーを突き抜けてボラティリティが上昇すると、発展中のトレンドに大きな勢いが加わることを示すことが多いため、市場への早すぎる参入を避けるのに役立ちます。さらに、これが不十分な場合は、他のインジケーターと組み合わせることもできます。
これらの組み合わせは、RSIなどのオシレーターの方が適している可能性があります。また、反転を確認するのではなく継続を確認するSAR出来高のダイバージェンスの最初の実装をコーディングしただけなので、読者は反転時にこれらの追加のインジケーターチェックをコーディングする準備をする必要があります。2022年にわたって日次時間枠で外国為替ペアEURUSDのパターン7を使用してテストすると、次の結果が得られます。
パターン7に使用するビットマップパターン整数は0x80で、これは10進数値と入力整数128に変換され、設定するとEAはパターン7を使用してのみ取引をおこないます。
より上位の時間枠での逆SAR
より上位の時間枠でのパラボリックSARは、より広いトレンドの視点を提供するのに非常に優れており、より下位の時間枠でよく見られる誤った反転によるノイズを除去するのに役立ちます。 週足チャートのSARが強い上昇トレンドを示している場合、4時間足チャートを使用するトレーダーはロングポジションを優先し、より短い時間枠の売りシグナルを潜在的なノイズまたは短期的な引き戻しとして無視することができます。
2つの時間枠のシグナルが一致する場合、さらに強いシグナルが示されます。4時間足が強気で、15分足がSARが価格帯の下限を示す反転を示している場合、この特定のポイントは強いシグナルだけでなく、「より鋭い」エントリも示す可能性があります。 逆トレンド取引を使用する戦略もありますが、「トレンドはあなたの味方」という格言が多くのトレーダーに役立ってきたため、これらはリスクを伴う可能性があります。複数の時間枠でのSARの確認に依存することで、信頼性の低い逆トレンドのエントリによるリスクを回避できます。
SARはエントリシグナルとしてだけでなく、エグジットインジケーターとしても機能します。開始閾値と終了閾値を活用するウィザードで組み立てられたEAとその付属クラスを使用することで、追加コードを提供しなくても実際にこれを実装できるようになります。この記事の最後に添付されているコードの使用と、それをEAに組み込む方法については、新しい読者向けに、こことここの記事で説明されています。MQ5拡張ファイルは、ウィザードを実行した後にアセンブルされたファイルがどのようになるかを示すため、またEAをアセンブルするときに必要となる必要なファイルを適切に参照するためにのみ含まれています。したがって、複数の時間枠でチェックをおこなうことで、終了がより正確になり、理論上はパフォーマンスが向上するはずです。
トレーダーは、上位時間枠のSARレベルを使用して、下位時間枠で取ったポジションのストップロスレベルを設定することもできます。このアプローチにより、ストップが重要なレベルに設定され、短期的なボラティリティによって時期尚早にストップアウトされる可能性が低減されます。 より長い時間枠のSARトレンドはより長く続く市場トレンドを示している可能性がありますが、より短い時間枠はこれらの大きな動きを活用するためのエントリポイントを捉えます。MQL5では、これを次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 8. | //+------------------------------------------------------------------+ bool CSignalSAR::IsPattern_8(ENUM_POSITION_TYPE T) { m_sar.Refresh(-1); m_sar_alt.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) > High(StartIndex() + 1) && Base(StartIndex()) < Low(StartIndex())) { return(Alt(StartIndex()) < LowAlt(StartIndex())); } else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) < Low(StartIndex() + 1) && Base(StartIndex()) > High(StartIndex())) { return(Alt(StartIndex()) > HighAlt(StartIndex())); } return(false); }
上記と同様のテスト設定でパターン7を使用してテストを実行しますが、代替時間枠として週単位の時間枠を使用すると、次の結果が得られます。
9番目のパターン(パターン8)を表すために、256の入力ビットマップを使用します。 つまり、要約すると、上位時間枠のSARは、下位時間枠のシグナルが動作しているより大きな市場コンテキストをトレーダーが理解するのに役立ちます。このコンテキストビューは、過剰な取引や、全体的な傾向と一致しない重要でないシグナルに基づく行動を回避するのに役立ちます。
SARとRSIの重複
RSIは、本連載の最近の記事で強調されているように、価格変動の速度と変化を測定するオシレーターであり、通常は買われすぎや売られすぎの状態を検出するために使用されます。これは0から100のスケールで動作し、70を超えると買われすぎの状態を示し、30を下回ると売られすぎの状態を示します。これをSARと組み合わせると相互補完が可能になり、傾向を特定するのに役立ちます。
パラボリックSARは、現在のトレンドや潜在的なトレンドの反転を識別するのに効果的ですが、不安定な市場や横ばい市場では誤ったシグナルを生成する可能性もあります。このため、RSIはモメンタム分析の層を追加し、市場が実際に買われ過ぎか売られ過ぎかを確認するのに役立ち、SARによって特定されたトレンドの強さや弱さを再確認することができます。 したがって、パラボリックSARが価格を下回って上昇トレンドを示し、RSIが30前後の数値(売られ過ぎの状態を示す)を示すと、トレンドの反転が本物である可能性が高く、上昇の勢いがあるというシグナルが強まります。
ただし、SARとの組み合わせは2つの効果をもたらします。思い出してください。RSIは勢いのインジケーターであり、勢いや特定の傾向が持続する市場でのバーストが頻繁に発生します。このため、上で述べたように、デフォルトではSARを使用して「買われすぎ」の状況を確認しますが、多くの場合、SARは一般的な勢いを確認するためにも役立ちます。特に、SARの反転インジケーターの状況からズームアウトし、各トレンドに沿ったドット価格のギャップまたはドットの変化を確認すると、その効果が顕著になります。これらは明らかにSAR-RSIペアリングに代わる選択肢を提示しています。ただし、これを実装するのではなく、ここでは議論のポイントとして提示するだけです。代わりに、次のようにMQL5で実装する「従来の」アプローチを使用します。
//+------------------------------------------------------------------+ //| Check for Pattern 9. | //+------------------------------------------------------------------+ bool CSignalSAR::IsPattern_9(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Base(StartIndex()) < Low(StartIndex())) { return(RSI(StartIndex()) <= 30.0); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > High(StartIndex())) { return(RSI(StartIndex()) >= 70.0); } return(false); }
上記のリストでテストしても、日足の時間枠が続く傾向があるため、多くの取引は得られません。これは、上で強調したように、このSAR-RSIの組み合わせを実装できる2番目の方法の根拠となります。これらのテストの結果を以下に示します。
さまざまなパターンにわたるインジケーターを確認する場合と同様に、テストウィンドウ期間中に各パターンのカスタム閾値を使用して複数のパターンを厳選した、最適化されたテストレポートで締めくくっています。パラボリックSARの同様のテスト結果を以下に示します。
私の意見では、それぞれの理想的な閾値を持つ複数のパターンを使用することは、これらの閾値が厳選されたり、フォワードテストなしで狭い期間にわたって最適化されたりしない限り適切です。実際の使用からのパフォーマンス評価に基づいて、プリセット値を使用して使用またはテストすることをお勧めします。
ADXの概要
ADXオシレーターは、3つのバッファを使用して特定のトレンドの強さを測定します。これらのうち、DI+とDI-は、事前に設定された方向における価格の強さを測定するため、別々のインジケーターとして考えることができます。DI+(別名、正方向指数)は上昇トレンドの強さを測定し、DI-(負方向指数)は下降トレンドの強さを数値化します。したがって、DI+がDI-を上回っている場合、買い手が売り手よりも影響力を持っていることを示し、逆もまた同様です。
DI+バッファは、前回の高値を上回る過去の価格変動から導き出されます。つまり、今日の高値が昨日の高値より大きい場合、正のDI+値が記録されます。逆に、DI-は、現在の安値のうち前日の安値を下回る部分から取得されるため、日次時間枠が使用されていると仮定すると、前日の安値を下回る安値を取得した場合にDI-のバッファ値が記録されます。
DI+とDI-の計算式は次のとおりです。
DI+ = (平滑化された正の方向の動き/ ATR) × 100
DI- = (平滑化された負の方向の動き/ ATR) × 100
ATRコンポーネントは、その時点での一般的なボラティリティを考慮してインジケーターの値を正規化する役割を果たすため、これらのバッファの重要な部分です。これは、予想どおり、高値や安値の大きな変化は不安定な環境で頻繁に発生する傾向があるため、True Range (TR)に正規化することで、TRに関係なく大きな動きのみがインジケーターバッファで適切に重み付けされるからです。TRは、現在の高値から現在の安値を引いた値、現在の高値から前回の終値を引いた値、前回の終値から現在の安値を引いた値の3つのオプションのうち最大のものを選択して計算されます。これらのバッファからのシグナルは、以下に示すように、それらの交差点からだけでなく、他のインジケーターの組み合わせからも観察されます。
DI+とDI-を備えたADXクロスオーバー
最初のパターンであるパターン0では、DI+がDI-を上回ったときに強気シグナルが示され、買い圧力が売り圧力よりも強いことを示し、上昇トレンドの始まりを示す可能性があります。逆に、弱気シグナル(DI- > DI+)DI-がDI+を上回ると、売り圧力が買い圧力よりも強いことを示し、下降トレンドの始まりを示す可能性があります。MQL5では、このパターンを以下のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && BasePlus(X() + 1) < BaseMinus(X() + 1) && BasePlus(X()) > BaseMinus(X())) { return(true); } else if(T == POSITION_TYPE_SELL && BasePlus(X() + 1) > BaseMinus(X() + 1) && BasePlus(X()) < BaseMinus(X())) { return(true); } return(false); }
ADXメインバッファは、トレンドの方向ではなく強さを測定します。これは0から100の間で変動し、25を超える値は強いトレンドを示し、25未満の値は弱いまたはトレンドのない市場を示唆します。再度強調しておくべき重要な点は、ADXはトレンドが強気か弱気かを示すものではなく、単にトレンドの強さを測定するものであるということです。ADXが上昇し、DI+がDI-を上回っている場合、強い強気トレンドを示します。ADXが上昇し、DI-がDI+を上回っている場合、強い弱気トレンドを示しています。
2022年のEUR CHF外国為替ペアの日次時間枠で、開始閾値と終了閾値、および利益確定レベルについてこのパターンを最適化すると、「理想的な」設定の1つで次の結果が得られます。
25を超えるADX - 強いトレンドのエントリ
上記ではDI+とDI-の2つのDMIバッファについて説明しましたが、ADXの3番目のバッファがメインバッファです。0から100の範囲の読み取り値も提供します。まず方向指数を決定して計算します。方向指数は以下の式で求められます。
ここで
- DXは求められる方向インジケーターである
- +DIは、すでに決定されているプラス方向の動きであり、その式は上に示されている
- -DIは負の対応物であり、その式も上記されている
方向指数(DX)を取得したら、平均方向指数を取得するには、過去14個の方向指数値の指数移動平均を取得するだけです。あるいは、以下の式に従う平滑化アプローチを使用することもできます。
ここで
- nは14、またはADXインジケーターに入力される任意の適切な平均期間
MQL5では以下のように実装されています。
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Base(X()) > 25.0 && BasePlus(X()) > BaseMinus(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Base(X()) > 25.0 && BasePlus(X()) < BaseMinus(X())) { return(true); } return(false); }
パターン0と同様の環境設定で最適化すると、2022年の毎日の時間帯で銘柄がEUR CHFとなり、次の結果が得られます。
ADXが25を下回る - トレンドの弱さ
パターン2は、パターン1の逆を利用し、ADXメインバッファが25を下回るインスタンスを探し、DI+からDI-のスプレッドで示される現在のトレンドに逆らいます。したがって、ADXが上から25を下回り、DI-がDI+を上回っている場合は、弱気の勢いが弱まっている兆候であるため、強気と解釈されます。同様に、DI+がDI-を上回っているときに同じADXクロスが発生した場合、これも初期兆候として弱気となります。MQL5では以下のように実装されています。
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_2(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Base(X()+1) > 25.0 && Base(X()) < 25.0 && BasePlus(X()) < BaseMinus(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Base(X()+1) > 25.0 && Base(X()) < 25.0 && BasePlus(X()) > BaseMinus(X())) { return(true); } return(false); }
上記のパターンと同じ設定で最適化テストを実行すると、パターン2では次の結果が得られます。
ADXと移動平均のクロスオーバー
パターン3の場合、適用される補足移動平均は、一般的な価格移動平均ではなく、ADXメインバッファの移動平均値の別のバッファです。これもADXと並行するバッファとして追跡することができ、価格チャートで価格が移動平均バッファを横切るのと同じ方法でADXがこれを横切ると、これは強力なシグナルとなることがよくあります。ADX自体は方向性が中立ですが、同様のクロスオーバーによって、ロングかショートかを問わず、一般的なシグナルの強さを示すだけであることを思い出してください。これをコードで次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_3(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Base(X()+1) < BaseAverage(X()+1) && Base(X()) > BaseAverage(X()) && BasePlus(X()) > BaseMinus(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Base(X()+1) < BaseAverage(X()+1) && Base(X()) > BaseAverage(X()) && BasePlus(X()) < BaseMinus(X())) { return(true); } return(false); }
上記のパターンで使用したものと同様の設定で、選択した最適化結果からのテスト実行を以下に示します。
ADXと価格ダイバージェンス
ADXとのダイバージェンスは、主要証券の価格チャートにおける一般的な価格変動に基づいています。しかし、この「ダイバージェンス」は、価格チャート上のどちらの方向への強いトレンドに対しても、メインのADXバッファの低下を常に監視するという点で、少し奇妙です。したがって、強気のダイバージェンスは、オシレーターのメインバッファのADXの低下と同時に、証券の価格チャートで価格が下落することによって示されます。また、弱気のダイバージェンスは、価格チャート上では強気の傾向が見られるものの、オシレーターADXは下落していることが特徴です。MQL5では以下のように実装されています。
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_4(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()+2) > Close(X()+1) && Close(X()+1) > Close(X()) && Base(X()+2) > Base(X()+1) && Base(X()+1) > Base(X()) && Base(X()) <= 25) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()+2) < Close(X()+1) && Close(X()+1) < Close(X()) && Base(X()+2) > Base(X()+1) && Base(X()+1) > Base(X()) && Base(X()) <= 25) { return(true); } return(false); }
いくつかの最適な設定をテスト実行すると、次の結果が得られます。
ADXとレンジブレイクアウト
パターン5は、上記の4と同様に、証券の価格チャートからの価格変動に依存してシグナルを展開および確認します。しかし、今回のケースでは、ADXが25の閾値を超えて急上昇し、長期間の統合後に価格が急上昇することを期待しています。強気シグナルとは、ADXが25を超えると同時に抵抗線を突破して価格が上昇することです。同様に、弱気シグナルは、ADXが25を超えて上昇することによって裏付けられたサポートを下回る価格の下落です。MQL5では以下のように実装されています。
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && ATRAverage(X()+1) > ATR(X()+1) && ATRAverage(X()) < ATR(X()) && ATR(X()) < High(X())-Low(X()) && Base(X()+1) < 25 && Base(X()) > 25 && Close(X()+1) < Close(X())) { return(true); } else if(T == POSITION_TYPE_SELL && ATRAverage(X()+1) > ATR(X()+1) && ATRAverage(X()) < ATR(X()) && ATR(X()) < High(X())-Low(X()) && Base(X()+1) < 25 && Base(X()) > 25 && Close(X()+1) > Close(X())) { return(true); } return(false); }
統合とブレイクアウトをコードで簡潔に定義するのは、手動トレーダーにとっては簡単なことですが、非常に面倒です。これを回避するには、ATRインジケーターに頼り、かなり長い期間にわたってその測定値を取得し、それを最近の価格バーの範囲と比較します。ATRが一定期間にわたって低調に推移し、最近の価格バーの範囲を下回っていた場合、それはブレイクアウトを意味する可能性があります。これは決して正確ではありませんし、より徹底した実装もできると思いますが、この記事の目的にはこれで十分でしょう。すでに上で説明したパターンと同様の設定でテストを実行すると、最適な最適化の結果、次のレポートが得られます。
すべてのパターンに対して同様のテスト環境と設定をおこなうよう努めていますが、この特定のパターンでは日次時間枠を使用した場合にほとんど取引がおこなわれませんでした。そのため、例外を設けて、1時間単位の時間枠を最適化し、より多くのブレイクアウトが見られ、取引を行えるかどうかを確認しました。したがって、上記の結果は、上記の他のパターンの場合のように日次ではなく時間単位に基づいています。
結論
ここでADXの検討を一時停止する必要があります。次に検討するインジケーターの一部として考慮されるパターンがさらに3つあるためです。要約すると、パターンベースでADXを調べましたが、これはウィザードで組み立てられたEAのシグナルクラスで可能なことです。これは、これらを処理するのに役立つコードが「Expert Signal」クラスにすでにいくつかあるためです。EAの組み立てに使用されるウィザードアセンブリクラスは、特に初期段階でアイデアを調査またはテストするときに、ゼロからコードを作成する必要性を明らかに排除する多くの関数とメソッドを提供します。パターンの使用以外にも、保留中の注文の使用、注文フローのカスタマイズ、いつでも開くことができる同時ポジションの数、トレーリングストップだけでなく初期のストップロスとテイクプロフィットレベルの価格ギャップ入力パラメータをガイドするためのATRなどのインジケーターの使用など、本連載内でまだ検討していない領域があります。将来的には、これらやその他の内容も検討できるようになると思いますが、それまでは、基本的な内容に焦点を当てます。パターンと一般的なインジケーターです。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/16085




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