Trend RSI Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2023-11-16 15:33:40
Tag:

Gambaran umum

Strategi ini menggabungkan indikator RSI dan rata-rata bergerak tertimbang untuk tren setelah perdagangan. Ini pergi panjang ketika RSI di atas 60 dan pergi pendek ketika RSI di bawah 40, dengan rata-rata bergerak memverifikasi kondisi tren. RSI 40 periode bertindak sebagai indikator mengikuti tren. Rata-rata bergerak tertimbang menggunakan bobot yang berbeda untuk mengurangi dampak fluktuasi jangka pendek. Strategi ini juga menggunakan stop loss dan trailing take profit untuk mengendalikan risiko.

Logika Strategi

Strategi ini pertama-tama menghitung RSI dan rata-rata bergerak tertimbang. Panjang RSI adalah 20 periode dan panjang MA tertimbang adalah 20 dengan bobot yang lebih tinggi yang mengurangi dampak volatilitas jangka pendek.

Setelah membuka long atau short, stop loss dan trailing take profit order ditempatkan secara bersamaan. Stop loss ditetapkan pada 3 ATR dari harga saat ini. Aktivasi profit trailing awal adalah 4 ATR, dan trails dalam kenaikan 3%. Ketika harga mencapai stop loss atau trailing take profit activation, posisi akan ditutup.

Strategi ini juga menggabungkan aturan pengelolaan uang berdasarkan pendekatan ukuran posisi pecahan tetap.

Analisis Keuntungan

  • Indikator RSI dapat secara efektif melacak tren
  • MA tertimbang mengurangi dampak fluktuasi jangka pendek, menghindari whipsaws
  • Mengikuti mengambil keuntungan memungkinkan keuntungan dimaksimalkan
  • Kontrol ukuran posisi fraksi tetap berisiko secara efektif

Keuntungan keseluruhan adalah kemampuan untuk mengikuti tren, sementara mengambil langkah stop loss dan trailing take profit untuk mengendalikan risiko, sehingga menangkap keuntungan yang signifikan dalam tren yang kuat.

Analisis Risiko

  • Sinyal palsu dari RSI dapat menyebabkan perdagangan yang tidak perlu
  • Dipaksa untuk berhenti ketika pelanggaran harga berhenti atau tertinggal mengambil tingkat keuntungan, tidak dapat terus mengikuti tren
  • Aturan manajemen uang yang agresif dapat menyebabkan kerugian besar

Risiko utama berasal dari keandalan sinyal RSI dan pengaturan stop loss/trailing take profit. Parameter yang tidak benar dapat mengakibatkan penutupan perdagangan yang tidak perlu atau kerugian di luar nafsu risiko. Mematahkan stop loss/take profit juga dapat memaksa stop out yang tidak dibenarkan, kehilangan kesempatan untuk melanjutkan perdagangan tren.

Solusi termasuk mengoptimalkan parameter RSI atau menambahkan indikator lain untuk konfirmasi sinyal. Sesuaikan stop/trailing take profit level berdasarkan produk yang berbeda dan kondisi volatilitas. Juga berhati-hati dengan aturan pengelolaan uang untuk menghindari risiko yang berlebihan.

Arahan Optimasi

  • Uji indikator lain bersama dengan RSI untuk konfirmasi sinyal, misalnya KD, MACD dll.
  • Mengoptimalkan parameter stop loss dan trailing take profit berdasarkan karakteristik produk dan rentang volatilitas
  • Cobalah teknik manajemen uang lainnya seperti perdagangan ukuran tetap, rumus Kelly dll
  • Tambahkan kondisi masuk seperti Bollinger breakout, RSI divergensi dll
  • Pertimbangkan untuk menambahkan posisi pada tren yang kuat

Ada banyak aspek yang harus dioptimalkan. Pertama adalah mengidentifikasi indikator lain untuk melengkapi sinyal RSI. Langkah kritis berikutnya adalah mengoptimalkan parameter stop loss / trailing take profit berdasarkan kinerja historis. Manajemen uang juga dapat beralih ke jenis lain. Akhirnya, kondisi entri, tambahan dapat ditingkatkan ke posisi piramida dalam tren yang kuat.

Ringkasan

Strategi RSI trend following memiliki logika yang jelas, menggunakan RSI untuk arah tren dan MA tertimbang untuk konfirmasi. Kekuatannya terletak pada perdagangan tren, memaksimalkan keuntungan dengan stop / manajemen uang mengendalikan risiko. Tetapi keandalan RSI dan optimasi parameter perlu ditingkatkan. Kita dapat melihat peningkatan indikator sinyal, parameter stop / trailing, metode manajemen uang dll untuk membuat strategi lebih kuat di berbagai produk.

[/trans]


