Strategi Dagangan VWAP BabyShark Berdasarkan Indikator RSI VWAP dan OBV

Penulis:ChaoZhang, Tarikh: 2024-03-08 16:39:28
Tag:

img

Ringkasan Strategi

Strategi perdagangan BabyShark VWAP adalah strategi perdagangan kuantitatif berdasarkan Volume Weighted Average Price (VWAP) dan On Balance Volume Relative Strength Index (OBV RSI).

Prinsip Strategi

Prinsip utama strategi ini adalah menggunakan penunjuk VWAP dan OBV RSI untuk menangkap trend pasaran dan perubahan momentum. VWAP adalah purata bergerak dinamik berdasarkan harga dan jumlah, yang mencerminkan kawasan perdagangan utama pasaran. Apabila harga menyimpang secara signifikan dari VWAP, ia biasanya menunjukkan keadaan beli berlebihan atau oversold di pasaran. OBV RSI, sebaliknya, memperkenalkan faktor jumlah berdasarkan penunjuk RSI tradisional untuk menentukan kekuatan trend pasaran dengan mengukur intensiti perubahan jumlah.

Secara khusus, strategi ini menggunakan 60 lilin sebagai tempoh pengiraan untuk VWAP, dengan harga penutupan sebagai data input. Ia kemudian membina zon overbought dan oversold berdasarkan penyimpangan harga positif dan negatif 3 penyimpangan standard dari VWAP. Untuk OBV RSI, ia menggunakan 5 lilin sebagai tempoh pengiraan dan menetapkan ambang 70 dan 30 sebagai kriteria untuk menentukan keadaan overbought dan oversold.

Dari segi logik perdagangan, apabila harga berada di zon oversold di bawah band bawah VWAP dan OBV RSI kurang daripada 30, strategi menghasilkan isyarat panjang. Sebaliknya, apabila harga berada di zon overbought di atas band atas VWAP dan OBV RSI lebih besar daripada 70, ia menghasilkan isyarat pendek. Di samping itu, strategi menetapkan nisbah mengambil keuntungan dan menghentikan kerugian sebanyak 0.6% dan memperkenalkan tempoh penyejukan 10 lilin selepas kerugian berturut-turut untuk mengawal risiko.

Kelebihan Strategi

  1. Menggabungkan pelbagai faktor pasaran seperti harga dan jumlah untuk menangkap trend dan momentum pasaran secara komprehensif.
  2. Menggunakan penunjuk RSI VWAP dan OBV dinamik untuk menyesuaikan diri dengan perubahan dalam kitaran pasaran yang berbeza.
  3. Menetapkan nisbah keuntungan yang munasabah dan menghentikan kerugian dan tempoh pendinginan untuk mengawal risiko dengan berkesan sambil merebut peluang.
  4. Logik yang jelas, mudah difahami dan dilaksanakan, dengan tahap tafsiran tertentu.
  5. Parameter yang boleh diselaraskan, sesuai untuk peniaga dengan gaya yang berbeza untuk mengoptimumkan dan meningkatkan.

Risiko Strategi

  1. Untuk pasaran yang bergoyang atau berulang, isyarat perdagangan yang kerap boleh menyebabkan perdagangan berlebihan dan peningkatan kos seluncur.
  2. Dalam pasaran trend, hanya bergantung kepada VWAP untuk mengambil keuntungan boleh menyebabkan strategi keluar terlalu awal, kehilangan keuntungan trend berikutnya.
  3. Tetapan parameter tetap mungkin tidak disesuaikan dengan perubahan keadaan pasaran, yang memerlukan pengoptimuman untuk instrumen dan jangka masa yang berbeza.
  4. Penunjuk OBV sangat bergantung kepada data jumlah; apabila data jumlah tidak tepat atau dimanipulasi, penyimpangan penunjuk boleh menyesatkan penilaian.
  5. Strategi ini tidak mempertimbangkan faktor luaran seperti makroekonomi dan berita, dan mungkin gagal dalam keadaan pasaran yang melampau.

Arahan pengoptimuman

  1. Memperkenalkan lebih banyak keadaan penapisan untuk pasaran berayun, seperti penunjuk pengesahan trend dan penunjuk turun naik, untuk mengurangkan perdagangan yang kerap.
  2. Mengoptimumkan keadaan keluar, seperti menggunakan hentian yang mengikuti atau menggabungkan dengan penunjuk trend lain untuk menangkap pasaran yang lebih baik.
  3. Melakukan pengoptimuman adaptif parameter VWAP dan OBV RSI, menyesuaikan tempoh pengiraan dan tetapan ambang secara dinamik.
  4. Memperkenalkan mekanisme pengesahan kesahihan jumlah untuk meningkatkan kebolehpercayaan penunjuk OBV RSI.
  5. Mempertimbangkan untuk menggabungkan analisis data makroekonomi, penunjuk sentimen, dan lain-lain, untuk meningkatkan kebolehan penyesuaian dan ketahanan strategi.

Ringkasan

Strategi dagangan BabyShark VWAP adalah strategi dagangan kuantitatif yang menggabungkan harga purata berwajaran volum dan indeks kekuatan relatif volum pada imbangan untuk menjana isyarat dagangan dengan menangkap keadaan beli berlebihan dan dijual berlebihan dan perubahan momentum trend. Strategi ini mempunyai logik yang jelas, mengintegrasikan pelbagai faktor pasaran seperti harga dan jumlah untuk memahami nadi pasaran secara menyeluruh. Pada masa yang sama, tetapan keuntungan yang munasabah dan tetapan hentian kerugian dan mekanisme kawalan risiko membolehkan strategi untuk mengejar pulangan sambil mempertimbangkan pengurusan risiko. Walau bagaimanapun, strategi ini juga mempunyai isu-isu berpotensi seperti kemampuan penyesuaian yang tidak mencukupi untuk pasaran berayun dan tren dan pengoptimum tetap. Penambahbaikan masa depan boleh memberi tumpuan kepada penyesuai kemasukan, pengambilan keuntungan dinamik, parameter dinamik, meningkatkan analisis data luaran, dan meningkatkan lagi ketahanan dan keuntungan strategi. Secara keseluruhan, VWAP BabyShark menyediakan kerangka rujukan untuk strategi dagangan yang bernilai meneroka dan meningkatkan lagi.


/*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%



Lebih lanjut