Strategi perdagangan BabyShark berdasarkan indikator VWAP dan OBV RSI


Tanggal Pembuatan: 2024-03-08 16:39:28 Akhirnya memodifikasi: 2024-03-08 16:39:28
menyalin: 0 Jumlah klik: 812
1
fokus pada
1617
Pengikut

Strategi perdagangan BabyShark berdasarkan indikator VWAP dan OBV RSI

Tinjauan Strategi

Strategi perdagangan BabyShark VWAP adalah strategi perdagangan kuantitatif yang didasarkan pada nilai rata-rata tertimbang volume transaksi (VWAP) dan indeks kekuatan relatif (OBV RSI). Strategi ini dirancang untuk mengidentifikasi sinyal beli dan jual potensial berdasarkan pada seberapa jauh harga menyimpang dari VWAP dan seberapa jauh OBV RSI telah menembus titik terendah tertentu.

Prinsip Strategi

Prinsip inti dari strategi ini adalah menggunakan dua indikator VWAP dan OBV RSI untuk menangkap tren dan perubahan momentum di pasar. VWAP adalah rata-rata dinamis berdasarkan harga dan volume transaksi yang dapat mencerminkan area perdagangan utama pasar. Ketika harga menyimpang secara signifikan dari VWAP, biasanya berarti pasar mengalami overbought atau oversold.

Secara khusus, strategi ini menggunakan 60 garis K sebagai siklus perhitungan VWAP, dan mengambil harga penutupan sebagai data input. Kemudian, zona overbought dan oversold dibangun berdasarkan jarak 3 standar negatif dari deviasi harga dari VWAP. Untuk OBV RSI, menggunakan 5 garis K sebagai siklus perhitungan, dan menetapkan 70 dan 30 sebagai dua titik terendah sebagai kriteria untuk overbought dan oversold.

Dalam hal logika perdagangan, strategi ini akan mengirimkan sinyal lebih banyak ketika harga berada di zona oversold VWAP downtrend dan OBV RSI kurang dari 30; dan ketika harga berada di zona oversold VWAP uptrend dan OBV RSI lebih dari 70, maka akan mengirimkan sinyal draw. Strategi ini juga menetapkan rasio stop loss 0,6%, dan memperkenalkan periode dingin 10 K-line setelah kerugian berturut-turut untuk mengendalikan risiko.

Keunggulan Strategis

  1. Menggabungkan beberapa faktor pasar seperti harga dan volume transaksi, untuk menangkap tren dan dinamika pasar secara menyeluruh.
  2. Indikator VWAP dan OBV RSI yang dinamis, dapat beradaptasi dengan perubahan siklus pasar yang berbeda.
  3. Tetapkan rasio stop loss dan periode tenang yang wajar untuk mengontrol risiko secara efektif sambil memanfaatkan peluang.
  4. Logika jelas, mudah dipahami dan diimplementasikan, dan memiliki interpretasi tertentu.
  5. Parameter ini dapat disesuaikan, dioptimalkan dan diperbaiki untuk pedagang dengan gaya yang berbeda.

Risiko Strategis

  1. Untuk pasar yang bergoyang atau saat kondisi pasar berulang, sinyal perdagangan yang sering dapat menyebabkan overtrading dan peningkatan biaya slippage.
  2. Dalam situasi tren, hanya mengandalkan VWAP untuk melakukan stop-loss dapat menyebabkan strategi keluar lebih awal dan kehilangan keuntungan tren berikutnya.
  3. Pengaturan parameter tetap mungkin tidak dapat beradaptasi dengan perubahan lingkungan pasar dan perlu dioptimalkan untuk varietas dan siklus yang berbeda.
  4. Indikator OBV sangat bergantung pada volume transaksi, dan jika data volume transaksi tidak benar atau dimanipulasi, indikator yang salah dapat menyesatkan penilaian.
  5. Strategi ini kurang mempertimbangkan faktor-faktor eksternal seperti ekonomi makro, berita, dan lain-lain, dan mungkin tidak efektif dalam menghadapi situasi ekstrem.

