RSIディープスリームーブ取引手法
1.はじめに
この記事は、RSIに基づくいくつかの取引テクニックを紹介する新しい一連の研究に基づいています。取引手法とは、指標を使用する方法です。この研究はMQL5コーディング言語に基づいています。
2.RSIの簡単な紹介
RSIはRelative Strength Indexの略で、株式、通貨、商品などの証券の強さや勢いを測定するために使用されるテクニカル分析指標です。RSIは数式を用いて計算され、グラフ上にプロットされることで、一定期間における証券の強弱の度合いを視覚的に表します。
RSIは、価格が上昇すれば買われすぎ、価格が下落すれば売られすぎになるという原則に基づいています。RSIは、トレーダーが潜在的なトレンドのリバーサルや価格の反発を識別するのに役立ちます。
RSIの計算では、一定期間の証券の平均利益と同期間の証券の平均損失を比較します。デフォルトのRSIは0から100のスケールで表示され、70を上回ると買われすぎ、30を下回ると売られすぎと判断されます。潜在的な市場トレンドの早期警告シグナルを提供できるRSIは、トレーダーの間で人気の指標です。例えば、ある証券のRSIが一貫して上昇し続け、70を超える水準に達した場合、その証券は買われすぎで調整局面であることを示している可能性があります。一方、RSIが一貫して下降し、30を下回る水準に達した場合は、その証券が売られすぎで、反発する可能性があることを示しています。
注目すべきは、RSIを取引判断の唯一の根拠として単独で使用するべきでないということです。トレーダーは通常、RSIを他のテクニカル分析ツールや市場指標と併用することで、市場の状況をより包括的に理解し、十分な情報に基づいた取引判断を下すことができます。一般的に、RSIは14のローリング期間で計算されます。
3.RSIとは(より深い説明)
3.1 はじめにRSI(相対力指数、relative strength index)は、金融市場の分析に用いられるテクニカル指標です。これは、最近の取引期間の終値に基づいて、株式や市場の現在および過去の強さや弱さをチャート化することを目的としています。この指標を相対的強度(relative strength)と混同してはなりません。
RSIはモメンタムオシレーターに分類され、値動きの速さと大きさを測定します。 モメンタムとは、価格の上昇率や下落率のことです。相対的強度は、高値終値と安値終値の比率で示されます。具体的には、終値変動の絶対値の2つの平均、つまりローソク足チャートのローソクの大きさを含む2つの合計を計算します。RSIは、全体の終値とより高い終値の比率としてモメンタムを計算します。より多くの、またはより強いプラスの変化をした銘柄は、より多くの、またはより強いマイナスの変化をした銘柄よりもRSIが高くなります。
RSIは最も一般的に14日間の時間枠で使用されます。RSIは0から100までの尺度で測定され、高値と安値のレベルはそれぞれ70と30で指定されます。短い時間枠と長い時間枠が交互に使用されます。高値と安値のレベル(80と20または90と10)は、発生する頻度は低いですが、勢いがより強いことを示します。
RSIはJ・ウェルズ・ワイルダーによって開発され、1978年に出版された書籍『New Concepts in Technical Trading Systems』と、1978年6月号の『Commodities』誌(現在の『Modern Trader』誌)に掲載されました。RSIは、最も人気のあるオシレーター指標のひとつとなっています。
RSIは、証券や通貨が売られ過ぎたら買い、買われ過ぎたら売りのシグナルを出します。
推奨パラメータとその日々の最適化によるRSIがテストされ、Marek and Šedivá(2017)の他の戦略と比較されました。テストは時間と企業(例:アップル、エクソンモービル、IBM、マイクロソフト)を無作為に設定し、RSIが依然として良い結果を生む可能性があることを示しました。ただし、長期的には、通常、単純なバイアンドホールド戦略によって克服されます。
3.2 計算各取引期間について、上方への変化量Uまたは下方への変化量Dが計算されます。上昇期は、終値が直前の終値より高いことを特徴とします。
逆に、下降期は、終値が前期の終値より低いことを特徴とします。
最後の終値が前の終値と同じであれば、UもDもゼロです。UもDも正の数であることに注意してください。
平均は、このようなUとDのシーケンスから、n周期の平滑移動平均または修正移動平均(SMMAまたはMMA)を使用して計算されます。これは、α = 1 / nで指数的に平滑化された移動平均です。それらは正の項の正の加重平均であり、パーティションに関して加法的に振る舞います。
ワイルダーはもともと、移動平均の計算を「newval=(prevval*(n-1)+newdata)/n」として定式化しました。、これは前述の指数平滑化と等価です。つまり、新しいデータは単純にnで除算されるか、αで乗算され、以前の平均値は(n-1)/n、つまり1-αで修正されます。AIQのようないくつかの市販パッケージは、ワイルダーのSMMAの代わりにEMA(標準指数移動平均、Exponential Moving Average)を平均として使用します。平滑化移動平均は、価格系列の最初のn個の値を使った単純移動平均で適切に初期化されなければなりません。
これらの平均値の比率が相対的強度、または相対的強度係数です。
次に、相対強度係数は0から100の間のRSI(相対強度指数)に変換されます。
U値の平均がゼロであれば、RSもRSIもゼロです。U値の平均がD値の平均と等しい場合、RSは1、RSIは50となります。U値の平均が最大で、D値の平均がゼロの場合、RS値は無限大に発散し、RSIは100となります。
3.3 解釈
3.3.1 基本構成RSIは価格チャートの上か下にグラフで表示されます。この指標は、通常70を上線、30を下線、50を破線の中線としています。ワイルダーは、平滑化期間を14とすることを推奨しています(指数平滑化、すなわちα=1/14またはN=14を参照)。
3.3.2. 原則
ワイルダーは、価格が急激に上昇した場合、ある時点で買われすぎと判断すると仮定しました。同様に、価格が急速に下落した場合、ある時点で売られ過ぎとみなされます。いずれにせよ、ワイルダーは反撃かリバーサルが迫っていると判断しました。
RSIの水準は、株価の最近の取引強度を示す指標です。RSIの傾きはトレンドの変化の速さに正比例します。RSIの移動距離は移動の大きさに比例します。
ワイルダーは、RSIが70を上回るか30を下回ると、トップとボトムが示されると考えていました。伝統的に、RSIの数値が70を超えると買われすぎの領域、30を下回ると売られすぎの領域とみなされます。30レベルと70レベルの間は中立とみなされ、50レベルはトレンドがないことを示します。
3.3.3. ダイバージェンス
ワイルダーはさらに、RSIとプライスアクションのダイバージェンスは、相場の転換点が差し迫っていることを示す非常に強い兆候であると考えました。弱気ダイバージェンスは、価格が新高値を付けたが、RSIがより低い高値を付け、確認できなかった場合に発生します。強気ダイバージェンスは、価格が安値を更新し、RSI がさらに高い安値を付けた場合に発生します。
3.3.4.買われ過ぎと売られ過ぎの状況ワイルダーは、RSIが50を上回ったり50を下回ったりする「失敗のスイング」は、相場のリバーサルを強く示唆すると考えました。例えば、RSIが76に達し、72まで戻った後、77まで上昇したとします。72を下回れば、ワイルダーは70以上の「失敗スイング」と見なすでしょう。
最後にワイルダーは、チャートのフォーメーションや支持と抵抗の領域は、価格チャートとは対照的にRSIチャートでより簡単に見ることができる場合があると書いています。RSIの中心線は50であり、これはしばしばこの指標の支持線と抵抗線の両方とみなされます。
RSIが50を下回っている場合、一般的にその銘柄の損失が利益を上回っていることを意味します。相対力指数が50を上回ると、一般的に利益が損失を上回ることを意味します。
3.3.5. 上昇トレンドと下降トレンドワイルダーのRSI解釈のオリジナル理論に加え、アンドリュー・カードウェルはトレンドの判断と確認に役立つRSIの新しい解釈をいくつか開発しました。カードウェルはまず、上昇トレンドは一般的にRSI40から80の間で取引され、下降トレンドは通常RSI60から20の間で取引されることに気づきました。カードウェルは、証券が上昇トレンドから下降トレンドに変わるとき、あるいはその逆のとき、RSIは「レンジシフト」を起こすと観察した。
次に、カードウェルは弱気ダイバージェンスに注目しました。1)上昇トレンドでのみ発生し、2)ほとんどの場合、トレンドのリバーサルではなく、短期間の反発にしかつながりません。したがって、弱気ダイバージェンスは上昇トレンドを確認するサインです。同様に、強気ダイバージェンスは下降トレンドを確認するサインです。
3.3.6. リバーサル最後に、カードウェルはRSIの正負のリバーサルの存在を発見しました。リバーサルはダイバージェンスの反対です。例えば、上昇トレンドの価格反発によって、直近の価格反発と比較して安値が高くなり、RSIが前回の反発と比較して安値を更新すると、正のダイバージェンスが発生します。負のリバーサルは、下降トレンドの上昇の結果、直近の下降トレンドの上昇と比較して高値が低くなるが、RSIが直近の上昇と比較して高値を更新する場合に発生します。
言い換えれば、RSIの高値や安値に見られるようにモメンタムが強いにもかかわらず、価格が高値や安値を更新できなかったということです。これは、主要なトレンドが再開されようとしている証拠です。カードウェルは、正のリバーサルは上昇トレンドにのみ起こり、負のリバーサルは下降トレンドにのみ起こるため、その存在はトレンドを確認するものであると指摘しました。4. RSIディープスリームーブ
ディープスリームーブ手法には興味深い仮説があります。一般的にRSIが売られ過ぎまたは買われ過ぎの水準に入り、3手連続で深めの動きを形成するときはいつでも、4番目の移動が確認である(そしてまた深くなければならない)ときにシグナルが出る可能性があるというものです。取引条件は以下の通りです。
- 強気シグナルは、RSIが前回のRSIを下回り、そのRSIも前回のRSIを下回り、そのRSIもも前回のRSIを下回るときに検出されます。一般的に8期間RSIで使われるため、3期間前のRSIが20以下、4期間前のRSIが20以上でなければなりません(シグナルの重複を避けるため)。
-
弱気シグナルは、RSIが前回のRSIを上回り、そのRSIも前回のRSIを上回り、そのRSIも前回のRSIを上回ると検出されます。一般的に8期間RSIで使われるため、3期間前のRSIが80以上、4期間前のRSIが80以下でなければなりません(シグナルの重複を避けるため)。
百聞は一見にしかず。次の図は、この手法に基づく強気シグナルを示しています。
5.コード
//+------------------------------------------------------------------+ //| RSI Deep Three Move.mq5 | //| Javier S. Gastón de Iriarte Cabrera | //| https://https://www.mql5.com/ja/users/jsgaston/news | //+------------------------------------------------------------------+ #property copyright "Javier S. Gastón de Iriarte Cabrera" #property link "https:/https://www.mql5.com/ja/users/jsgaston/news" #property version "1.01" #property script_show_inputs #include <GetIndicatorBuffers.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\AccountInfo.mqh> //--- CPositionInfo m_position; // object of CPositionInfo class CTrade m_trade; // object of CTrade class CSymbolInfo m_symbol; // object of CSymbolInfo class CAccountInfo m_account; // object of CAccountInfo class CTrade trade; CTrade Ctrade; input string Expert_Title ="RSI Deep Three Move Strategy"; // Document name enum ENUM_LOT_TYPE { LOT_TYPE_FIX = 0, // fix lot LOT_TYPE_RISK = 1, // risk % }; //--- input parameters input ENUM_LOT_TYPE inp_lot_type = LOT_TYPE_FIX; // type of lot input double inp_lot_fix = 0.01; // fix lot input double inp_lot_risk = 0.01; input bool InpPrintLog = false; // Print log ulong Expert_MagicNumber =11777; bool Expert_EveryTick =false; input ENUM_TIMEFRAMES my_timeframe=PERIOD_CURRENT; // Timeframe input ENUM_APPLIED_PRICE Inp_RSI_applied_price = PRICE_CLOSE; // RSI: type of price input int InpPeriodRSI=8; // Period of the signal for the RSI inside custom int handle_iCustom; input int ptsl = 5000; // points for stoploss input int pttp = 5000; // points for takeprofit string Orden; double sl2; double tp2;
これはMQL5言語で書かれた複雑なコードです。RSIを用いて潜在的な取引機会を特定する取引戦略です。このコードには、CPositionInfo、CTrade、CsymbolInfo、CAccountInfoなどのさまざまなクラスが使用されています。また、ロットの種類、固定ロット、リスクパーセンテージ、エキスパートのタイトル、マジックナンバー、時間枠、RSIの平均期間、価格の種類、損切りと利食いのポイントなど、さまざまな入力パラメータを使用することもできます。コードでは、handle_iRSI2、handle_iCustom、Orden、sl、tpといった変数も使用もされています。このコードの目的は、RSI指標に基づいて潜在的な取引機会を特定することです。
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- handle_iCustom=iCustom(_Symbol,my_timeframe,"\\Indicators\\Examples\\RSI",InpPeriodRSI); if(handle_iCustom==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d", _Symbol, EnumToString(my_timeframe), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); }
このコードはMQL5言語のエキスパートアドバイザー(EA)初期化関数の一部です。指定した銘柄と時間枠に対して、iCustom指標のハンドルを作成するために使用します。また、指定されたパラメータでiRSI指標のハンドルを作成します。iCustom指標のハンドルを作成できないと、エラーメッセージが表示され、指標は停止します。ハンドルを作成できれば、初期化は成功です。
void OnTick() { MqlTick tick; double last_price = tick.ask; SymbolInfoTick(_Symbol,tick); int total = PositionsTotal(); //--- // Retrieve the current value MqlTradeResult result; MqlRates rates[]; //--- double array_rsi[]; ArraySetAsSeries(array_rsi,true); int start_pos=0,count=5; if(!iGetArray(handle_iCustom,0,start_pos,count,array_rsi)) return; string text=""; for(int i=0; i<count; i++) text=text+IntegerToString(i)+": "+DoubleToString(array_rsi[i],Digits()+1)+"\n"; //--- Comment(text); { if(array_rsi[0] < array_rsi[1] && array_rsi[1] < array_rsi[2] && array_rsi[2] < array_rsi[3] && array_rsi[3] < 20.0 && array_rsi[4] > 20.0) { Print("Open Order Buy"); Alert(" Buying"); Orden="Buy"; sl=NormalizeDouble(tick.ask - ptsl*_Point,_Digits); tp=NormalizeDouble(tick.bid + pttp*_Point,_Digits); trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,get_lot(tick.bid),tick.bid,sl,tp,"Buy"); return; } } { if(array_rsi[0] > array_rsi[1] && array_rsi[1] > array_rsi[2] && array_rsi[2] > array_rsi[3] && array_rsi[3] > 80.0 && array_rsi[4] < 80.0) { Print("Open Order Sell"); Alert(" Selling"); Orden="Sell"; sl=NormalizeDouble(tick.bid + ptsl*_Point,_Digits); tp=NormalizeDouble(tick.ask - pttp*_Point,_Digits); trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,get_lot(tick.ask),tick.ask,sl,tp,"Sell"); return; } } if(total>0) { if(Orden=="Sell" && array_rsi2[0]<20.0) { trade.PositionClose(_Symbol,5); Print("cerró sell"); return; } if(Orden=="Buy" && array_rsi2[0]>80.0) { trade.PositionClose(_Symbol,5); Print("cerró buy"); return; } } }このコードはMQL5のExpertTick関数です。市場でポジションを建てたり閉じたりするのに使用します。まず銘柄の現在値を取得し、MqlTicktick変数に格納します。そして、ポジションの総数を取得し、total変数に格納します。次に、iCustom関数からRSI値を取得し、array_rsiと変数に格納します。その後、RSI値が売り注文の場合は20以下、買い注文の場合は80以上であるかどうかを確認し、もしそうであれば、対応するパラメータでポジションを建てます。最後に、RSI値が20または80のしきい値を超えたかどうかを確認し、超えた場合はポジションを閉じます。
bool iGetArray(const int handle,const int buffer,const int start_pos, const int count,double &arr_buffer[]) { bool result=true; if(!ArrayIsDynamic(arr_buffer)) { //if(InpPrintLog) PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__); return(false); } ArrayFree(arr_buffer); //--- reset error code ResetLastError(); //--- fill a part of the iBands array with values from the indicator buffer int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer); if(copied!=count) { //--- if the copying fails, tell the error code //if(InpPrintLog) PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d", __FILE__,__FUNCTION__,count,copied,GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } return(result); }
このコードは、指標バッファから配列に値をコピーするために使用されます。この関数は、指標へのハンドル、指標バッファー、バッファの開始位置、コピーする値の数、値を格納する配列の5つのパラメータを取ります。そして、配列が動的かどうかを確認し、動的であればエラーコードをリセットし、バッファから配列に値をコピーします。コピーできなかった場合は、エラーメッセージを表示してfalseを返します。そうでない場合はtrueを返します。
double get_lot(double price) { if(inp_lot_type==LOT_TYPE_FIX) return(normalize_lot(inp_lot_fix)); double one_lot_margin; if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,one_lot_margin)) return(inp_lot_fix); return(normalize_lot((AccountInfoDouble(ACCOUNT_BALANCE)*(inp_lot_risk/100))/ one_lot_margin)); } double normalize_lot(double lt) { double lot_step = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); lt = MathFloor(lt / lot_step) * lot_step; double lot_minimum = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); lt = MathMax(lt, lot_minimum); return(lt); }
このコードは、取引のロットサイズを計算するために使用されます。最初の関数であるget_lot()は、取引価格を引数として受け取り、ロットタイプ(固定またはリスクベース)を確認します。ロットタイプが固定の場合、normalize_lot()関数が呼ばれ、ロットサイズが正規化されます。ロットタイプがリスクベースの場合、OrderCalcMargin()関数が取引に必要な証拠金を計算するために使用され、AccountInfoDouble()関数が口座残高を取得するために使用されます。ロットサイズは、口座残高を証拠金で割り、リスク割合を乗じて計算されます。その後、normalize_lot()関数が呼ばれ、ロットサイズが正規化されます。normalize_lot()関数は、引数としてロットサイズを受け取り、銘柄のステップサイズと最小ロットサイズを計算します。その後、ロットサイズは最も近いステップサイズに切り捨てられ、必要に応じて最小ロットサイズが適用されます。
6.結果
EURUSD、30分期間、slの900ポイント(RSIは8期間を使うことを忘れずに)、2023年の1月1日から6月末まで:
7.結論
もちろん、すべてのテクニックが完璧というわけではありません。特にトレンドでは、悪いシグナルに遭遇することがあります。また、お気づきのように、厳しいトレンドでは、このテクニックは期待通りには機能しません。
この戦略を市場に適用するためには最適化しなければなりませんが、市場分析に関する平均回帰的な考え方を提示することが目的でした。
これらは、私のブローカーのすべての銘柄のセント口座での収益性の高い結果です(2023年6月末まで30分期間)。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/12846
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索