Trend RSI Mengikuti Strategi Trailing Stop


Tarikh penciptaan: 2023-12-08 11:41:31 Akhirnya diubah suai: 2023-12-08 11:41:31
Salin: 3 Bilangan klik: 722
1
fokus pada
1621
Pengikut

Trend RSI Mengikuti Strategi Trailing Stop

Gambaran keseluruhan

Strategi ini adalah strategi perdagangan automatik yang menggunakan RSI untuk mengenal pasti trend dan menetapkan stop loss untuk pengesahan trend yang digabungkan dengan rata-rata bergerak. Apabila RSI lebih besar daripada 68 dan bergerak di atas rata-rata bergerak semasa, lakukan lebih banyak; apabila RSI lebih kecil daripada 28 dan bergerak di bawah rata-rata bergerak semasa, lakukan kosong.

Prinsip Strategi

Strategi ini menggunakan indikator RSI untuk mengenal pasti trend. Apabila RSI lebih besar daripada 70, ia adalah kawasan membeli yang lebih besar, dan apabila ia lebih kecil daripada 30, ia adalah kawasan menjual yang lebih besar.

Isyarat berbilang kepala: RSI lebih besar daripada 68 dan bergerak di atas purata bergerak semasa sebelum bergerak lebih jauh. Sinyal kosong: RSI kurang daripada 28 dan bergerak di bawah purata bergerak semasa sebelum melintasi purata bergerak, kosong.

Tetapan penghentian kerugian menetapkan peratusan penghentian kerugian yang berbeza untuk setiap titik, dari lebih longgar hingga lebih ketat, iaitu:

Multi Head Stop: 1.4 peratus stop pada tahap tinggi untuk separuh kedudukan, 0.8 peratus stop pada tahap tinggi untuk semua kedudukan kosong. Stop loss berganda: 2% daripada harga tiket.

Hentikan kepala kosong: 0.4% pada titik rendah menghentikan separuh kedudukan, 0.8% pada titik rendah menghentikan keseluruhan kedudukan kosong.
Hentikan kosong: 2% dari harga tiket.

Pada masa yang sama apabila trend berbalik, contohnya apabila RSI lebih banyak daripada 30, harga pasaran akan terpadam sepenuhnya; apabila RSI melebihi 60 maka harga pasaran akan terpadam sepenuhnya.

Kelebihan Strategik

  1. Menggunakan RSI untuk menilai fenomena overbought dan oversold, dan mengelakkan mengejar kenaikan dan penurunan.
  2. Rata-rata bergerak menyaring trend dan mengurangkan pergerakan ke arah yang tidak mainstream.
  3. Tetapkan penamat progresif untuk memaksimumkan keuntungan.
  4. Tetapkan titik hentian yang lebih tinggi untuk memberi ruang yang sesuai kepada trend.
  5. Strategi penyingkiran terbalik yang digabungkan dengan penunjuk arah trend, bertindak balas dengan cepat terhadap kejadian yang tidak dijangka.

Risiko Strategik

  1. RSI Parameter Setting Issues, menyebabkan pengiktirafan yang kurang berkesan.
  2. Masalah dengan parameter purata bergerak yang menyebabkan penapisan tidak berkesan.
  3. Stop loss terlalu longgar, risiko kerugian meningkat.
  4. Ini adalah satu-satunya cara untuk meningkatkan pendapatan anda.
  5. Salah pertimbangan dalam strategi penyelesaian terbalik menyebabkan kerugian yang tidak perlu.

Untuk menghadapi risiko di atas, parameter perlu diuji dan dioptimumkan beberapa kali. Tetapan stop loss harus sesuai, melonggarkan julat tertentu, dan menyesuaikan parameter mengikut turun naik pasaran. Strategi pembersihan perlu berhati-hati, untuk mengelakkan kerugian akibat kesalahan penilaian indikator.

Arah pengoptimuman