Arah optimasi

  1. Untuk pasar yang bergejolak, lebih banyak kondisi penyaringan, seperti indikator konfirmasi tren, indikator volatilitas, dan lain-lain, mengurangi frekuensi perdagangan.
  2. Mengoptimalkan kondisi off-pitch, seperti menggunakan mobile stopwatch atau digabungkan dengan indikator pelacakan tren lainnya, untuk lebih memahami tren.
  3. Optimasi adaptif untuk parameter VWAP dan OBV RSI, menyesuaikan siklus perhitungan dan pengaturan nilai ambang secara dinamis.
  4. Memperkenalkan mekanisme verifikasi keaslian transaksi untuk meningkatkan keandalan indikator OBV RSI.
  5. Pertimbangkan untuk memasukkan analisis data ekonomi makro, indikator sentimen, dan lain-lain untuk meningkatkan adaptasi dan ketahanan strategi.

Meringkaskan

Strategi perdagangan BabyShark VWAP adalah strategi perdagangan kuantitatif yang menggabungkan indeks harga rata-rata bobot volume transaksi dan indikator arus energi yang relatif kuat untuk menghasilkan sinyal perdagangan dengan menangkap keadaan overbought dan oversold di pasar dan perubahan dinamika tren. Logika strategi ini jelas, menggabungkan beberapa elemen pasar seperti harga dan volume transaksi, sehingga dapat memahami impuls pasar secara menyeluruh.

Kode Sumber Strategi
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GreatestUsername

//@version=5
strategy("BabyShark VWAP Strategy", overlay=true, margin_long=100, margin_short=100, calc_on_every_tick = true)


// VWAP
ls = input(false, title='Log-space', group = "Optional")
type = 'Average Deviation'
length = input(60, group="Strategy Modification")
source = input(close, group="Strategy Modification")
_low = ls == true ? math.log(low) : low
_high = ls == true ? math.log(high) : high
src = ls == true ? math.log(source) : source

//weighted mean
pine_vwmean(x, y) =>
    cw = 0.0
    cd = 0.0
    w_sum = 0.0
    d_sum = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw := volume[i]
        d_sum += cw * cd
        w_sum += cw
        w_sum
    d_sum / w_sum

//weighted standard deviation
pine_vwstdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.pow(cd - b, 2)
        w_sum += cw
        w_sum
    math.sqrt(d_sum / w_sum)

//weighted average deviation
pine_vwavdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.abs(cd - b)
        w_sum += cw
        w_sum
    d_sum / w_sum

vwmean = pine_vwmean(src, length)

//consider using Average Deviation instead of Standard Deviatio if there are values outside of 3rd upper & lower bands within a rolling window
dev = if type == 'Standard Deviation'
    dev = pine_vwstdev(src, length, vwmean)
    dev
else if type == 'Average Deviation'
    dev = pine_vwavdev(src, length, vwmean)
    dev

