Strategi perdagangan BabyShark berdasarkan penunjuk VWAP dan OBV RSI


Tarikh penciptaan: 2024-03-08 16:39:28 Akhirnya diubah suai: 2024-03-08 16:39:28
Salin: 0 Bilangan klik: 812
1
fokus pada
1617
Pengikut

Strategi perdagangan BabyShark berdasarkan penunjuk VWAP dan OBV RSI

Gambaran Keseluruhan Strategi

Strategi perdagangan BabyShark VWAP adalah strategi perdagangan kuantitatif berdasarkan purata harga bertimbangan kuantitatif ((VWAP) dan indeks kekuatan relatif (OBV RSI). Strategi ini bertujuan untuk mengenal pasti isyarat pembelian dan penjualan yang berpotensi berdasarkan sejauh mana harga menyimpang dari VWAP dan penembusan RSI OBV tertentu.

Prinsip Strategi

Prinsip utama strategi ini adalah menggunakan kedua-dua indikator VWAP dan OBV RSI untuk menangkap trend dan perubahan momentum di pasaran. VWAP adalah rata-rata dinamik berdasarkan harga dan jumlah transaksi yang dapat mencerminkan kawasan perdagangan utama di pasaran.

Khususnya, strategi ini menggunakan 60 garis K sebagai kitaran pengiraan VWAP, dan mengambil harga penutupan sebagai data input. Kemudian, ia membina kawasan overbought dan oversold berdasarkan jarak 3 standard negatif dari harga VWAP. Untuk OBV RSI, ia menggunakan 5 garis K sebagai kitaran pengiraan, dan menetapkan 70 dan 30 dua paras terendah sebagai kriteria untuk overbought dan oversold.

Dari segi logik perdagangan, apabila harga berada di kawasan jual-beli di bawah VWAP dan OBV RSI kurang dari 30, strategi akan mengeluarkan isyarat lebih banyak; dan apabila harga berada di kawasan jual-beli di atas VWAP dan OBV RSI lebih besar daripada 70, ia akan mengeluarkan isyarat kurang. Selain itu, strategi juga menetapkan peratusan stop-loss sebanyak 0.6%, dan memperkenalkan tempoh sejuk 10 K garis selepas kerugian berturut-turut untuk mengawal risiko.

Kelebihan Strategik

  1. Menggabungkan pelbagai faktor pasaran seperti harga dan jumlah transaksi, untuk menangkap trend dan momentum pasaran secara menyeluruh.
  2. Menggunakan VWAP dan OBV RSI yang dinamik, dapat menyesuaikan diri dengan perubahan kitaran pasaran yang berbeza.
  3. Tetapkan nisbah stop loss dan tempoh tenang yang munasabah untuk mengawal risiko dengan berkesan sambil memanfaatkan peluang.
  4. Logiknya jelas, mudah difahami dan diimplementasikan, dan mempunyai kebolehan untuk ditafsirkan.
  5. Parameter boleh disesuaikan untuk pengoptimuman dan penambahbaikan yang sesuai untuk peniaga dengan gaya yang berbeza.

Risiko Strategik

  1. Untuk pasaran yang bergolak atau keadaan yang berulang, isyarat dagangan yang kerap boleh menyebabkan kelebihan dagangan dan peningkatan kos slip.
  2. Dalam keadaan trend, hanya bergantung pada VWAP untuk menghentikan mungkin menyebabkan strategi keluar terlalu awal dan kehilangan keuntungan trend seterusnya.
  3. Tetapan parameter tetap mungkin tidak dapat disesuaikan dengan perubahan keadaan pasaran, yang memerlukan pengoptimuman untuk pelbagai jenis dan kitaran.
  4. Penunjuk OBV sangat bergantung kepada jumlah transaksi, dan penunjuk yang salah boleh mengelirukan penghakiman apabila data transaksi tidak benar atau dimanipulasi.
  5. Strategi ini kurang mempertimbangkan faktor-faktor luar seperti ekonomi makro, berita, dan lain-lain, dan mungkin tidak berkesan dalam menghadapi situasi yang melampau.

Arah pengoptimuman

  1. Memperkenalkan lebih banyak syarat penapisan untuk pasaran yang bergolak, seperti penunjuk pengesahan trend, penunjuk kadar turun naik, dan lain-lain, untuk mengurangkan perdagangan yang kerap.
  2. Mengoptimumkan keadaan di luar padang, seperti menggunakan hentian bergerak atau menggabungkannya dengan indikator pengesanan trend lain, untuk lebih memahami keadaan trend.
  3. Optimumkan parameter VWAP dan OBV RSI secara adaptif, sesuaikan kitaran pengiraan secara dinamik dan tetapan had.
  4. Memperkenalkan mekanisme pemeriksaan keaslian kuantiti untuk meningkatkan kebolehpercayaan indikator OBV RSI.
  5. Pertimbangkan untuk memasukkan analisis data ekonomi makro, indikator sentimen dan sebagainya untuk meningkatkan daya serap dan ketahanan strategi.

ringkaskan

Strategi perdagangan BabyShark VWAP adalah strategi perdagangan kuantitatif yang menggabungkan harga purata berwajaran purata dan indikator arus tenaga yang agak kuat untuk menghasilkan isyarat perdagangan dengan menangkap keadaan overbought dan oversell di pasaran dan perubahan dinamik trend. Logik strategi ini jelas, menggabungkan beberapa elemen pasaran seperti harga dan jumlah transaksi, dan dapat memahami denyutan pasaran secara menyeluruh. Pada masa yang sama, penyetempatan stop loss dan mekanisme kawalan risiko yang munasabah membolehkan strategi untuk menguruskan risiko sambil mengejar keuntungan.

Kod 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%