Strategi Pemangsa Pembalikan

Penulis:ChaoZhang, Tarikh: 2023-11-24 16:43:25
Tag:

img

Ringkasan

Strategi Reversal-Catcher adalah strategi perdagangan pembalikan yang menggunakan penunjuk turun naik Bollinger Bands dan penunjuk momentum RSI. Ia menetapkan saluran Bollinger Bands dan garis overbought / oversold RSI sebagai isyarat untuk mencari peluang pembalikan apabila arah trend berubah.

Logika Strategi

Strategi ini menggunakan Bollinger Bands sebagai penunjuk teknikal utama, digabungkan dengan RSI dan penunjuk momentum lain untuk mengesahkan isyarat perdagangan. Logik khusus adalah:

  1. Menghakimi arah trend utama untuk menentukan kedudukan panjang atau pendek.
  2. Dalam trend penurunan, apabila harga memecahkan di atas Bollinger Lower Band, dan RSI hanya melantun kembali dari wilayah oversold, membentuk salib emas, ia menunjukkan kawasan oversold telah mencapai paras terendah, memberikan isyarat beli.
  3. Dalam trend menaik, apabila harga pecah di bawah Bollinger Upper Band, dan RSI jatuh kembali dari kawasan overbought, membentuk salib mati, ia menunjukkan kawasan overbought mula retracing, memberikan isyarat jual.
  4. Isyarat beli dan jual di atas mesti diaktifkan bersama-sama untuk mengelakkan isyarat palsu.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Menggabungkan penunjuk turun naik dan momentum menjadikan isyarat lebih boleh dipercayai.
  2. Perdagangan pembalikan mempunyai risiko yang lebih rendah, sesuai untuk perdagangan jangka pendek.
  3. Peraturan perdagangan boleh diprogram untuk perdagangan automatik.
  4. Menggabungkan dengan perdagangan trend mengelakkan pembukaan huru-hara semasa penyatuan pasaran.

Analisis Risiko

Risiko strategi ini termasuk:

  1. Bollinger Bands pecah risiko isyarat palsu, memerlukan penapis RSI.
  2. Risiko pembalikan gagal, memerlukan stop loss tepat pada masanya.
  3. Risiko pembalikan masa, mungkin masuk terlalu awal atau terlepas titik masuk terbaik.

Untuk mengawal risiko, kita boleh menetapkan tahap stop loss untuk mengehadkan pendedahan risiko, dan mengoptimumkan parameter seperti tempoh Bollinger Bands atau angka RSI untuk meningkatkan prestasi sistem.

Arahan pengoptimuman

Arah pengoptimuman utama termasuk:

  1. Mengoptimumkan parameter Bollinger Bands, menyesuaikan panjang tempoh dan penyimpangan standard untuk mencari tetapan yang optimum.
  2. Mengoptimumkan tempoh purata bergerak untuk menentukan tempoh terbaik untuk penilaian trend.
  3. Sesuaikan parameter RSI untuk mengetahui julat overbought/oversold terbaik.
  4. Tambah penunjuk lain seperti KDJ, MACD untuk mempelbagaikan isyarat kemasukan.
  5. Memperkenalkan model pembelajaran mesin untuk mencari parameter yang optimum.

Kesimpulan

Strategi Reversal-Catcher adalah strategi perdagangan jangka pendek yang berkesan secara keseluruhan. Dengan menggabungkan penapisan trend dan isyarat pembalikan, ia dapat mengelakkan isyarat palsu semasa penyatuan pasaran dan mengelakkan memerangi trend. Melalui parameter berterusan dan pengoptimuman model, prestasi strategi yang lebih baik dapat dicapai.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This is an Open source work. Please do acknowledge in case you want to reuse whole or part of this code.
// Please see the documentation to know the details about this.

