Strategi ini menggunakan persilangan garis EMA ganda dari indikator OBV untuk menentukan tren OBV, dan mengambil posisi panjang/pendek sesuai dengan arah tren. Indikator OBV dapat mencerminkan hubungan antara harga dan volume lebih jelas dan menilai niat peserta pasar, sehingga dapat digunakan untuk menangkap tren pasar. Strategi ini menggabungkan penghalusan indikator rata-rata bergerak, yang dapat secara efektif menyaring kebisingan pasar dan menangkap tren utama.
Strategi ini terutama menggunakan apakah OBV berada dalam tren naik untuk menentukan waktu masuk panjang. Secara khusus, ini menghitung EMA 6 hari dan EMA 24 hari OBV. Ketika EMA 6 hari melintasi di atas EMA 24 hari, sinyal panjang dihasilkan. Demikian pula, ketika EMA 6 hari melintasi di bawah EMA 24 hari, sinyal pendek dihasilkan. Selain itu, strategi ini juga menetapkan stop loss 3%.
Kunci penilaian tren strategi terletak pada indikator OBV. Indikator OBV mencerminkan niat kolektif uang besar dan dapat secara efektif mencerminkan sikap peserta pasar. Dikombinasikan dengan pemrosesan garis rata-rata bergerak, beberapa kebisingan dapat disaring untuk membuat sinyal lebih jelas dan lebih dapat diandalkan. Strategi ini menggunakan garis EMA cepat dan garis EMA lambat untuk membangun sinyal perdagangan, yang dapat meluruskan data harga dan juga menangkap perubahan tren dengan lebih sensitif.
Strategi ini memiliki keuntungan berikut:
Indikator OBV berdasarkan volume perdagangan dapat dengan jelas menilai niat peserta pasar, dan sinyalnya lebih dapat diandalkan.
Pemrosesan jalur EMA ganda dapat menyaring beberapa kebisingan untuk membuat sinyal lebih jelas.
Kombinasi garis EMA cepat dan lambat dapat memperhitungkan baik penyelarasan harga maupun menangkap perubahan tren.
Operasi strategi sederhana dan mudah dilaksanakan.
Strategi ini juga memiliki beberapa risiko:
Indikator OBV dapat mengeluarkan sinyal yang salah pada suatu titik, di mana strategi dapat mengalami kerugian.
Dalam perdagangan kekerasan, garis EMA memiliki efek keterlambatan, yang mungkin melewatkan titik masuk yang optimal.
Pengaturan stop loss tetap mungkin terlalu kaku untuk beradaptasi dengan perubahan pasar.
Pengendalian:
Konfirmasi dengan indikator lain untuk menghindari sinyal yang salah.
Mengoptimalkan pengaturan parameter untuk membuat garis EMA lebih sensitif.
Tetapkan stop loss dinamis.
Strategi dapat dioptimalkan dalam aspek berikut:
Mengoptimalkan kombinasi parameter EMA untuk menemukan parameter rata-rata bergerak yang lebih cocok.
Meningkatkan indikator lain untuk konfirmasi sinyal, seperti MACD, RSI, dll, untuk meningkatkan akurasi sinyal.
Atur stop loss dinamis, yang dapat menyesuaikan titik stop loss secara real time sesuai dengan fluktuasi pasar.
Optimasi kombinasi parameter untuk menemukan kombinasi parameter terbaik.
Secara umum, strategi ini adalah strategi tren yang relatif sederhana dan dapat diandalkan. Ini menggabungkan indikator OBV dan garis EMA ganda untuk menilai tren. Keuntungannya adalah operasi sederhana, sinyal yang jelas, dan kemampuan untuk melacak tren secara efektif. Kelemahannya adalah kemungkinan sinyal yang salah dan keterlambatan pemrosesan garis EMA. Optimasi dengan indikator 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)