Strategi penangkapan terbalik


Tanggal Pembuatan: 2023-11-24 16:43:25 Akhirnya memodifikasi: 2023-11-24 16:43:25
menyalin: 0 Jumlah klik: 676
1
fokus pada
1617
Pengikut

Strategi penangkapan terbalik

Ringkasan

Strategi reverse capture adalah strategi trading reverse yang menggunakan volatility indicator Brinline yang digabungkan dengan momentum indicator RSI. Strategi ini menetapkan Brinline channel dan RSI overbought and oversold line sebagai sinyal untuk mencari peluang reverse trading ketika arah tren berubah.

Prinsip Strategi

Strategi ini menggunakan Brinline sebagai indikator teknis utama, ditambah dengan indikator dinamis seperti RSI untuk memvalidasi sinyal perdagangan. Logika spesifiknya adalah:

  1. Untuk menentukan arah tren siklus besar, pastikan apakah itu bullish atau bearish. Gunakan 50 hari EMA dan 21 hari EMA untuk menilai.
  2. Dalam tren turun, ketika harga naik menembus Bollinger Bands dan RSI baru saja bangkit dari zona oversold, muncul bentuk garpu emas yang menunjukkan zona oversold telah mencapai dasar dan dianggap sebagai sinyal beli.
  3. Dalam tren naik, ketika harga turun menembus Bollinger Bands dan RSI baru saja kembali dari zona overbought, muncul bentuk dead fork yang menunjukkan bahwa zona overbought telah mulai berbalik dan dianggap sebagai sinyal jual.
  4. Sinyal beli dan jual di atas harus dipenuhi secara bersamaan, untuk menghindari sinyal palsu.

Analisis Keunggulan

Strategi ini memiliki keuntungan sebagai berikut:

  1. Sinyal ini lebih dapat diandalkan jika digabungkan dengan indikator volatilitas dan indikator momentum.
  2. Perdagangan berbalik memiliki risiko yang lebih rendah, cocok untuk operasi garis pendek.
  3. Aturan pemrograman yang jelas dan mudah untuk melakukan transaksi otomatis.
  4. Bergabunglah dengan perdagangan tren untuk menghindari posisi yang tidak teratur di pasar yang bergejolak.

Analisis risiko

Strategi ini juga memiliki risiko sebagai berikut:

  1. Saluran Brinline memiliki risiko terobosan sinyal palsu, yang memerlukan RSI untuk disaring.
  2. Ini adalah risiko kegagalan untuk membalikkan, yang perlu dihentikan pada waktu yang tepat.
  3. Tidak ada waktu yang tepat untuk membalikkan posisi, dan ada kemungkinan untuk masuk lebih awal atau melewatkan posisi terbaik.

Untuk risiko di atas, Anda dapat mengatur posisi stop loss untuk mengontrol lubang risiko, sekaligus mengoptimalkan parameter, menyesuaikan siklus garis putar atau parameter RSI.

Arah optimasi

Strategi ini dapat dioptimalkan dari beberapa arah:

  1. Mengoptimalkan parameter Brin, menyesuaikan panjang siklus dan ukuran standar deviasi, mencari kombinasi parameter yang optimal.
  2. Mengoptimalkan siklus rata-rata bergerak untuk menentukan panjang siklus optimal untuk menilai tren.
  3. Adaptasi parameter RSI untuk mencari kisaran zona overbought dan oversold yang optimal.
  4. Menambahkan kombinasi indikator lainnya, seperti KDJ, MACD, dan lain-lain, untuk memperkaya alasan masuk sistem.
  5. Menambahkan algoritma pembelajaran mesin, menggunakan teknologi AI untuk secara otomatis mencari parameter terbaik.

Meringkaskan

Strategi reverse capture secara keseluruhan adalah strategi perdagangan short line yang lebih efektif. Ini menggabungkan penilaian tren dan sinyal reverse, yang dapat memfilter sinyal palsu dari pasar yang bergoyang, menghindari pasar yang bergejolak dan hedging tren, dan risiko dapat dikendalikan. Dengan terus mengoptimalkan parameter dan model, efek strategi yang lebih baik dapat diperoleh.

Kode Sumber Strategi
/*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)