
知っておくべきMQL5ウィザードのテクニック(第39回):RSI (Relative Strength Index)
はじめに
前回の記事では、ウィザードで組み立てられたエキスパートアドバイザー(EA)のカスタムシグナルクラス内で使用されるボリンジャーバンドについて検討を始めました。カスタムシグナルクラス内でロングとショートの条件を重み付けする際に、トレーダーに役立つ可能性のある8つの設定のうち最大6つについて詳しく見ていきました。記事が長くなりすぎたため、最後の2つの設定と、扱ったすべての可能なボリンジャーバンド設定やパターンの組み合わせテストについて説明しました。続いて、パターン6について見ていきましょう。
下降または上昇トレンド後に拡大するバンド
パターン6、すなわち7番目の設定は、主にボラティリティの上昇に関連しています。ボリンジャーバンドの上バンドと下バンドのギャップが広がることは、常にボラティリティの上昇を示唆する兆候と見なされます。このパターンの場合、ボラティリティの上昇はトレンドの終わりに発生することが多いため、価格の激しい変動が市場の特徴となり、これが以前のトレンドから反転する兆しであると推測されます。
そのため、この設定を解釈する際には、強気相場の後に上バンドと下バンドの間のギャップが拡大すると弱気シグナルと見なされ、弱気相場の後に同様にギャップが拡大した場合はロングシグナルを示します。つまり、これは最近の支配的なトレンドに逆らってポジションを開く逆張りシグナルです。MQL5では、このパターンを以下のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_6(ENUM_POSITION_TYPE T) { m_bands.Refresh(-1); m_close.Refresh(-1); m_high.Refresh(-1); m_low.Refresh(-1); if(Gap(StartIndex()) > Gap(StartIndex() + 1) && Gap(StartIndex() + 1) > Gap(StartIndex() + 2)) { if(T == POSITION_TYPE_BUY && m_close.GetData(StartIndex() + 2) < m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) < m_close.GetData(StartIndex() + 4)) { return(true); } else if(T == POSITION_TYPE_SELL && m_close.GetData(StartIndex() + 2) > m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) > m_close.GetData(StartIndex() + 4)) { return(true); } } return(false); }
上記のコードからわかるように、ボラティリティの拡大チェックは、強気および弱気の両方の設定における前提条件となっています。このチェックを通過すると、現在のトレンドではなく、ボラティリティの拡大が始まったときの以前のトレンドを考慮することになります。先に述べたように、この不安定な環境では、方向性がはっきりしないため、現在のトレンドは重要視せず、ボラティリティが急上昇する前のトレンドがより明確であることが多いです。
そのため、現在のトレンドが明確でないこの状況では、価格が反転することなく、この「統合ゾーン」から単にブレークアウトし、ボラティリティが急上昇する前の以前のトレンドが継続するというブレークアウト継続のリスクが常に存在します。これにより、ボリューム分析との統合が正当化されます。具体的には、バンドがボリュームの減少とともに広がる場合、これがトレンド反転の理論を確認するものとなります。一方、ボリュームが縮小しない場合、トレーダーはより適切な反転ポイントを待つべきだと言えます。前回の記事のパターン2で見たように、これが私たちの理論の核心部分でした。
ただし、ボリューム情報の取得は難しいため、主に価格バーの範囲を代理として使用しています。また、RSIなどの代替指標も、買われすぎや売られすぎの価格ポイントを確認するために活用できます。ウィザードで組み立てたEAのテストからは、次の結果が得られます。
バンドの向きと角度の変更
ボリンジャーバンドについて検討する最後のパターンは、上バンドと下バンド間のゆがみに関係しています。具体的には、下バンドが上バンドよりも速く上昇しており、その上昇速度の差がボリンジャーバンドの偏差入力パラメータ以上の場合、それを強気のシグナルとして解釈します。この理由は、このような設定が、上バンドの抵抗を抜けて価格が上昇するブレークアウトの前兆となるためです。さらに、実際の価格ブレークアウトが発生し、その形で確認が得られれば、このシグナルを補強し、エントリーポイントをより明確にすることができます。一方、弱気設定はこの逆を反映しています。高値が安値よりも速いペースで下降している場合、下バンドは突破される可能性のある支持として機能します。この場合も、価格が下バンドを下回って終値するなどの突破の確認シグナルを使用することで、信頼性を高めることが可能です。MQL5では以下のように実装されています。
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_7(ENUM_POSITION_TYPE T) { m_bands.Refresh(-1); m_close.Refresh(-1); m_high.Refresh(-1); m_low.Refresh(-1); if ( T == POSITION_TYPE_BUY && Lower(StartIndex()) > Lower(StartIndex() + 1) && Lower(StartIndex() + 1) > Lower(StartIndex() + 2) && Upper(StartIndex()) >= Upper(StartIndex() + 1) && Upper(StartIndex() + 1) >= Upper(StartIndex() + 2) && Lower(StartIndex()) - Lower(StartIndex() + 2) >= m_deviation * (Upper(StartIndex()) - Upper(StartIndex() + 2)) ) { return(true); } else if ( T == POSITION_TYPE_SELL && Upper(StartIndex()) < Upper(StartIndex() + 1) && Upper(StartIndex() + 1) < Upper(StartIndex() + 2) && Lower(StartIndex()) <= Lower(StartIndex() + 1) && Lower(StartIndex() + 1) <= Lower(StartIndex() + 2) && Upper(StartIndex() + 2) - Upper(StartIndex()) >= m_deviation * (Lower(StartIndex() + 2) - Lower(StartIndex())) ) { return(true); } return(false); }
このソースは、前述のように価格ブレークアウトの確認で補足することができます。完全なソースコードは記事の下部に添付されているので、読者はこれを実行できます。このように組み立てたEAを、厳密には8番目のパターンに相当するパターンの入力マップを80としてテストしてみると、次のような結果が得られます。
これは、パターン7だけを使用した最適化の1つです。ただし、前述のように、慣例を破り、複数のパターンを同時に使用できるようにすることで、カスタムシグナルを変更しました。したがって、パターンとそれぞれの開始/終了閾値の最適な組み合わせを検索するために、いくつかの最適化実行をおこなうと、次のようないくつかの妥当なテスト結果が得られます。
これらの結果に違いが見られることから、ボリンジャーバンドで複数のパターンを活用するケースが考えられます。このアプローチは、それぞれのシグナルが異なる市場環境に適応する一方で、互いに打ち消し合う可能性を考慮していれば合理的です。しかし、このような設計は、システムの証明や交差検証を難しくします。ただし、適切な品質のテストデータを用いることで、この課題を克服し、システムをさらに発展させることが可能です。 このボリンジャーバンドのカスタムシグナルクラスで使用されるパターンに基づいたロング条件とショート条件は、RSIカスタムクラスで使用するものと同じ入力マップを活用します。 以下に、ショート条件が単純にロング条件をミラーリングする形での一般的なロング条件のコードを示します。
//+------------------------------------------------------------------+ //| "Voting" that price will grow. | //+------------------------------------------------------------------+ int CSignalRSI::LongCondition(void) { int result = 0, results = 0; //--- if the model 0 is used and "Price Crossing the Upper Band or the Lower Band" if(((m_patterns_used & 0x01) != 0) && IsPattern_0(POSITION_TYPE_BUY)) { result += m_pattern_0; results++; } //--- if the model 1 is used and "Price Bouncing Off Lower Band or Upper Band " if(((m_patterns_used & 0x02) != 0) && IsPattern_1(POSITION_TYPE_BUY)) { result += m_pattern_1; results++; } //--- if the model 2 is used and "Price Squeeze Followed by a Breakout Above Upper Band or Below Lower Band " if(((m_patterns_used & 0x04) != 0) && IsPattern_2(POSITION_TYPE_BUY)) { result += m_pattern_2; results++; } //--- if the model 3 is used and "Price Double Bottoms Near Lower Band or Double Top Near Upper Band " if(((m_patterns_used & 0x08) != 0) && IsPattern_3(POSITION_TYPE_BUY)) { result += m_pattern_3; results++; } //--- if the model 4 is used and "Price Bounces Off the Middle Band from Above & Bounce Off from Below " if(((m_patterns_used & 0x10) != 0) && IsPattern_4(POSITION_TYPE_BUY)) { result += m_pattern_4; results++; } //--- if the model 5 is used and "Volume Divergence at Lower Band or Upper Band " if(((m_patterns_used & 0x20) != 0) && IsPattern_5(POSITION_TYPE_BUY)) { result += m_pattern_5; results++; } //--- if the model 6 is used and "Bands Widening After Downtrend or After Uptrend " if(((m_patterns_used & 0x40) != 0) && IsPattern_6(POSITION_TYPE_BUY)) { result += m_pattern_6; results++; } //--- if the model 7 is used and "Bands Orientation and Angle Changes " if(((m_patterns_used & 0x80) != 0) && IsPattern_7(POSITION_TYPE_BUY)) { result += m_pattern_7; results++; } //--- return the result if(results > 0) { return(int(round(result / results))); } return(0); }
どちらの条件でも、ビット演算を使用して、入力マップが特定のパターンの使用を許可しているかどうかを確認します。ボリンジャーバンドで確認したように、8つのパターンにはそれぞれ異なるインデックス(1、2、4、8、10、20、40、80)が割り当てられています。使用されるパターンの入力マップは0~255の範囲の整数で表されるため、この入力値に基づいて各パターンが選択されているかを確認します。たとえば、入力マップの値が107の場合、これはパターン0、1、3、5、6のみが選択されることを意味します。前回のボリンジャーバンドの実行では、他の閾値とともに、この入力マップの最適化に特に注力しました。続けて、以下のRSIを見てみましょう。
相対力指数
RSIは非常に人気のあるオシレーターで、多くのトレーダーが取引の開始と終了のタイミングを見極めるために頼りにしています。記事の要約ノートや共有リンクで説明されているように、RSIは価格の変化率を追跡し、特定の価格トレンドの差し迫った反転を予測するために使用されるインデックスです。一歩引いて考えてみると、EURUSDは技術的には2002年6月から現在まで、0.95から1.60の範囲で推移しており、今後22年間もこの範囲内に留まる可能性があると言えます。これらは明らかに大きな動きで、多くのpipsを表しますが、ほとんどすべての株式指数が2002年の水準から上昇して取引されているのとは異なります。したがって、外国為替ペアが買われすぎや売られすぎの状態に達した際に先手を打つことの重要性は、多くのトレーダーにとって依然として重要なスキルです。RSIを計算するための式は次の通りです。
ここで
- RSは相対的な強さであり、指定された期間の平均利益と平均損失の比率として定義されます。
これらの平均利益/損失が計算される期間は、RSI指標への入力パラメータです。MQL5でのこの実装は、すでにライブラリコードによって処理されています。前回の記事のテーマに沿って、RSIのパターンをさらに8つ見てみましょう。前回の記事と同様のモードでこれらの各パターンを調べます。このモードでは、各パターンのテスト結果がパターンの説明とともに表示されます。2023年の外国為替ペアUSDJPYを使用して、日次時間枠でテストします。
買われすぎ/売られすぎレベル(従来のもの)
RSIのパターン0は、オシレーターがレベル30または70を下回ったり上回ったりする従来のブレークアウトに関連しています。これはRSI指標の主な使用方法であり、このオシレーターの人気を考慮すると、非常に信頼性の高い設定と言えます。したがって、RSIが30レベルを下回ると、証券が売られすぎの状態にあることを示し、強気のエントリーシグナルとなることが多いです。一方、RSIが70を超えると、逆に買われすぎの状態を示し、弱気のエントリーシグナルとして解釈されます。これをカスタムシグナルクラスで次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_0(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0) { return(true); } return(false); }
ウィザードで組み立てたEA(EAを作成するために添付のコードを使用する方法については、こちらとこちらにガイドがあります)を使用してテストを実行すると、次のような結果が得られました。
ほとんどのオシレーターと同様、RSIのこの従来の使用法に欠点がないわけではありません。トレンド市場では、オシレーターが長期間にわたって70レベル以上(強気の場合)に留まるか、弱気シナリオでは30レベル以下に留まることがあります。これは、多くの場合、このオシレーターを移動平均などの他の指標や、MACDなどのオシレーターと組み合わせて使用し、現在のシグナルを適切に確立することを意味します。さらに、これらのオシレーターのレベルを70/30から80/20にカスタマイズすることは、セキュリティポジションを早く建てすぎることを回避するために、非常に不安定な資産を扱う場合に適している可能性があります。
すでに上記で述べたように、レンジ相場や統合相場でこのパターンを使用するのは確かに理想的であり、また、オシレーターのレベルは市場の過剰を示しているため、ポジションをいつ終了するかについての信頼できるガイドとして機能します。
RSIの失敗スイング(反転)
この2番目のパターンは、最初はパターン0と非常に似ていますが、オシレーターの主要レベルをテストした後にピボットを探すという点で異なります。これにより、よりシャープなシグナルになります。強気シグナルは、30レベルをテストした後、それを上抜けることで示されます。一方、弱気エントリーは、RSIが70を超えて上昇し、その後それを下回ってクローズすることで示されます。MQL5では以下のように実装されています。
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_1(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 30.0 && Base(StartIndex()) > 30.0) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 70.0 && Base(StartIndex()) < 70.0) { return(true); } return(false); }
パターン1の取引可能性を実証するテスト実行では、次の結果が得られます。
パターン1の失敗スイングは、主要なオシレーターの閾値を単に上回ったり下回ったりするよりも強いシグナルを示す傾向があります。これは、複数のRSIの動きによって確認される市場センチメントの変化を確認するためです。つまり、必ずしも価格の確認を必要とせず、センチメントが反転していることを示します。この最後の点により、RSIの失敗スイングは、価格方向によるRSIの乖離よりも信頼性が高いとされています。価格方向によるRSIの乖離も、以下で強調するようにRSIシグナルになることがあります。
RSIダイバージェンス(強気/弱気ダイバージェンス)
パターン2は、RSIが特定の方向に動き、価格が反対方向に動く場合に発生します。これもまた、市場の勢いの潜在的な変化を示しています。このダイバージェンスは、現在の上昇トレンドまたは下降トレンドが弱まる可能性があることを示しており、そのため反転が差し迫っている可能性があります。これらのダイバージェンスは強気または弱気のいずれかであり、強気のダイバージェンスは、価格が安値を下げる一方でRSIが安値を上げるときに示され、弱気のダイバージェンスは、価格が高値を上げる一方でRSIが安値を上げるときに示されます。このパターンをカスタムシグナルクラスで次のようにコードにします。
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_2(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); m_close.Refresh(-1); if(T == POSITION_TYPE_BUY && Close(StartIndex()) < Close(StartIndex() + 1) && Close(StartIndex() + 1) < Close(StartIndex() + 2) && Base(StartIndex()) > Base(StartIndex() + 1) && Base(StartIndex() + 1) > Base(StartIndex() + 2) ) { return(true); } else if(T == POSITION_TYPE_SELL && Close(StartIndex()) > Close(StartIndex() + 1) && Close(StartIndex() + 1) > Close(StartIndex() + 2) && Base(StartIndex()) < Base(StartIndex() + 1) && Base(StartIndex() + 1) < Base(StartIndex() + 2) ) { return(true); } return(false); }
ウィザードで組み立てたEAで、パターン2のみを使用し、パターンの使用入力マップを4とした場合のテスト実行結果は以下の通りです。
RSIダイバージェンスは、パターン1ですでに述べたように、それほど回復力はありませんが、その主な用途は、価格反転の早期警告指標として機能することです。特にトレンド市場や非常に強いトレンドが存在する状況では重要です。ただし、ダイバージェンスシグナルは反転ではなくプルバックを示している可能性があるため、それほど信頼性が高くないと言われています。このため、移動平均や支持/抵抗トレンドラインなどの追加指標によって補完されることがよくあります。
したがって、偽のダイバージェンスシグナルを除外する必要性は、ここでは非常に重要です。役立つ可能性があるのは、より長い時間枠に頼ることです。これは、シグナルを生成するという点ではそれほど生産的ではありませんが、やや信頼性が高くなる傾向があります。また、隠れたダイバージェンスも注目に値します。これらは、価格がより高い安値を形成し、RSIがより低い安値を形成することから強気の継続が推測されるトレンド継続の兆しとして機能します。一方、隠れた弱気のダイバージェンスは、価格がより低い高値を形成し、RSIがより高い高値を形成することから反転の可能性を示唆します。
RSIがミッドライン(50レベル)を上下に横切る
パターン3は、RSIの中間点であるレベル50に焦点を当て、このレベルを下回ると弱気、上回ると強気と見なすものです。デフォルトでは、RSIが50レベルに近い場合、明確なシグナルが存在しないことを示すため、当然ながら、このレベルを越える場合は示唆に過ぎず、確認が必要になることが多いです。また、他のトレンド指標と組み合わせてフィルターとして機能させることも一般的です。
ミッドラインクロスは、「どちらともいえない」という状況で、トレンド継続指標としてもトレンド反転指標としても機能します。RSIが50を超えてクロスすると、強気シグナルとしてトレンド継続が確認され、反対方向にクロスすると、弱気シグナルとしてトレンド継続が確認されます。また、RSIが50バリアを下から突破し、その後下まで後退すると弱気の反転が確認され、このミッドラインを越えた場合は反対のUパターンとして強気の反転が確認されます。パターン3は次のように実装できます。
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_3(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); m_close.Refresh(-1); m_high.Refresh(-1); m_low.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 50.0 && Base(StartIndex()) > 50.0) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 50.0 && Base(StartIndex()) < 50.0) { return(true); } return(false); }
使用パターンの入力パラメータに8を指定し、このパターンのみでテストを実行したところ、以下のような結果が得られました。
ミッドラインのクロスは、これまで検討したすべてのパターンを過度に単純化したものであり、その結果、潜在的なシグナルとして最も信頼性が低いとされています。このシグナルは明確さに欠けることが多いため、保留注文や複数の時間枠での適用が一般的です。また、パターン3はトレーリングストップとしても活用できます。例えば、ロングポジションでは、RSIが50のミッドラインを上回っている間はポジションを維持し、このレベルを下回った場合にポジションを終了するというルールを設定することが可能です。弱気ポジションには逆の設定が適用されます。
RSIトレンドラインブレーク
パターン4は、この記事で取り上げる8つのパターンの中でおそらく最も複雑です。それは、RSIのピークまたは谷と、それぞれのトレンドラインのブレークを考慮するためです。このパターン設定では、RSIのピークが下降した後にRSIが上昇し、ピークのトレンドラインをブレークした場合、これが強気のシグナルとして解釈されます。逆に、RSIの谷が上昇した後に現在のRSIの値がこれらの谷のトレンドラインをブレークまたは下回った場合、弱気のシグナルとして解釈されます。以下がコードです。
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_4(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex()) > Base(StartIndex() + 1) && Base(StartIndex() + 1) < Base(StartIndex() + 2) && Base(StartIndex() + 2) > Base(StartIndex() + 3) && Base(StartIndex() + 3) < Base(StartIndex() + 4) && Base(StartIndex() + 4) > Base(StartIndex() + 2) && Base(StartIndex()) >= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4) ) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) < Base(StartIndex() + 1) && Base(StartIndex() + 1) > Base(StartIndex() + 2) && Base(StartIndex() + 2) < Base(StartIndex() + 3) && Base(StartIndex() + 3) > Base(StartIndex() + 4) && Base(StartIndex() + 4) < Base(StartIndex() + 2) && Base(StartIndex()) <= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4) ) { return(true); } return(false); }
必ずしもRSIの最後の真のピークまたは谷を探しているわけではなく、むしろ、最後の5つのRSI読み取り値に、一連のピーク(強気シグナルの場合)または谷(弱気シグナルの場合)が存在するかどうかを確認していることに注意してください。この最後の5つのRSI値のみを基準としたチェックが肯定的である場合にのみ、トレンドラインのブレークを確認します。繰り返しますが、これらのピークまたは谷を結ぶ実際のラインの形状には注目せず、単にこれら2つの極端なポイント間のRSIの変化を確認するだけです。現在のRSI読み取り値が同じペースで継続しない場合、それはトレンドラインのブレークと解釈されます。これは、ピークラインまたは谷ラインが維持されていた場合、現在の読み取り値がシーケンス内の前の値と同じだけ、最後の谷またはピークから離れていたと仮定されるためです。このパターン4を、入力値を10としてテストした結果、次のような結果が得られます。
この記事で取り上げられているRSIトレンドラインブレークは、共有ソースに示されているように、RSIの最後の5回の読み取り値のみを考慮し、このパターンをチェックしています。一方で、RSIのフラクタルまたはピーク/谷のポイントを探すより包括的なアプローチを採用することで、より興味深い結果が得られる可能性があります。
移動平均線によるRSIの買われ過ぎ/売られ過ぎゾーン
パターン5は、パターン0と移動平均の確認を組み合わせたものです。したがって、上記のパターン0で説明した強気条件は、ロングポジションの条件として移動平均を上回る価格で維持され、同様に弱気条件は、ショートポジションの確認として移動平均を下回る価格で維持されます。この調整を使用して、次のようにMQL5の関数として定義します。
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_5(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); m_close.Refresh(-1); m_ma.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && Close(StartIndex()) > m_ma.Main(StartIndex())) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && Close(StartIndex()) < m_ma.Main(StartIndex())) { return(true); } return(false); }
このパターンのみを使用する排他的テスト実行(使用されるパターンの入力マップは20)では、次の結果が得られます。
RSIダブルボトム/トップパターン
このパターンは、主要なRSIオシレーターのレベルである70と30のテストを必要とするという点で、パターン1と多少似ています。ただし、1つのピークまたは谷のみを必要とするパターン1とは異なり、パターン6では2つのピークまたは谷が必要です。つまり、30ラインを下回るつの谷の後にこのレベルからの回復が続く場合、強気のシグナルを意味します。同様に、70レベルを超える2回のスパイクの後にこのレベルを下回る終値が続く場合、弱気のシグナルと見なされます。これは次のように実装します。
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_6(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && Base(StartIndex()) > Base(StartIndex() + 1) && Base(StartIndex() + 1) < Base(StartIndex() + 2) && Base(StartIndex() + 2) > Base(StartIndex() + 3) && Base(StartIndex() + 3) < Base(StartIndex() + 4) ) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && Base(StartIndex()) < Base(StartIndex() + 1) && Base(StartIndex() + 1) > Base(StartIndex() + 2) && Base(StartIndex() + 2) < Base(StartIndex() + 3) && Base(StartIndex() + 3) > Base(StartIndex() + 4) ) { return(true); } return(false); }
このパターン6のみを使用してテストすると、パターンの入力パラメータとして40を使用する必要があり、次の結果が得られます。
複数の時間枠によるRSI
最後のパターンであるパターン7は、RSIの伝統的かつ最も人気のあるパターンであるパターン0を複数の時間枠に適用するだけです。したがって、この場合の強気と弱気の条件は、上記のパターン0で見たものと同じです。カスタムシグナルクラスがこれに対して受け取る追加の入力パラメーターは、2番目のRSIハンドルの構築に役立つ追加の時間枠です。効率的なテストのため、また、より短い時間枠で蔓延する可能性のある価格ノイズを回避するために、2番目の時間枠はデフォルトのテスト時間枠よりも長くなります。コードは以下の通りです。
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalRSI::IsPattern_7(ENUM_POSITION_TYPE T) { m_rsi.Refresh(-1); m_rsi_alt.Refresh(-1); if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0 && Alt(StartIndex()) <= 30.0) { return(true); } else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0 && Alt(StartIndex()) >= 70.0) { return(true); } return(false); }
入力マップを80として使用したパターンでこのパターンのみをテストすると、次の結果が得られます。
上記の結論で参照してください。ボリンジャーバンドで共有したように、このカスタムシグナルクラスにもマルチパターンオプションがあります。ボリンジャーバンドと同様に、0から255までの整数をマッピングするために使用される入力パターンを最適化して、RSIオシレーターに最適なパターンの理想的な組み合わせを見つけます。最適化の実行により、189として使用されるパターンのマップが得られました。189はバイナリ形式では10111101であり、最適化の実行から「不適切」なパターンはパターン1とパターン6(RSI失敗スイングとダブルトップ/ボトム)のみであることを意味します。もちろん、これはペアUSDJPYのものであり、交差検証は実行されていません。ですが、テスト結果を以下で共有しておきます。
結論
結論として、この記事では、非常に人気のあるテクニカル指標であるRSIオシレーターのシグナルパターンに焦点を当てて検証しました。これらのパターンの一部は非常に一般的で、従来のパターン0のようにRSIと簡単に関連付けることができますが、トレンドラインブレークやパターン4など、一部のトレーダーには馴染みのないパターンもあります。しかし、他のすべてのパターンを除外して個々のパターンをテストするだけでなく、カスタムシグナルクラスでは、入力マップで使用されるパターンをマスクとして使用して複数のパターンを選択する自由も取ります。そのため、特定のポジションを開くパターンは、必ずしもポジションを閉じるタイミングを決定または制御するパターンと同じとは限りません。
また、読者にとって検討する価値があるのは、この記事で考慮していない追加のパターンです。使用したパターンは8つだけなので、使用したパターンの入力は2の8乗マイナス1(255)以下でした。このパターン数を追加して10まで増やすと、使用したパターンの入力マップは0から2の10乗マイナス1で1023までの範囲になります。考慮できる追加のパターンには、RSIブレークアウト戦略があります。この戦略では、資産の価格が価格チャート上の主要な抵抗レベルを超えて上昇し、同時にRSIチャートの70レベルを突破すると、このシグナルは、これまで検討したパターンとは逆に、強い強気と大きなトレンドの始まりとして解釈されます。同様に、弱気シグナルも続き、まずチャート価格が主要なチャート抵抗レベルを下回り、RSIも30を下回ります。これも、この記事でRSIを解釈した方法に反しています。これをコードにするには、トレーダーが取引している証券の主要な価格チャートのサポートレベルとレジスタンスレベルを認識していることが条件となるため、実装は読者(トレーダー)に委ねられます。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/15850
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
これを教えてくれてありがとうございます。記事の値について説明してくれたように、いくつかの銘柄で完璧に動作します。
usdjpyや 他のFXペアでこのようなグラフィックスを与えてくれるものを見つけられませんでした。たぶん私の問題は、それらに必要なセットを持っていないことです。
もし持っているなら、私たちと共有してもらえますか?