
Strategi perdagangan penunjuk pergerakan adalah strategi pengesanan trend. Ia menggunakan purata bergerak dua indeks untuk membina penunjuk pergerakan dan kemudian menggabungkan penunjuk kadar perubahan harga untuk menghasilkan isyarat perdagangan. Apabila penunjuk pergerakan naik, ia menghasilkan isyarat banyak; apabila penunjuk pergerakan turun, ia menghasilkan isyarat kosong.
Strategi ini menggunakan penunjuk purata bergerak dua indeks Decision Point oscillator untuk mengukur pergerakan. Pertama, kiraan kadar perubahan harga setiap hari, kemudian rata-rata purata bergerak dua indeks dengan panjang 31 hari dan 20 hari, dan akhirnya dengan purata bergerak rata-rata 9 hari untuk menghantar isyarat perdagangan.
Strategi ini juga memperkenalkan penunjuk kadar perubahan harga untuk mengelakkan isyarat yang salah dalam pasaran yang disusun. Khususnya, ia adalah peratusan perubahan harga hampir 30 hari yang dikira untuk menentukan sama ada pasaran berada dalam keadaan aktif melalui purata bergerak. Isyarat perdagangan hanya dikeluarkan apabila pasaran aktif.
Strategi ini menggabungkan penunjuk momentum dan penunjuk kadar perubahan harga, yang dapat mengenal pasti trend jangka menengah dengan berkesan, dan mengelakkan perdagangan yang kerap dalam keadaan yang bergolak. Ia dapat mengurangkan kemungkinan perdagangan yang salah dengan ketara berbanding dengan strategi trend sederhana seperti mengesan purata bergerak. Selain itu, kawalan risiko menetapkan titik berhenti yang dapat menghentikan kerugian tepat pada masanya dan mengawal kerugian tunggal dengan berkesan.
Strategi ini terutama BASE berdagang dalam trend garis panjang dan panjang, tidak dapat menangkap turun naik harga jangka pendek. Apabila berlaku keadaan yang teruk, titik berhenti boleh ditembusi, menyebabkan kerugian yang besar. Selain itu, parameter yang tidak betul juga akan mempengaruhi strategi.
Untuk mengelakkan risiko, anda boleh menyesuaikan titik berhenti anda dengan betul, dan meluaskan stop loss anda. Anda juga boleh menutup strategi sementara ketika keadaan yang teruk berlaku, untuk mengelakkan kemungkinan berhenti anda akan ditembusi.
Strategi ini boleh dioptimumkan dalam beberapa arah:
Tambahan penapis lain, seperti penunjuk kadar turun naik, dapat mengelakkan perdagangan semasa turun naik yang teruk.
Menambah model pembelajaran mesin yang membantu menentukan arah dan kekuatan trend dapat meningkatkan ketepatan isyarat.
Cuba pelbagai indikator momentum, seperti penunjuk kekuatan relatif, osilator stokastik, dan lain-lain, untuk mengoptimumkan masa pembelian dan penjualan.
Semasa operasi cakera, menggabungkan ciri-ciri keadaan terkini, parameter penyesuaian dinamik, mengejar kombinasi parameter yang optimum.
Strategi perdagangan indikator momentum secara keseluruhan adalah strategi pengesanan trend jangka panjang yang kuat. Ia menggabungkan indikator pergerakan purata indeks dan indikator kadar perubahan harga untuk mengenal pasti trend dengan berkesan dan mengelakkan perdagangan yang salah. Pada masa yang sama, menetapkan titik berhenti untuk mengawal risiko.
/*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)