
Strategi pelacakan tren tsunami dinamis adalah strategi pelacakan tren yang didasarkan pada hukum perdagangan tsunami. Ini menggunakan indikator tsunami untuk mengidentifikasi tren dan, dalam kombinasi dengan indikator dinamis, memfilter sebagian dari perdagangan yang berisik. Keuntungan utama dari strategi ini adalah kemampuan untuk menangkap tren harga yang kuat dan menghasilkan keuntungan tambahan.
Strategi ini menggunakan sistem dasar terobosan dalam indikator tsunami untuk menilai arah tren. Secara khusus, ketika harga close-out lebih tinggi dari harga tertinggi dalam 20 hari terakhir, ini adalah sinyal bullish; ketika harga close-out lebih rendah dari harga terendah dalam 20 hari terakhir, strategi ini adalah sinyal bearish.
Strategi ini juga menambahkan faktor momentum untuk menyaring sebagian dari noise trading. Strategi ini tidak akan masuk ke dalam perdagangan jika harga berfluktuasi kurang dari 5 ATR. Ini dapat menghindari kerugian karena terlalu banyak head-up yang menyebabkan perdagangan kecil.
Setelah membuka posisi, strategi menggunakan nilai N dari prinsip tsunami untuk menembus exit untuk menghentikan kerugian. Sistem ini mengatur titik stop loss berdasarkan harga tertinggi dan terendah dalam 20 hari terakhir. Misalnya, harga stop loss multipel adalah ATR 2N di bawah harga terendah dalam 20 hari terakhir.
Keuntungan terbesar dari strategi ini adalah bahwa ia menggabungkan pelacakan tren dan pengelolaan volume. Sistem perdagangan pirus dapat menangkap tren harga jangka menengah secara akurat dan menghindari gangguan dari kebisingan pasar. Dan menambahkan filter volume ATR dapat mengurangi lebih lanjut jumlah transaksi yang tidak perlu, sehingga meningkatkan ruang untuk keuntungan secara signifikan.
Secara khusus, strategi ini memiliki beberapa keuntungan:
Meskipun ada banyak ruang untuk pengoptimalan strategi ini, ada beberapa risiko potensial yang perlu diwaspadai:
Berdasarkan analisis risiko di atas, strategi ini memiliki beberapa optimasi utama:
Strategi pelacakan tren tsunami dinamika secara keseluruhan adalah program pelacakan tren garis tengah yang sangat praktis. Ini menggabungkan indikator penilaian tren tsunami dan filter getaran indikator ATR, yang dapat secara efektif mengunci tren harga yang kuat. Selain itu, kontrol risiko dan pengoptimalan parameter strategi juga sangat tepat, yang dapat mengurangi kemungkinan penarikan balik. Efek strategi ini dapat ditingkatkan lebih lanjut jika terus menambahkan modul seperti manajemen posisi dinamis, mekanisme reversal, dan target laba.
/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Heiken Ashi 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(2029, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// HA /////////////
haTicker = heikinashi(syminfo.tickerid)
haOpen = security(haTicker, "D", open)
haHigh = security(haTicker, "D", high)
haLow = security(haTicker, "D", low)
haClose = security(haTicker, "D", close)
///////////// Rate Of Change /////////////
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, 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 = haOpen < haClose and isMoving()
short = haOpen > haClose 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("L", strategy.long, when=long)
strategy.entry("S", strategy.short, when=short)
strategy.exit("L SL", "L", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("S SL", "S", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
plotcandle(haOpen, haHigh, haLow, haClose, title='HA Candles', color = haOpen < haClose ? color.lime : color.red)
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)