Strategi ini menggunakan volatilitas harga yang tinggi atau rendah untuk menentukan kapan masuk atau keluar dari posisi. Tujuannya adalah untuk membangun posisi multihead ketika volatilitas harga tinggi dan menutup posisi dengan keuntungan ketika tren harga berbalik menguntungkan.
Mengukur tingkat fluktuasi harga menggunakan indikator ATR. Menghitung nilai ATR dari 20 periode terakhir dan menghitung moving average dan standard deviation. Jika nilai ATR saat ini lebih dari rata-rata ditambah satu standar deviasi, maka nilai fluktuasi harga dianggap tinggi.
Menggunakan tingkat perubahan harga biner satu tahap untuk menentukan tren harga. Menghitung tingkat perubahan harga penutupan biner selama 20 siklus terakhir, menghitung rata-rata bergerak, jika tingkat perubahan saat ini lebih besar dari rata-rata selama 3 hari berturut-turut dan positif, harga dianggap dalam tren naik.
Ketika harga berfluktuasi tinggi, dan harga muncul tren naik, melakukan posisi lebih terbuka. Ketika harga muncul kembali, harga stop loss yang dipicu ketika posisi kosong.
Menggunakan volatilitas harga yang tinggi dan rendah dan penilaian tren untuk melakukan lebih banyak waktu melakukan shorting, menghindari sering berdagang di pasar yang bergoyang.
Mengubah harga stop loss secara dinamis untuk menghindari stop loss yang terlalu longgar yang menyebabkan kerugian besar.
Retrospektif menunjukkan bahwa antara 2015-2021, strategi ini mencapai tingkat pengembalian tahunan sebesar 159%, jauh lebih tinggi dari strategi Buy and Hold sebesar 120%.
Setting parameter ATR yang terlalu radikal dapat menyebabkan akses yang terlalu sedikit. Parameter dapat diperluas dengan tepat untuk meningkatkan frekuensi akses.
Indikator penilaian tren dapat menghasilkan penilaian yang salah dan tidak sesuai dengan tren aktual. Faktor konfirmasi harus ditambahkan untuk menghindari potensi kerugian.
Periode pengembalian hanya 6 tahun, perlu memperluas jarak sampel dan melakukan tes stabilitas, untuk menghindari overfit.
Tidak dapat menilai kinerja dalam situasi ekstrim, seperti situasi monopoli yang cepat, membutuhkan intervensi manual atau pengaturan program yang rusak.
Menambahkan indikator pengakuan tren, seperti MACD, KDJ, dan lain-lain, untuk menilai arah tren dengan lebih akurat.
Parameter ATR dapat disesuaikan sesuai dengan berbagai varietas dan kondisi pasar, untuk mengoptimalkan tingkat fluktuasi.
Tambahkan modul penilaian terobosan, konfigurasi faktor akselerasi tren, dan tingkatkan posisi jika terjadi terobosan.
Ujilah berbagai metode penghentian kerugian, seperti penghentian persentase, penghentian fluktuasi, dan sebagainya.
Evaluasi jumlah transaksi, stabilitas kurva keuntungan, maksimum penarikan, dan lain-lain untuk memastikan strategi yang kuat.
Strategi ini mengintegrasikan keuntungan dari volatilitas harga dan penilaian tren, waktu masuk untuk menilai harga yang mungkin berbalik jika terjadi peningkatan volatilitas, pengaturan stop loss dinamis untuk mengendalikan risiko, dari hasil pengujian kembali, keuntungan tambahan yang baik dicapai. Namun, dengan interval sampel hanya 6 tahun, pengaturan parameter kunci perlu disesuaikan dengan pasar yang berbeda, dan perlu diperkenalkan lebih banyak faktor konfirmasi untuk mengurangi probabilitas kesalahan penilaian, selain itu, strategi ini perlu dilakukan tes kesehatan yang lebih komprehensif sebelum benar-benar digunakan dalam perdagangan. Secara keseluruhan, strategi ini memberikan cara berpikir untuk memanfaatkan operasi reversal volatilitas, tetapi juga memerlukan pengoptimalan dan pengujian yang lebih dalam, sehingga strategi ini dapat menjadi strategi yang dapat diandalkan secara stabil.
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji (kevinhhl)
//@version=4
strategy("Mean Reversion (ATR) Strategy [KL]",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2000 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Variables for confirmations of entry {
_len_volat = input(20,title="Length of ATR to determine volatility")
_ATR_volat = atr(_len_volat)
_avg_atr = sma(_ATR_volat, _len_volat)
_std_volat = stdev(_ATR_volat,_len_volat)
signal_diverted_ATR = _ATR_volat > (_avg_atr + _std_volat) or _ATR_volat < (_avg_atr - _std_volat)
_len_drift = input(20,title="Length of Drift")//default set to const: _len_vol's default value
_prcntge_chng = log(close/close[1])
_drift = sma(_prcntge_chng, _len_drift) - pow(stdev(_prcntge_chng, _len_drift),2)*0.5
_chg_drift = _drift/_drift[1]-1
signal_uptrend = (_drift > _drift[1] and _drift > _drift[2]) or _drift > 0
entry_signal_all = signal_diverted_ATR and signal_uptrend
// }
alert_per_bar(msg)=>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + tostring(close) + "; atr=" + tostring(_ATR_volat) + ")"
alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)
// MAIN {
if within_timeframe
if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
alert_per_bar("TSL raised to " + tostring(stop_loss_price))
// EXIT:
if strategy.position_size > 0 and TSL_source <= stop_loss_price
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY:
else if entry_signal_all and (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price))
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
if strategy.position_size == 0
stop_loss_price := float(0)
// }