Ia boleh dioptimumkan dengan cara berikut:

  1. Menambah lebih banyak penunjuk gelombang untuk meningkatkan ketepatan isyarat. Contohnya, penapis jumlah transaksi ditambah.
  2. Menyesuaikan strategi penutupan kerugian, mengesan harga tertinggi dan harga terendah, dan mencapai penutupan kerugian bergerak.
  3. Adabkan sebahagian stop untuk menjejaki stop untuk memaksimumkan keuntungan.
  4. Menambah kombinasi parameter seperti pertukaran sumber data, penggunaan kitaran yang berbeza untuk varieti yang berbeza.
  5. Menambah pertimbangan kos memegang stok kosong berjangka, penyesuaian dinamik untuk menghentikan kerugian.

ringkaskan

Strategi ini secara keseluruhan adalah strategi pengesanan trend yang lebih mapan dan boleh dipercayai. Ia menggunakan RSI untuk menilai fenomena overbought dan oversold untuk menentukan arah perdagangan. Ia menggunakan purata bergerak untuk pengesahan gelombang. Ia juga menetapkan hentian dan hentian yang tepat. Ia dapat memperoleh keuntungan yang lebih baik dalam trend.

Kod sumber strategi
// © CRabbit
//@version=5

// Starting with $100 and using 10% of the account per trade
strategy("RSI Template", shorttitle="RSI", overlay=false, initial_capital=100, default_qty_value=10, default_qty_type=strategy.percent_of_equity)

// RSI Indicator
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(4, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(23, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.green)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")


// Configure backtest start date with inputs
startDate = input.int(title="Start Date", defval=1, minval=1, maxval=31)
startMonth = input.int(title="Start Month", defval=6, minval=1, maxval=12)
startYear = input.int(title="Start Year", defval=2022, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate = (time >= timestamp(syminfo.timezone,
     startYear, startMonth, startDate, 0, 0))


// Long and Short buy strategy
// Submit a market open/ close Long order, but only on/after start date
if (afterStartDate)
    if rsi > 68 and (rsiMA > rsiMA[1])
        strategy.entry("Long Order", strategy.long, comment="ENTER-LONG")
    if rsi < 30
        strategy.close("Long Order", alert_message="L-CL")

strategy.exit("L-TP1", from_entry="Long Order", limit=high * 1.004, qty_percent=50, alert_message="L-TP1" + str.tostring(high * 1.004))
strategy.exit("L-TP2", from_entry="Long Order", limit=high * 1.008, qty_percent=100, alert_message="L-TP2" + str.tostring(high * 1.008))
strategy.exit("Exit Long", from_entry="Long Order", stop=low * 0.98, alert_message="L-SL" + str.tostring(low * 0.98))        


// Submit a market Open/ Close Short order, but only on/after start date
if (afterStartDate)
    if rsi < 28 and (rsiMA < rsiMA[1])
        strategy.entry("Short Order", strategy.short, comment="ENTER-SHORT")
    if rsi > 60
        strategy.close("Short Order", alert_message="S-CL")    

strategy.exit("S-TP1", from_entry="Short Order", limit=low * 0.996, qty_percent=50, alert_message="S-TP1" + str.tostring(low * 0.996))
strategy.exit("S-TP2", from_entry="Short Order", limit=low * 0.992, qty_percent=100, alert_message="S-TP2" + str.tostring(low * 0.992))
strategy.exit("Exit Short", from_entry="Short Order", stop=high * 1.02, alert_message="S-SL" + str.tostring(high * 1.02))

// MONTHLY TABLE //

prec      = input(2, title = "Return Precision")

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1

cur_month_pnl = 0.0
cur_year_pnl  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)

if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])

if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])

// Monthly P&L Table    
var monthly_table = table(na)

if (barstate.islast)
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_table, 0,  yi + 1, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = array.get(year_pnl, yi) > 0 ? color.new(color.green, transp = 50) : color.new(color.red, transp = 50)
        table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = array.get(month_pnl, mi) > 0 ? color.new(color.green, transp = 70) : color.new(color.red, transp = 70)
        
        table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)