basis = ls == true ? math.exp(vwmean) : vwmean
plot(basis, color=color.new(#b7b7b7, 60), title='Basis')

upper_dev_2 = vwmean + dev * 2
upper_dev_3 = vwmean + dev * 3

lower_dev_2 = vwmean - dev * 2
lower_dev_3 = vwmean - dev * 3

fill(
     plot1=plot(ls == true ? math.exp(upper_dev_2) : upper_dev_2, color=color.new(#B20000, 0), title='Upper dev 2'), 
     plot2=plot(ls == true ? math.exp(upper_dev_3) : upper_dev_3, color=color.new(#FF6666, 0), title='Upper dev 3', display=display.none), 
     color=color.new(#FF4D4D, 80), title='Upper band'
     )
fill(
     plot1=plot(ls == true ? math.exp(lower_dev_3) : lower_dev_3, color=color.new(#00CC00, 0), title='Lower dev 3', display=display.none), 
     plot2=plot(ls == true ? math.exp(lower_dev_2) : lower_dev_2, color=color.new(#008000, 0), title='Lower dev 2'), 
     color=color.new(#006600, 80), title='Lower band'
     )


// Input to enable or disable the table visibility
table_visible = input(false, title="Show Table", group="Deviation Cross Monitor")
// Input for the number of candles to look back
table_length = input(300, title="Table Lookback Length", group="Deviation Cross Monitor")

// Custom count function
count_occurrences(cond, length) =>
    count = 0
    for i = 0 to length - 1
        if cond[i]
            count := count + 1
    count

// Count occurrences of prices above Upper dev 2 and below Lower dev 2

above_upper_dev_2 = count_occurrences(close > upper_dev_2, table_length)
below_lower_dev_2 = count_occurrences(close < lower_dev_2, table_length)

// Create table in the bottom right corner
var table tbl = table.new(position=position.bottom_right, rows=2, columns=2)

if table_visible
    if barstate.islast
        // Update the table headers
        table.cell(tbl, 0, 0, "Above Upper Dev 2", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl, 0, 1, "Below Lower Dev 2", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl, 1, 0, str.tostring(above_upper_dev_2), bgcolor=color.new(color.green, 90), text_color=color.green)
        table.cell(tbl, 1, 1, str.tostring(below_lower_dev_2), bgcolor=color.new(color.red, 90), text_color=color.red)
else
    table.delete(tbl)

// RSI
obvsrc = close
change_1 = ta.change(obvsrc)
obv = ta.cum(ta.change(obvsrc) > 0 ? volume : change_1 < 0 ? -volume : 0 * volume)

src2 = obv
len = input.int(5, minval=1, title="RSI Length", group="Strategy Modification")
up = ta.rma(math.max(ta.change(src2), 0), len)
down = ta.rma(-math.min(ta.change(src2), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
higherlvl = input(70, title="Higher Level", group="Strategy Modification")
lowerlvl = input(30, title="Lower Level", group="Strategy Modification")


plot_color = rsi >= higherlvl ? color.red : rsi <= lowerlvl ? color.green : color.new(#b7b7b7, 60)
// plot(rsi, color=plot_color)

//plot(rsi, color=color.white)



// Count occurrences of RSI crossing higher level and lower level
cross_above_higher = ta.crossover(rsi, higherlvl)
cross_below_lower = ta.crossunder(rsi, lowerlvl)
above_higher_count = count_occurrences(cross_above_higher, table_length)
below_lower_count = count_occurrences(cross_below_lower, table_length)

// Create table in the bottom right corner
if (table_visible)
    var table tbl2 = table.new(position=position.bottom_right, rows=2, columns=2)
    if (barstate.islast)
        // Update the table headers
        table.cell(tbl2, 0, 0, "Higher Level Cross", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl2, 0, 1, "Lower Level Cross", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl2, 1, 0, str.tostring(above_higher_count), bgcolor=color.new(color.red, 90), text_color=color.red)
        table.cell(tbl2, 1, 1, str.tostring(below_lower_count), bgcolor=color.new(color.green, 90), text_color=color.green)


// Entries

// Long Entry:
// Price is in the shaded GREEN area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is GREEN.
longCondition1 = close <= lower_dev_3
longConditions = plot_color == color.green and longCondition1 and strategy.position_size == 0

// Short Entry:
// Price is in the shaded RED area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is RED.
shortCondition1 = close >= upper_dev_3
shortConditions = plot_color == color.red and shortCondition1 and strategy.position_size == 0

var int lastEntryBar = 0


shortEMA = ta.ema(close, 12)
longEMA = ta.ema(close, 21)
uptrend = shortEMA > longEMA

if longConditions and lastEntryBar < bar_index - 10 //and uptrend
    strategy.entry("Long", strategy.long, stop=close * 0.994)
    lastEntryBar := bar_index

if shortConditions and lastEntryBar < bar_index - 10 //and not uptrend
    strategy.entry("Short", strategy.short, stop=close * 1.006)
    lastEntryBar := bar_index


if strategy.position_size > 0 and (ta.crossover(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 0.994 > close)
    strategy.close("Long", immediately = true)
if strategy.position_size < 0 and (ta.crossunder(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 1.006 < close)
    strategy.close("Short", immediately = true)

// Stop Loss:
// 0.6%
// After 1 Loss => NO more Trades for 10 Candles (10 minutes) (usually a breakout will happen, and it takes average 10min till it ranges again. So basically wait for range to form again)

// Take Profit:
// Grey line on [Hoss] VWAP Deviation or 0.6%