Strategi ini menggunakan persilangan garis EMA dual penunjuk OBV untuk menentukan trend OBV, dan mengambil kedudukan panjang / pendek mengikut arah trend. Penunjuk OBV dapat mencerminkan hubungan antara harga dan jumlah dengan lebih jelas dan menilai niat peserta pasaran, jadi ia boleh digunakan untuk menangkap trend pasaran. Strategi ini menggabungkan penyelarasan penunjuk purata bergerak, yang dapat menapis bunyi pasaran dengan berkesan dan menangkap trend utama.
Strategi ini terutamanya menggunakan sama ada OBV berada dalam trend menaik untuk menentukan masa kemasukan panjang. Khususnya, ia mengira EMA 6 hari dan EMA 24 hari OBV. Apabila EMA 6 hari melintasi di atas EMA 24 hari, isyarat panjang dihasilkan. Begitu juga, apabila EMA 6 hari melintasi di bawah EMA 24 hari, isyarat pendek dihasilkan. Di samping itu, strategi ini juga menetapkan stop loss 3%.
Kunci penilaian trend strategi terletak pada penunjuk OBV. Penunjuk OBV mencerminkan niat kolektif wang besar dan dapat mencerminkan sikap peserta pasaran dengan berkesan. Digabungkan dengan pemprosesan garis purata bergerak, beberapa bunyi bising dapat disaring untuk membuat isyarat lebih jelas dan lebih boleh dipercayai. Strategi ini menggunakan garis EMA cepat dan garis EMA perlahan untuk membina isyarat perdagangan, yang dapat meratakan data harga dan juga menangkap perubahan trend dengan lebih sensitif.
Strategi ini mempunyai kelebihan berikut:
Penunjuk OBV berdasarkan jumlah dagangan dapat menilai niat peserta pasaran dengan jelas, dan isyaratnya lebih boleh dipercayai.
Pemprosesan garis EMA berganda boleh menapis beberapa bunyi bising untuk membuat isyarat lebih jelas.
Gabungan garis EMA cepat dan perlahan boleh mengambil kira kedua-dua penyelarasan harga dan menangkap perubahan trend.
Operasi strategi adalah mudah dan mudah dilaksanakan.
Strategi ini juga mempunyai beberapa risiko:
Indikator OBV boleh mengeluarkan isyarat yang salah pada satu ketika, di mana strategi mungkin mengalami kerugian.
Dalam perdagangan ganas, garis EMA mempunyai kesan kelewatan, yang mungkin terlepas titik kemasukan yang optimum.
Tetapan stop loss tetap mungkin terlalu kaku untuk menyesuaikan diri dengan perubahan pasaran.
Tindakan balas:
Pastikan dengan penunjuk lain untuk mengelakkan isyarat yang salah.
Mengoptimumkan tetapan parameter untuk membuat garis EMA lebih sensitif.
Tetapkan stop loss dinamik.
Strategi ini boleh dioptimumkan dalam aspek berikut:
Mengoptimumkan kombinasi parameter EMA untuk mencari parameter purata bergerak yang lebih sesuai.
Meningkatkan penunjuk lain untuk pengesahan isyarat, seperti MACD, RSI, dll., untuk meningkatkan ketepatan isyarat.
Tetapkan stop loss dinamik, yang boleh menyesuaikan titik stop loss dalam masa nyata mengikut turun naik pasaran.
Pengoptimuman kombinasi parameter untuk mencari kombinasi parameter terbaik.
Secara umum, strategi ini adalah strategi trend yang agak mudah dan boleh dipercayai. Ia menggabungkan petunjuk OBV dan garis EMA berganda untuk menilai trend. Kelebihannya adalah operasi yang mudah, isyarat yang jelas, dan keupayaan untuk mengesan trend dengan berkesan. Kelemahannya adalah isyarat yang salah dan kelewatan pemprosesan garis EMA. Pengoptimuman dengan petunjuk lain dapat mencapai hasil yang lebih baik.
/*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)