この戦略の主なアイデアは,ストップ・ロース,テイク・プロフィート,トレリング・ストップ・ロース,レバレッジ・トラッキング・ストップ・ロースを含む,RSI戦略に基づいていくつかの重要な取引管理ルールを追加することです. これにより,トレンド市場においてより高いリターンを達成し,バックテストにおける市場変動中に損失を最小限に抑えることができます.
この戦略はまず,RSI指標を計算します.RSIが過売り値を下回るとロングになり,RSIが過買い値を下回るとショートになります.
ロングシグナルが発信された後,その時点の最高価格が,ストップ・ロスの基準点として記録されます.価格がストップ・ロスのポイントマイナスストップ・ロスの範囲を下回ると,ストップ・ロスはポジションを閉じます.
ショートシグナルが発信された後,その時点の最低価格がストップ・ロスの基準点として記録されます.価格がストップ・ロスのポイントとストップ・ロスの範囲を超えると,ストップ・ロスはポジションを閉じる.
同時期に,固定取利益とストップ損失距離が設定されます.価格が取利益距離に達すると,利益を取ってポジションを閉じます.ストップ損失距離に達すると,ストップ損失でポジションを閉じます.
さらに,レバレッジ追跡ストップ損失ラインはレバレッジに基づいて設定されます.価格がレバレッジ追跡ストップ損失ラインに達した場合,ポジションはストップ損失で閉鎖されます.
上昇傾向における最高価格と下落傾向における最低価格を追跡し,固定された取利益とストップ損失距離を組み合わせることで,傾向市場ではより高い収益が得られる.一方,レバレッジ追跡ストップ損失は損失拡大を避けるのに役立ちます.
この戦略の最大の利点は,RSI戦略の強みを活用しながらリスクをより良く制御する複数の取引管理規則の導入です.
具体的には以下のような利点があります
トレーリングストップロスは,トレンド市場では,継続的に傾向を追って,より高い利益を得ることができます.
トレンドが逆転すると,全利益が消えるのを防ぐ.
利息のストップ・ロスを追跡することで 損失の拡大を回避し リスクを制御できます
ストップ・ロスの組み合わせによって,さまざまな市場環境で強みを発揮し,戦略の全体的な安定性を向上させることができます.
戦略パラメータの柔軟な調整は,異なる取引手段と市場環境に適しています.
簡単で理解できる論理は検証,最適化,応用を容易にする.
この戦略の主なリスクは以下のものです.
RSI戦略自体には,ストップロスを引き起こす可能性があるいくつかのウィップソーリスクがあります. RSIパラメータは最適化できます.
ストップ・ロスの周りの振動はしばしばストップ・ロスを引き起こす.ストップ・ロスの範囲は拡大することができる.
トレンド市場での利益は完全に固定できない.他の指標はトレンド終了を決定するのに役立ちます.
固定ストップ損失距離は損失を完全に回避するには小さすぎる可能性があります.振動ストップ損失または動的ストップ損失を使用することを検討してください.
過剰なレバレッジは,ストップ損失がエントリー価格にあまりにも近い結果になります.低レバレッジ設定を使用する必要があります.
バックテスト期間が将来の市場状況を完全に反映していない場合もあります.適切なリスク管理を実施し,異なる期間をテストする必要があります.
上記のリスクは,パラメータ調整,ストップ損失メカニズム最適化,リスク管理などによって軽減できます. しかし,市場リスクを完全に回避できる戦略はありません.適切なリスク管理は必須です.
この戦略は,次の側面においてさらに最適化することができる.
RSIのパラメータを最適化して,ウィップソー取引を削減し,異なる市場のための最適なパラメータをテストします.
他のインジケーターを試して KD,MACD と RSI を組み合わせてエントリをフィルターします
機械学習を使って ストップ・ロストと 利益のパラメータを 動的に最適化します
振動式ストップ損失,平均ストップ損失,ダイナミックストップ損失などより複雑なストップ損失メカニズムをテストする.
利息設定を最適化し,利益とリスク管理への影響を調査する.
市場状況の変化に基づいて パラメータを自動調整します 例えば α-ダブルスモルスト
トレンド持続性を決定する他の要因を考慮し,例えば容量エネルギー.
ディープラーニングモデルを使用して より堅牢で解釈可能なストップ・ロスの方法を開発します
戦略の安定性を評価するために,異なるツールと時間帯からデータをテストする.
この戦略は,RSI戦略を様々なストップ損失方法と補完し,トレンドから利益を得ることとリスクを制御することにおけるストップ損失の二重効果を完全に発揮する.最適化のための余地はまだ大きい.アイデアはより多くの戦略と取引手段に拡張できる.ストップ損失戦略は,深く研究に値し,継続的な最適化と検証の後,機械取引システムの非常に重要な部分になり得る.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Adding some essential components to a prebuilt RSI strategy", overlay=true) /////////////// Component Code Start /////////////// testStartYear = input(2011, "Backtest Start Year") testStartMonth = input(8, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2016, "Backtest Stop Year") testStopMonth = input(9, "Backtest Stop Month") testStopDay = input(29, "Backtest Stop Day") // testStopDay = testStartDay + 1 testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true /////////////// Component Code Stop /////////////// ///////////// RSI component ///////////// length = input( 14 ) overSold = input( 30 ) overBought = input( 70 ) price = close vrsi = rsi(price, length) notna = not na(vrsi) /////////////// STRATEGY /////////////// ts = input(99999, "Trailing Stop") / 100 tp = input(99999, "Take Profit") / 100 sl = input(99999, "Stop Loss") / 100 long = notna and crossover(vrsi, overSold) short = notna and crossunder(vrsi, overBought) last_long = long ? time : nz(last_long[1]) last_short = short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = long_signal ? time : nz(last_long_signal[1]) last_short_signal = short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal long_tp = high >= (last_open_long_signal + tp) short_tp = low <= (last_open_short_signal - tp) long_sl = low <= (last_open_long_signal - sl) short_sl = high >= (last_open_short_signal + sl) leverage = input(200, "Leverage") long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal long_call_signal = low <= long_call short_call_signal = high >= short_call if testPeriod() strategy.entry("Long", strategy.long, when=long_signal) strategy.entry("Short", strategy.short, when=short_signal) // plot(long_call, color=red) // plot(short_call, color=green) strategy.close("Long", when=long_call_signal) strategy.close("Short", when=short_call_signal) strategy.close("Long", when=long_tp) strategy.close("Short", when=short_tp) strategy.close("Long", when=long_sl) strategy.close("Short", when=short_sl) strategy.close("Long", when=long_ts) strategy.close("Short", when=short_ts)