
Strategi ini menggunakan dua EMA rata-rata garis julat untuk menilai trend OBV yang berlainan, mengikut arah trend. Di antaranya, indikator OBV dapat mencerminkan hubungan harga dan jumlah transaksi dengan lebih jelas, menilai kehendak peserta pasaran, dan oleh itu dapat digunakan untuk menangkap trend pasaran. Strategi ini digabungkan dengan pengolahan indikator rata-rata bergerak, yang dapat menghaluskan kebisingan pasaran dengan berkesan dan menangkap trend utama.
Strategi ini berdasarkan kepada apakah indikator OBV berada dalam trend naik untuk menilai masa masuk bermulut. Secara khusus, adalah dengan mengira 6 hari EMA dan 24 hari EMA OBV, yang menghasilkan isyarat bermulut apabila 6 hari EMA melintasi 24 hari EMA. Begitu juga, apabila 6 hari EMA melintasi 24 hari EMA, menghasilkan isyarat kosong.
Kunci strategi ini untuk menilai trend adalah indikator OBV. Indikator OBV mencerminkan kehendak kolektif modal besar, yang dapat mencerminkan sikap peserta pasaran dengan berkesan. Digabungkan dengan pemprosesan purata bergerak, ia dapat memadamkan sebahagian daripada kebisingan, menjadikan isyarat lebih jelas dan boleh dipercayai. Strategi ini menggunakan garis EMA cepat dan garis EMA perlahan untuk membina isyarat perdagangan, yang dapat meratakan data harga, dan juga dapat menangkap perubahan trend dengan lebih sensitif.
Strategi ini mempunyai beberapa kelebihan:
Indikator OBV berdasarkan jumlah transaksi dapat menilai dengan jelas kehendak peserta pasaran, dan isyaratnya lebih dipercayai.
Proses EMA dua hala dapat menghapuskan sebahagian bunyi, menjadikan isyarat lebih jelas.
Kombinasi garis EMA perlahan dan cepat boleh digunakan untuk meratakan harga dan menangkap perubahan trend.
Operasi strategi mudah dan mudah dilaksanakan.
Strategi ini mempunyai beberapa risiko:
Indeks OBV kadang-kadang memberi isyarat yang salah, di mana strategi mungkin rugi.
Dalam keadaan yang teruk, EMA mungkin terlewat dalam pengendalian talian dan mungkin terlepas titik masuk yang optimum.
Tetapan stop loss tetap mungkin terlalu kaku dan tidak dapat menyesuaikan diri dengan perubahan pasaran.
Kaedah pencegahan:
Ia juga boleh digunakan untuk mengesan tanda-tanda yang tidak sesuai dengan tanda-tanda lain.
Pengaturan parameter yang dioptimumkan untuk menjadikan EMA lebih sensitif.
Tetapkan hentian dinamik.
Strategi ini boleh dioptimumkan dalam beberapa arah:
Mengoptimumkan kombinasi parameter EMA untuk mencari parameter garis purata yang lebih sesuai.
Menambah petunjuk lain untuk pengesahan isyarat, seperti MACD, RSI dan lain-lain, meningkatkan ketepatan isyarat.
Tetapkan hentian dinamik, yang dapat menyesuaikan titik hentian dalam masa nyata mengikut turun naik pasaran.
Mengoptimumkan set parameter untuk mencari set parameter yang terbaik.
Strategi ini secara keseluruhannya adalah strategi pengesanan trend yang lebih mudah dan boleh dipercayai. Ia menggabungkan penunjuk OBV dan garis lurus EMA ganda untuk mencapai keputusan mengenai trend. Kelebihannya adalah operasi yang mudah, isyarat jelas, dan dapat mengesan trend dengan berkesan; Kelemahannya adalah mungkin terdapat isyarat yang salah, dan pemprosesan garis EMA mempunyai kelewatan.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("OBV EMA X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)
/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
/////////////// OBV ///////////////
src = close
atr = atr(input(title="ATR Period", defval=3, minval=1))
atrmult = input(title="ATR Mult", defval=1, minval=0)
obv = cum(change(src) > 0 ? volume * (volume / atr) : change(src) < 0 ? -volume * (volume / atr) : 0 * volume / atr)
e1 = ema(obv, input(24))
e2 = ema(obv, input(6))
/////////////// Strategy ///////////////
long = crossover(e2, e1)
short = crossunder(e2, e1)
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
//////////////// Stop loss ///////////////
sl_inp = input(3.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("L", strategy.long, when=long)
strategy.entry("S", strategy.short, when=short)
strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
plot(e1, color = e1 > e1[1] ? color.lime : e1 < e1[1] ? color.red : color.white, linewidth = 2, offset = 0)
plot(e2, color = e2 > e2[1] ? color.lime : e2 < e2[1] ? color.red : color.white, linewidth = 1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)