RSI ダイナミックストップ・ロスト&テイク・プロフィート戦略

作者: リン・ハーンチャオチャン,日付: 2024-03-19 15:54:01
タグ:

img

戦略概要 この戦略は,RSIインジケーターと価格の関係に基づいており,Take ProfitとStop Lossのレベルを動的に調整することで取引パフォーマンスを最適化しています.戦略の主な考え方は,RSIインジケーターのオーバーバイトとオーバーセール特性を利用し,価格と取引量の変化と組み合わせ,RSIが逸脱したとき,動的なストップロスを通してリスクを制御しながら,タイミングで利益を得ることです.

戦略原則:

  1. RSI指標の値を計算し,入力パラメータに基づいて,過剰購入と過剰販売の値を決定する.
  2. 現在のRSI値を前回の数個のキャンドルのRSI値と比較して,ピーク形成 (isPeak) や底形成 (isBottom) が現れるかどうかを判断します.
  3. ピーク形成が発生すると,現在の価格が前回のピークの高値よりも高く,取引量が前回のピークの取引量よりも小さい場合,セールシグナルが生成されます.
  4. 底辺の形成が現れ,現在の価格が前の底辺の低値よりも低く,取引量は前の底辺の取引量よりも小さい場合,購入信号が生成されます.
  5. 購入シグナルが発信された後,価格が前回の底辺の低値に戻り,または取引量が前回の底辺の取引量よりも小さいときに利益を得ます.
  6. セールシグナルが発信された後,価格が前回のピークの高値に戻り,または取引量が前回のピークの取引量より小さい場合に利益を得ます.
  7. ポジションを開いた後,リスクをコントロールするために,ストップ・ロスの価格を開設価格の一定パーセント (2%) に設定します.

戦略上の利点

  1. ダイナミックな利益を取ることで 傾向の逆転の始まりに 利益が間に合うように固定され 戦略の収益が向上します
  2. 取引量の変化を補助判断条件として使用することで,誤った信号を効果的にフィルタリングし,信号の精度を向上させることができます.
  3. ストップ・ロスの設定は,単一の取引のリスクを効果的に制御し,戦略の引き下げを減らすことができます.
  4. パラメータは調整可能で,異なる市場環境や取引種に適用できます.

戦略リスク:

  1. 横向市場では,RSIインジケーターは頻繁に買い過ぎと売り過ぎの信号を生成し,戦略がより多くの誤った信号を生成させる可能性があります.
  2. ストップ損失を設定することで 短期的には 戦略が大きな引き上げを 経験する可能性があります
  3. トレンド市場での戦略の業績は,トレンドを追う戦略ほど良くない場合もあります.

オプティマイゼーション方向:

  1. 信号の信頼性を高めるため,MACD,ボリンジャー帯など他の技術指標を導入することを検討します.
  2. 利得とストップロスの限界を最適化し,異なる品種と市場環境の特徴に応じて動的に調整する.
  3. ポジション管理モジュールを追加し,市場の変動と口座リスク状況に応じてポジションサイズを調整します.
  4. 最適なパラメータ組み合わせを見つけるために戦略のパラメータ最適化を実行する.

概要: RSIダイナミックストップ・ロス&テイク・プロフィート戦略は,トレンドの開始時に,トレンドの変動と価格の変動を組み合わせ,トレード・ボリュームの変化との間の差異関係を活用して,リスク制御のためにダイナミックストップ・ロスを設定することで,タイミングで利益を得ます.この戦略の利点は,トレンド逆転の開始時に利益を固定し,戦略の引き下げを削減し,一定の適応性を有することです.しかし,横向市場では,戦略はより多くの誤った信号を生む可能性があります.したがって,他の技術指標を導入し,戦略のパフォーマンスを向上させるために,利益を取ることとストップ・ロスの値を最適化することが必要です.また,ポジション管理とパラメータ最適化を追加することは,戦略の安定性とリターンをさらに向上させるための重要な方向性でもあります.


