Sumber daya yang dimuat... Pemuatan...

Strategi Pemangsa Pembalik

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

img

Gambaran umum

Strategi Reversal-Catcher adalah strategi trading reversal yang menggunakan indikator volatilitas Bollinger Bands dan indikator momentum RSI. Strategi ini menetapkan saluran Bollinger Bands dan garis overbought/oversold RSI sebagai sinyal untuk menemukan peluang reversal ketika arah tren berubah.

Logika Strategi

Strategi ini menggunakan Bollinger Bands sebagai indikator teknis utama, dikombinasikan dengan RSI dan indikator momentum lainnya untuk memverifikasi sinyal perdagangan.

  1. Gunakan EMA 50 hari dan EMA 21 hari silang emas / silang mati untuk menentukan tren.
  2. Dalam tren penurunan, ketika harga menembus atas Bollinger Lower Band, dan RSI hanya memantul kembali dari wilayah oversold, membentuk salib emas, itu menunjukkan area oversold telah mencapai titik terendah, memberikan sinyal beli.
  3. Dalam tren naik, ketika harga menembus di bawah Bollinger Upper Band, dan RSI jatuh kembali dari area overbought, membentuk cross mati, ini menunjukkan area overbought mulai retracing, memberikan sinyal jual.
  4. Sinyal beli dan jual di atas harus dipicu bersama-sama untuk menghindari sinyal palsu.

Analisis Keuntungan

Keuntungan dari strategi ini meliputi:

  1. Menggabungkan indikator volatilitas dan momentum membuat sinyal lebih andal.
  2. Perdagangan reversal memiliki risiko yang lebih rendah, cocok untuk perdagangan jangka pendek.
  3. Aturan perdagangan dapat diprogram untuk perdagangan otomatis.
  4. Menggabungkan dengan perdagangan tren menghindari pembukaan gangguan selama konsolidasi pasar.

Analisis Risiko

Risiko dari strategi ini meliputi:

  1. Bollinger Bands breakout risiko sinyal palsu, membutuhkan filter RSI.
  2. Risiko pembalikan gagal, membutuhkan stop loss yang tepat waktu.
  3. Risiko waktu pembalikan, mungkin masuk terlalu awal atau melewatkan titik masuk terbaik.

Untuk mengontrol risiko, kita dapat mengatur level stop loss untuk membatasi risiko, dan mengoptimalkan parameter seperti periode Bollinger Bands atau angka RSI untuk meningkatkan kinerja sistem.

Arahan Optimasi

Arah optimasi utama meliputi:

  1. Mengoptimalkan parameter Bollinger Bands, menyesuaikan panjang periode dan standar deviasi untuk menemukan pengaturan yang optimal.
  2. Mengoptimalkan periode moving average untuk menentukan periode terbaik untuk penilaian tren.
  3. Sesuaikan parameter RSI untuk mengetahui rentang overbought/oversold terbaik.
  4. Tambahkan indikator lain seperti KDJ, MACD untuk mendiversifikasi sinyal masuk.
  5. Memperkenalkan model pembelajaran mesin untuk menemukan parameter yang dioptimalkan.

Kesimpulan

Strategi Reversal-Catcher adalah strategi trading jangka pendek yang efektif secara keseluruhan. Dengan menggabungkan penyaringan tren dan sinyal pembalikan, dapat menghindari sinyal palsu selama konsolidasi pasar dan menghindari memerangi tren. Melalui parameter terus menerus dan optimasi model, kinerja 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 banyak