Strategi Aliran ATR Pulangan Min


Tarikh penciptaan: 2023-09-21 11:42:06 Akhirnya diubah suai: 2023-09-21 11:42:06
Salin: 1 Bilangan klik: 704
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini menggunakan kadar turun naik harga untuk menentukan masa masuk atau keluar dari kedudukan, dengan tujuan untuk membina kedudukan multihead ketika kadar turun naik harga lebih tinggi, dan menutup kedudukan dengan keuntungan apabila trend harga berubah menguntungkan.

Prinsip Strategi

  1. Mengukur kadar turun naik harga menggunakan indikator ATR. Mengira nilai ATR untuk 20 kitaran terakhir dan mengira purata bergerak dan perbezaan piawai. Jika nilai ATR semasa melebihi purata ditambah satu perbezaan piawai, harga dianggap lebih tinggi.

  2. Menggunakan kadar perubahan harga binari peringkat pertama untuk menentukan trend harga. Mengira kadar perubahan harga penutupan binari untuk 20 kitaran terakhir, mengira purata bergerak, jika kadar perubahan semasa lebih besar daripada purata selama 3 hari berturut-turut dan positif, harga dianggap dalam trend naik.

  3. Apabila kadar turun naik harga tinggi, dan harga muncul dalam trend naik, buat lebih banyak kedudukan. Apabila harga muncul kembali, harga hentian tercetus apabila harga hentian tercetus. Penyesuaian dinamik harga hentian, sentiasa mengekalkan antara 2 kali ganda harga minimum tolak ATR.

Analisis kelebihan

  1. Mengambil kesempatan daripada turun naik harga yang tinggi dan rendah dan penilaian trend untuk melakukan lebih banyak masa kosong, dan mengelakkan perdagangan yang kerap di pasaran yang bergolak.

  2. Mengubah harga stop loss secara dinamik untuk mengelakkan stop loss yang terlalu longgar membawa kepada kerugian yang besar.

  3. Pengkajian menunjukkan bahawa antara 2015 dan 2021, strategi ini mencapai 159% pulangan tahunan, jauh lebih tinggi daripada 120% dari strategi Beli dan Tahan.

Analisis risiko

  1. Tetapan parameter ATR yang terlalu radikal boleh menyebabkan peluang masuk yang terlalu sedikit. Parameter dapat diperluas dengan tepat untuk meningkatkan frekuensi masuk.

  2. Indikator penghakiman trend boleh menyebabkan kesalahan penghakiman, tidak sesuai dengan trend sebenar, faktor pengesahan harus ditambah untuk mengelakkan kerugian yang berpotensi.

  3. Tempoh pengembalian hanya 6 tahun, perlu meluaskan julat sampel dan melakukan ujian kestabilan, untuk mengelakkan terlalu sesuai.

  4. Tidak dapat menilai prestasi dalam keadaan yang melampau, seperti keadaan monopoli yang cepat, memerlukan campur tangan tangan manusia atau menetapkan program untuk berhenti.

Arah pengoptimuman

  1. Menambah indikator pengesahan trend, seperti MACD, KDJ dan lain-lain, untuk menilai arah trend dengan lebih tepat.

  2. Parameter ATR boleh disesuaikan mengikut pelbagai jenis dan keadaan pasaran untuk mengoptimumkan kadar turun naik.

  3. Tambah modul penilaian terobosan, konfigurasi faktor percepatan trend, dan meningkatkan kedudukan apabila terobosan berlaku.

  4. Uji kesesuaian pelbagai kaedah penghentian, seperti peratusan penghentian, penghentian pergerakan, dan sebagainya.

  5. Penilaian jumlah dagangan, kestabilan keluk keuntungan, pengeluaran maksimum, dan lain-lain untuk memastikan strategi yang kukuh.

ringkaskan

Strategi ini mengintegrasikan kelebihan penilaian harga turun naik dan trend, menilai harga yang mungkin berbalik apabila turun naik meningkat, menetapkan waktu masuk yang dinamik untuk mengawal risiko, dari hasil pengukuran, keuntungan tambahan yang baik dicapai. Tetapi dengan jarak sampel hanya 6 tahun, penetapan parameter utama perlu disesuaikan dengan pasaran yang berbeza, dan lebih banyak faktor pengesahan perlu diperkenalkan untuk mengurangkan kemungkinan kesalahan penilaian, selain itu, strategi perlu diuji dengan lebih lengkap untuk keselamatan sebelum benar-benar digunakan dalam perdagangan.

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