/*backtest
start: 2024-03-11 00:00:00
end: 2024-03-15 09:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("RMM_byMR", overlay=true)

// RSI uzunluğu girişi
rsiLength = input(14, title="RSI Uzunluğu")

// Tepe ve dip seviyeleri için girişler
overboughtLevel = input(70, title="Aşırı Alım Seviyesi")
oversoldLevel = input(30, title="Aşırı Satım Seviyesi")

// RSI hesaplama
rsiValue = rsi(close, rsiLength)

// Son tepe noktalarını tespit etme // Son dip noktalarını tespit etme
isPeak = rsiValue[2] > overboughtLevel and rsiValue[2] > rsiValue[1] and rsiValue[2] > rsiValue[3] and (rsiValue[1] > rsiValue or rsiValue[3] > rsiValue[4])
isBottom = rsiValue[2] < oversoldLevel and rsiValue[2] < rsiValue[1] and rsiValue[2] < rsiValue[3] and (rsiValue[1] < rsiValue or rsiValue[3] < rsiValue[4])

// Önceki tepe noktalarını tespit etme
prevPeak = valuewhen(isPeak, rsiValue[2], 1)
prevPeakHighPrice = valuewhen(isPeak, high[2], 1)
volumePeak = valuewhen(isPeak, volume[1]+volume[2]+volume[3], 1)
prevPeakBarIndex = valuewhen(isPeak, bar_index, 1)

// Önceki dip noktalarını tespit etme
prevBottom = valuewhen(isBottom, rsiValue[2], 1)
prevBottomLowPrice = valuewhen(isBottom, low[2], 1)
volumeBottom = valuewhen(isBottom, volume[1]+volume[2]+volume[3], 1)
prevBottomBarIndex = valuewhen(isBottom, bar_index, 1)

// Tepe noktasında satış sinyali
isSellSignal = prevPeakBarIndex > prevBottomBarIndex and isPeak and rsiValue[2] < prevPeak and high[2] > prevPeakHighPrice and (volume[1]+volume[2]+volume[3]) < volumePeak
isBuyTakeProfit = isPeak and ((rsiValue[2] < prevPeak and high[2] > prevPeakHighPrice) or (rsiValue[2] < prevPeak and (volume[1]+volume[2]+volume[3]) < volumePeak))

// Dip noktasında alış sinyali
isBuySignal = prevBottomBarIndex > prevPeakBarIndex and isBottom and rsiValue[2] > prevBottom and low[2] < prevBottomLowPrice and (volume[1]+volume[2]+volume[3]) < volumeBottom
isSellTakeProfit = isBottom and ((rsiValue[2] > prevBottom and low[2] < prevBottomLowPrice) or (rsiValue[2] > prevBottom and (volume[1]+volume[2]+volume[3]) < volumeBottom))

sellTakeProfit = valuewhen(isSellTakeProfit, low, 1)
buyTakeProfit = valuewhen(isBuyTakeProfit, high, 1)

// isSellTakeProfit koşulu için işaretlemeyi yap
plotshape(isSellTakeProfit, style=shape.triangleup, location=location.abovebar, color=color.green, size=size.small, title="Sell Take Profit", offset=-2) 

// isBuyTakeProfit koşulu için işaretlemeyi yap
plotshape(isBuyTakeProfit, style=shape.triangledown, location=location.belowbar, color=color.red, size=size.small, title="Buy Take Profit", offset=-2)

buyComment = "Buy \n Rsi:" + tostring(round(rsiValue[2], 2)) + " \n Low:" + tostring(round(low[2],2)) + " \n Hacim:" + tostring(round(volume[1]+volume[2]+volume[3],2))
sellComment = "Sell \n Rsi:" + tostring(round(rsiValue[2], 2)) + " \n High:" + tostring(round(high[2],2)) + " \n Hacim:" + tostring(round(volume[1]+volume[2]+volume[3],2)) 

// Alış sinyali durumunda uzun pozisyon aç
if (isBuySignal)
    strategy.entry("Buy", strategy.long, comment = buyComment )
    strategy.exit("SL", "Buy", stop=close * 0.98)

// Satış sinyali durumunda kısa pozisyon aç
if (isSellSignal)
    strategy.entry("Sell", strategy.short, comment = sellComment )
    strategy.exit("SL","Sell", stop=close * 1.02)
// Limit değerini sonradan belirleme


// Alış sinyali durumunda uzun pozisyon kapat
if (isBuyTakeProfit)
    strategy.close("Buy", comment="TP")

// Satış sinyali durumunda kısa pozisyon kapat
if (isSellTakeProfit)
    strategy.close("Sell", comment="TP")

もっと