Trend RSI Mengikut Strategi

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

Ringkasan

Strategi ini menggabungkan penunjuk RSI dan purata bergerak tertimbang untuk trend mengikuti perdagangan. Ia pergi panjang apabila RSI melebihi 60 dan pergi pendek apabila RSI di bawah 40, dengan purata bergerak mengesahkan keadaan trend. RSI 40 tempoh bertindak sebagai penunjuk trend berikut. Purata bergerak tertimbang menggunakan berat yang berbeza untuk mengurangkan kesan turun naik jangka pendek. Strategi ini juga menggunakan stop loss dan mengambil keuntungan untuk mengawal risiko.

Logika Strategi

Strategi ini mula-mula mengira RSI dan purata bergerak tertimbang. Panjang RSI adalah 20 tempoh dan panjang MA tertimbang adalah 20 dengan berat yang lebih tinggi yang mengurangkan kesan turun naik jangka pendek. Ia menjadi panjang apabila RSI melebihi 60 dan kadar perubahan MA tertimbang di bawah -1%. Ia menjadi pendek apabila RSI di bawah 40 dan kadar perubahan MA tertimbang di atas 1%.

Selepas membuka panjang atau pendek, perintah stop loss dan trailing take profit diletakkan secara serentak. Stop loss ditetapkan pada 3 ATR dari harga semasa. Aktivasi keuntungan mengambil trailing awal adalah 4 ATR jauh, dan jejak dalam kenaikan 3%. Apabila harga mencapai sama ada stop loss atau aktivasi keuntungan mengambil trailing, kedudukan akan ditutup.

Strategi ini juga menggabungkan peraturan pengurusan wang berdasarkan pendekatan saiz kedudukan pecahan tetap. Apabila PNL mencapai jumlah tetap, saiz pesanan meningkat atau berkurangan dengan jumlah tetap.

Analisis Kelebihan

  • Indikator RSI boleh dengan berkesan mengesan trend
  • MA yang ditimbang mengurangkan kesan turun naik jangka pendek, mengelakkan whipsaws
  • Mengikuti mengambil keuntungan membolehkan keuntungan dimaksimumkan
  • Kawalan saiz kedudukan pecahan tetap berisiko dengan berkesan

Kelebihan keseluruhan adalah keupayaan untuk mengikuti trend, sambil mengambil langkah berhenti kerugian dan mengambil keuntungan untuk mengawal risiko, dengan itu menangkap keuntungan yang ketara dalam trend yang kuat.

Analisis Risiko

  • Isyarat palsu dari RSI boleh menyebabkan perdagangan yang tidak perlu
  • Dipaksa berhenti apabila pelanggaran harga berhenti atau ketinggalan mengambil tahap keuntungan, tidak dapat terus mengikuti trend
  • Peraturan pengurusan wang yang agresif boleh membawa kepada kerugian besar

Risiko utama berasal dari kebolehpercayaan isyarat RSI dan tetapan stop loss/trailing take profit. Parameter yang tidak betul boleh mengakibatkan penutupan perdagangan yang tidak perlu atau kerugian di luar selera risiko. Mencacah stop loss/take profit juga boleh memaksa berhenti yang tidak dibenarkan, kehilangan peluang untuk meneruskan perdagangan trend.

Penyelesaian termasuk mengoptimumkan parameter RSI atau menambah penunjuk lain untuk pengesahan isyarat. Sesuaikan paras berhenti / menyusul mengambil keuntungan berdasarkan produk dan keadaan turun naik yang berbeza. Juga berhati-hati dengan peraturan pengurusan wang untuk mengelakkan risiko yang berlebihan.

Arahan pengoptimuman

  • Uji penunjuk lain bersama-sama dengan RSI untuk pengesahan isyarat, contohnya KD, MACD dll.
  • Mengoptimumkan parameter Stop Loss dan Trailing Take Profit berdasarkan ciri produk dan julat turun naik
  • Cuba teknik pengurusan wang lain seperti perdagangan saiz tetap, formula Kelly dan lain-lain
  • Tambah syarat kemasukan seperti pecah Bollinger, perbezaan RSI dan lain-lain
  • Pertimbangkan untuk menambah kedudukan pada trend yang kuat

Terdapat banyak aspek untuk mengoptimumkan. Pertama adalah mengenal pasti penunjuk lain untuk menambah isyarat RSI. Langkah kritikal seterusnya adalah mengoptimumkan parameter stop loss / trailing take profit berdasarkan prestasi sejarah. Pengurusan wang juga boleh beralih ke jenis lain. Akhirnya, kemasukan, keadaan tambahan boleh ditingkatkan ke kedudukan piramida dalam trend yang kuat.

Ringkasan

RSI trend berikut strategi mempunyai logik yang jelas, menggunakan RSI untuk arah trend dan MA tertimbang untuk pengesahan. Kekuatannya terletak pada perdagangan trend, memaksimumkan keuntungan dengan berhenti / pengurusan wang mengawal risiko. Tetapi kebolehpercayaan RSI dan pengoptimuman parameter memerlukan penambahbaikan.

[/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 lanjut