//@version=5
strategy('Strategy:Reversal-Catcher', shorttitle="Reversal-Catcher", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
src = input(close, title="Source (close, high, low, open etc.")

BBlength = input.int(defval=20, minval=1,title="Bollinger Period Length, default 20")
BBmult = input.float(defval=1.5, minval=1.0, maxval=4, step=0.1, title="Bollinger Bands Standard Deviation, default is 1.5")

fastMovingAvg = input.int(defval=21, minval=5,title="Fast Exponential Moving Average, default 21", group = "Trends")
slowMovingAvg = input.int(defval=50, minval=8,title="Slow Exponential Moving Average, default 50", group = "Trends")

rsiLenght = input.int(defval=14, title="RSI Lenght, default 14", group = "Momentum")
overbought = input.int(defval=70, title="Overbought limit (RSI), default 70", group = "Momentum")
oversold = input.int(defval=30, title="Oversold limit (RSI), default 30", group = "Momentum")

hide = input.bool(defval=true, title="Hide all plots and legends from the chart (default: true)")


// Trade related
tradeType = input.string(defval='Both', group="Trade settings", title="Trade Type", options=['Both', 'TrendFollowing', 'Reversal'], tooltip="Consider all types of trades? Or only Trend Following or only Reversal? (default: Both).")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=false, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked. (Default: off)", group="Trade settings")


// Utils
annotatePlots(txt, val, hide) => 
    if (not hide)
        var l1 = label.new(bar_index, val, txt, style=label.style_label_left, size = size.tiny, textcolor = color.white, tooltip = txt)
        label.set_xy(l1, bar_index, val)

/////////////////////////////// Indicators /////////////////////
vwap = ta.vwap(src)
plot(hide ? na : vwap, color=color.purple, title="VWAP", style = plot.style_line)
annotatePlots('VWAP', vwap, hide)

// Bollinger Band of present time frame
[BBbasis, BBupper, BBlower] = ta.bb(src, BBlength, BBmult)
p1 = plot(hide ? na : BBupper, color=color.blue,title="Bollinger Bands Upper Line")
p2 = plot(hide ? na : BBlower, color=color.blue,title="Bollinger Bands Lower Line")
p3 = plot(hide ? na : BBbasis, color=color.maroon,title="Bollinger Bands Width", style=plot.style_circles, linewidth = 1)
annotatePlots('BB-Upper', BBupper, hide)
annotatePlots('BB-Lower', BBlower, hide)
annotatePlots('BB-Base(20-SMA)', BBbasis, hide)

// RSI
rsi = ta.rsi(src, rsiLenght)

// Trend following
ema50 = ta.ema(src, slowMovingAvg)
ema21 = ta.ema(src, fastMovingAvg)
annotatePlots('21-EMA', ema21, hide)
annotatePlots('50-EMA', ema50, hide)


// Trend conditions
upTrend = ema21 > ema50 
downTrend = ema21 < ema50


// Condition to check Special Entry: HH_LL
// Long side:
hhLLong = barstate.isconfirmed and (low > low[1]) and (high > high[1]) and (close > high[1])
hhLLShort = barstate.isconfirmed and (low < low[1]) and (high < high[1]) and (close < low[1])

longCond =  barstate.isconfirmed and (high[1] < BBlower[1]) and (close > BBlower) and (close < BBupper) and hhLLong and ta.crossover(rsi, oversold) and downTrend
shortCond = barstate.isconfirmed and (low[1] > BBupper[1]) and (close < BBupper) and (close > BBlower) and hhLLShort and ta.crossunder(rsi, overbought) and upTrend

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, 1, limit=na, stop=na, comment="Long[E]")
        sl := low[1]
        target := high >= BBbasis ? BBupper : BBbasis
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, 1, limit=na, stop=na, comment="Short[E]")
        sl := high[1]
        target := low <= BBbasis ? BBlower : BBbasis
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long[SL]" : "Long[T]")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short[SL]" : "Short[T]")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "EoD[Exit]", alert_message = "EoD Exit", immediately = true)


Lebih lanjut