
Strategi perdagangan indikator dinamis adalah strategi pelacakan tren. Strategi ini menggunakan indikator dinamis yang dibangun menggunakan rata-rata bergerak dua indeks, dan kemudian digabungkan dengan indikator tingkat perubahan harga untuk menghasilkan sinyal perdagangan. Ketika indikator dinamis naik, menghasilkan beberapa sinyal; Ketika indikator dinamis turun, menghasilkan sinyal kosong.
Strategi ini menggunakan Decision Point oscillator untuk mengukur momentum. Pertama, perhitungan perubahan harga harian, kemudian rata-rata pergerakan harga selama 31 hari dan 20 hari, dan terakhir dengan rata-rata bergerak selama 9 hari untuk mengirim sinyal perdagangan.
Strategi ini juga memperkenalkan indikator tingkat perubahan harga untuk menghindari sinyal yang salah dalam pencatatan pasar. Secara khusus, adalah menghitung persentase perubahan harga hampir 30 hari, dengan rata-rata bergerak untuk menilai apakah pasar berada dalam keadaan aktif. Hanya ketika pasar aktif, sinyal perdagangan akan dikeluarkan.
Strategi ini menggabungkan indikator momentum dan indikator tingkat perubahan harga, yang dapat secara efektif mengidentifikasi tren jangka menengah dan menghindari perdagangan yang sering terjadi dalam situasi yang bergolak. Ini dapat secara signifikan mengurangi probabilitas perdagangan yang salah dibandingkan dengan strategi tren sederhana seperti mengikuti rata-rata bergerak. Selain itu, dalam hal pengendalian risiko, tempat berhenti telah ditetapkan, yang dapat menghentikan kerugian secara tepat waktu dan secara efektif mengontrol kerugian tunggal.
Strategi ini terutama BASE perdagangan pada tren garis panjang dan menengah, tidak dapat menangkap fluktuasi harga jangka pendek. Ketika terjadi situasi yang ekstrem, titik berhenti dapat ditembus, menyebabkan kerugian yang lebih besar. Selain itu, pengaturan parameter yang tidak tepat juga dapat berdampak pada strategi.
Untuk mencegah risiko, Anda dapat secara tepat menyesuaikan titik-titik stop loss, memperluas stop loss. Anda juga dapat sementara menutup strategi, menghindari probabilitas stop loss yang akan ditembus. Dalam hal penyesuaian parameter, Anda harus melakukan pengembalian rinci dan memilih parameter yang optimal.
Strategi ini dapat dioptimalkan dari beberapa arah:
Menambahkan indikator penyaringan lainnya, seperti indikator volatilitas, dapat menghindari perdagangan selama periode fluktuasi yang kuat.
Menambahkan model pembelajaran mesin untuk membantu menentukan arah dan intensitas tren, dapat meningkatkan akurasi sinyal.
Cobalah berbagai indikator dinamika, seperti indikator relative strength, Stochastic oscillator, dan lain-lain, untuk mengoptimalkan waktu jual beli.
Dalam proses operasi hard disk, kombinasi dengan karakteristik pasar periode terakhir, parameter penyesuaian dinamis, mengejar kombinasi parameter optimal.
Strategi perdagangan indikator momentum secara keseluruhan adalah strategi pelacakan tren jangka menengah dan panjang yang kuat. Ini menggabungkan indikator pergerakan rata-rata indeks dan indikator tingkat perubahan harga untuk mengidentifikasi tren secara efektif dan menghindari perdagangan yang salah.
/*backtest
start: 2022-12-08 00:00:00
end: 2023-11-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Decision 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.075)
/////////////// 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
/////////////// Decision ///////////////
src = input(ohlc4, title="Source")
length1 = input(31, title="First Smoothing")
length2 = input(20, title="Second Smoothing")
siglength = input(9, title="Signal Smoothing")
fr = input(true, title="Fill Region")
calc_csf(src, length) =>
sm = 2.0 / length
csf = 0.0
csf := (src - nz(csf[1])) * sm + nz(csf[1])
csf
i = (src / nz(src[1], src)) * 100
pmol2 = calc_csf(i - 100, length1)
pmol = calc_csf(10 * pmol2, length2)
pmols = ema(pmol, siglength)
d = pmol - pmols
duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL")
hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange
///////////// Rate Of Change /////////////
source = close
roclength = input(30, minval=1)
pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// Strategy ///////////////
long = d > 0 and isMoving()
short = d < 0 and isMoving()
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])
sl_inp = input(2.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)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
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("Long", strategy.long, when=long)
strategy.entry("Short", strategy.short, when=short)
strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal")
mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO")
fill(duml, sigl, color.green, transp=20, title="PosFill")
fill(duml, mdl, color.red, transp=20, title="NegFill")
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)