Strategi Trend ATR Pembalikan Purata

Penulis:ChaoZhang, Tarikh: 2023-09-21 11:42:06
Tag:

Ringkasan

Strategi ini menggunakan kenaikan dan penurunan turun naik harga untuk menentukan masa masuk dan keluar kedudukan. Ia bertujuan untuk menubuhkan kedudukan panjang apabila turun naik harga tinggi dan mengambil keuntungan apabila trend harga menguntungkan.

Logika Strategi

  1. Gunakan penunjuk ATR untuk mengukur turun naik harga. Hitung ATR selama 20 tempoh terakhir dan dapatkan purata bergerak dan penyimpangan standardnya. Jika nilai ATR semasa melebihi purata ditambah satu penyimpangan standard, turun naik harga dianggap tinggi.

  2. Menggunakan kadar perubahan harga logaritma peringkat pertama untuk menentukan trend harga. Mengira kadar perubahan harga logaritma dekat selama 20 tempoh terakhir, mendapatkan purata bergerak. Jika kadar perubahan semasa melebihi purata selama 3 hari berturut-turut dan positif, harga dianggap dalam trend menaik.

  3. Apabila turun naik harga adalah tinggi dan harga menunjukkan trend menaik, pergi panjang. Apabila harga menarik balik dan stop loss dicetuskan, kedudukan ditutup. Harga stop loss diselaraskan secara dinamik untuk kekal di bawah harga terendah tolak 2 kali ATR.

Analisis Kelebihan

  1. Menggunakan turun naik harga dan trend untuk menentukan jangka masa panjang/pendek, mengelakkan perdagangan berlebihan di pasaran yang berbeza.

  2. Hentikan kerugian dinamik mengelakkan kerugian yang berlebihan dari hentian yang terlalu luas.

  3. Ujian belakang menunjukkan pulangan tahunan sebanyak 159% pada tahun 2015-2021, jauh melebihi 120% pembelian & memegang.

Analisis Risiko

  1. Parameter ATR yang terlalu agresif boleh menyebabkan terlalu sedikit peluang masuk.

  2. Penunjuk trend boleh menghasilkan isyarat palsu yang bertentangan dengan trend sebenar.

  3. Masa uji balik hanya 6 tahun. memerlukan sampel yang lebih besar dan pemeriksaan ketahanan untuk mengelakkan overfit.

  4. Tidak dapat menilai prestasi dalam keadaan yang melampau seperti kerosakan kilat.

Arahan pengoptimuman

  1. Tambah lebih banyak penunjuk pengesahan trend seperti MACD, KDJ untuk meningkatkan ketepatan trend.

  2. Penyesuaian parameter ATR secara bersesuaian berdasarkan produk dan rejimen pasaran yang berbeza untuk mengoptimumkan penanda turun naik.

  3. Tambah logik breakout dan faktor trend mempercepatkan untuk mengukur pada breakouts.

  4. Uji pelbagai jenis stop loss seperti peratusan, volatility stop pada prestasi.

  5. Menilai pada metrik seperti kekerapan perdagangan, kestabilan kurva, pengeluaran maksimum untuk memastikan ketahanan.

Ringkasan

Strategi ini menggabungkan kelebihan mengukur turun naik dan trend untuk menentukan titik pembalikan yang mungkin untuk memasuki turun naik yang diperkuat, dan menggunakan berhenti dinamik untuk mengawal risiko. Ujian belakang menunjukkan alfa yang baik yang dihasilkan. Tetapi sampel 6 tahun terhad, parameter utama memerlukan penyesuaian khusus pasaran, dan lebih banyak faktor pengesahan diperlukan untuk mengurangkan isyarat palsu. Pemeriksaan ketahanan yang komprehensif juga diperlukan sebelum digunakan untuk perdagangan langsung. Secara keseluruhan ini memberikan idea pembalikan rata-rata pada turun naik tetapi masih memerlukan penyempurnaan dan pengesahan kuantitatif yang ketat untuk menjadi strategi kuantiti yang kukuh.


/*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)
// }


Lebih lanjut