/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This code is based on RSI and a backed weighted MA
//@version=5
strategy("RSI + MA BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


//------------------------FUNCTIONS---------------------------//

//@function which calculate a retro weighted moving average to minimize the impact of short term reversal
rwma(source, length) =>
    sum = 0.0
    denominator = 0.0
    weight = 0.0
    weight_x = 100/(4+(length-4)*1.30)
    weight_y = 1.30*weight_x
    for i=0 to length - 1
        if i <= 3
            weight := weight_x
        else
            weight := weight_y
        sum := sum + source[i] * weight
        denominator := denominator + weight
    rwma = sum/denominator

//@function which permits the user to choose a moving average type
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "RWMA" => rwma(source, length)

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//--------------------------------USER INPUTS-------------------------------//

//Technical parameters
rsiLengthInput = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
maTypeInput = input.string("RWMA", title="MA Type", options=["SMA", "RWMA"], group="MA Settings", inline="1")
maLenghtInput = input.int(20, minval=1, title="MA Length", group="MA Settings", inline="1")
rsiLongSignalValue = input.int(60, minval=1, maxval=99, title="RSI Long Signal", group="Strategy parameters", inline="3")
rsiShortSignalValue = input.int(40, minval=1, maxval=99, title="RSI Short Signal", group="Strategy parameters", inline="3")
rocMovAverLongSignalValue = input.float(-1, maxval=0, title="ROC MA Long Signal", group="Strategy parameters", inline="4")
rocMovAverShortSignalValue = input.float(1, minval=0, title="ROC MA Short Signal", group="Strategy parameters", inline="4")
//TP Activation and Trailing TP
takeProfitActivationInput = input.float(4, minval=1.0, title="TP activation in multiple of ATR", group="Strategy parameters")
trailingStopInput = input.float(3, minval=0, title="Trailing TP in percentage", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2018 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")

strategy.initial_capital = 50000

//------------------------------VARIABLES INITIALISATION-----------------------------//

float rsi = ta.rsi(close, rsiLengthInput)
float ma = ma(close, maLenghtInput, maTypeInput)
float roc_ma = ((ma/ma[maLenghtInput]) - 1)*100
float atr = ta.atr(20)
var float trailingStopOffset = na
var float trailingStopActivation = na
var float trailingStop = na
var float stopLoss = na
var bool long = na
var bool short = na
var bool bufferTrailingStopDrawing = na
float theoreticalStopPrice = na
bool inRange = na
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
    strategy.close_all()
    bufferTrailingStopDrawing := false
    stopLoss := na
    trailingStopActivation := na
    trailingStop := na
    short := false
    long := false


//------------------------------STOP LOSS AND TRAILING STOP ACTIVATION----------------------------//

// We handle the stop loss and trailing stop activation 
if (low <= stopLoss or high >= trailingStopActivation) and long
    if high >= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if low <= stopLoss
        long := false
    stopLoss := na
    trailingStopActivation := na
if (low <= trailingStopActivation or high >= stopLoss) and short
    if low <= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if high >= stopLoss
        short := false
    stopLoss := na
    trailingStopActivation := na


//-------------------------------------TRAILING STOP--------------------------------------//

// If the traling stop is activated, we manage its plotting with the bufferTrailingStopDrawing
if bufferTrailingStopDrawing and long
    theoreticalStopPrice := high - trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice > trailingStop
        trailingStop := theoreticalStopPrice
    else if low <= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        long := false
if bufferTrailingStopDrawing and short
    theoreticalStopPrice := low + trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice < trailingStop
        trailingStop := theoreticalStopPrice
    else if high >= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        short := false


//---------------------------------LONG CONDITION--------------------------//

if rsi >= 60 and roc_ma <= rocMovAverLongSignalValue and inRange and not long
    if short
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        short := false
    trailingStopActivation := close + takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close - 3*atr
    long := true
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    strategy.exit("Exit Long", "Long", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------SHORT CONDITION-------------------------------//

if rsi <= 40 and roc_ma >= rocMovAverShortSignalValue and inRange and not short
    if long
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        long := false
    trailingStopActivation := close - takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close + 3*atr
    short := true
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    strategy.exit("Exit Short", "Short", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------PLOTTING ELEMENT---------------------------------//

// Plotting of element in the graph
plotchar(rsi, "RSI", "", location.top, color.rgb(0, 214, 243))
plot(ma, "MA", color.rgb(219, 219, 18))
plotchar(roc_ma, "ROC MA", "", location.top, color=color.orange)
// Visualizer trailing stop and stop loss movement
plot(stopLoss, "SL", color.red, 3, plot.style_linebr)
plot(trailingStopActivation, "Trigger Trail", color.green, 3, plot.style_linebr)
plot(trailingStop, "Trailing Stop",  color.blue, 3, plot.style_linebr)


Lebih banyak