Strategi pengembalian min berasaskan ATR


Tarikh penciptaan: 2023-10-17 16:27:44 Akhirnya diubah suai: 2023-10-17 16:27:44
Salin: 0 Bilangan klik: 588
1
fokus pada
1237
Pengikut

Strategi pengembalian min berasaskan ATR

Gambaran keseluruhan

Strategi ini menggunakan kaedah ujian hipotesis untuk menentukan sama ada ATR menyimpang dari nilai purata, digabungkan dengan ramalan pergerakan harga, untuk mewujudkan strategi perdagangan pulangan nilai purata berdasarkan ATR. Apabila ATR muncul dengan jelas, menunjukkan bahawa pasaran mungkin mengalami pergerakan yang tidak normal.

Prinsip Strategi

  1. Ujian hipotesis

    • Tempoh ATR cepat ((parameteratr_fast) dan Tempoh ATR perlahan ((parameteratr_slow) melakukan dua ujian sampel t. Asumsikan ujian hipotesis sifar H0 adalah nilai purata kedua-dua sampel tidak ada perbezaan yang ketara.

    • Jika statistik ujian lebih tinggi daripada nilai terhad (dalam lingkungan keyakinan yang ditentukan oleh parameter reliability_factor), maka anda menolak hipotesis asal, iaitu bahawa ATR cepat telah jelas menyimpang dari ATR perlahan.

  2. Ramalan pergerakan harga

    • Pengiraan purata bergerak untuk pulangan logarithmik sebagai kadar drift yang dijangkakan (parameter drift).

    • Jika kadar penyingkiran meningkat, maka ia dianggap sebagai trend pesimis.

  3. Kemasukan dan Keluar

    • Apabila terdapat perbezaan ATR yang ketara dan trend yang lebih baik, anda boleh membuat lebih banyak penyertaan.

    • Selepas itu, anda boleh menggunakan ATR untuk membuat penyesuaian berterusan pada garis stop loss anda. Apabila harga jatuh di bawah garis stop loss, anda boleh keluar dari garis stop loss anda.

Analisis kelebihan

  • Menggunakan ujian hipotesis untuk menentukan ATR yang tidak normal daripada lebih sains, parameter menyesuaikan diri.

  • Dengan menggunakan ramalan trend harga, anda tidak boleh membuat perdagangan yang salah hanya kerana ATR menyimpang.

  • Pengaturan berterusan untuk menghentikan kerugian dan mengurangkan risiko kerugian.

Analisis risiko

  • “Saya tidak tahu apa yang akan berlaku selepas ini, saya tidak tahu apa yang akan berlaku selepas ini.

  • “Saya tidak tahu apa yang akan berlaku selepas ini, saya tidak tahu apa yang akan berlaku selepas ini.

  • Parameter yang tidak betul akan menyebabkan anda terlepas pada masa yang betul atau menambah transaksi yang tidak perlu.

Cadangan Optimasi

  • Anda boleh mempertimbangkan untuk menambah petunjuk lain untuk mengesahkan pelbagai faktor, untuk mengelakkan satu petunjuk yang menyebabkan perdagangan yang salah.

  • Anda boleh menguji kombinasi parameter ATR yang berbeza untuk mencari parameter yang lebih stabil.

  • Meningkatkan penilaian mengenai penembusan pintu harga kritikal, mengelakkan pembelian penembusan palsu.

ringkaskan

Strategi ini mempunyai pemikiran yang jelas, menggunakan hipotesis ujian untuk menilai turun naik yang tidak normal. Tetapi ATR tidak dapat menilai trend sepenuhnya, perlu menambah asas penilaian untuk meningkatkan ketepatan. Peraturan berhenti rugi boleh dipercayai, tetapi tidak dapat menangani penurunan yang terjal.

Kod sumber strategi
/*backtest
start: 2022-10-16 00:00:00
end: 2023-10-16 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

//@version=5
strategy("Mean Reversion (ATR) Strategy v2 [KL] ", overlay=true, pyramiding=1)
var string ENUM_LONG = "Long"
var string GROUP_TEST = "Hypothesis testing"
var string GROUP_TSL = "Stop loss"
var string GROUP_TREND = "Trend prediction"

backtest_timeframe_start = input(defval=timestamp("01 Apr 2000 13:30 +0000"), title="Backtest Start Time")
within_timeframe = true

// TSL: calculate the stop loss price. {
ATR_TSL      = ta.atr(input(14, title="Length of ATR for trailing stop loss", group=GROUP_TSL)) * input(2.0, title="ATR Multiplier for trailing stop loss", group=GROUP_TSL)
TSL_source      = low
TSL_line_color  = color.green
TSL_transp      = 100
var stop_loss_price = float(0)

if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_TSL
else if strategy.position_size > 0
    stop_loss_price := math.max(stop_loss_price, TSL_source - ATR_TSL)
    TSL_transp := 0

plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// } end of "TSL" block

// Entry variables {
// ATR diversion test via Hypothesis testing (2-tailed):
//     H0 : atr_fast equals atr_slow
//     Ha : reject H0 if z_stat is above critical value, say reliability factor of 1.96 for a 95% confidence interval
len_fast    = input(14,title="Length of ATR (fast) for diversion test", group=GROUP_TEST)
atr_fast    = ta.atr(len_fast)
std_error   = ta.stdev(ta.tr, len_fast) / math.pow(len_fast, 0.5) // Standard Error (SE) = std / sq root(sample size)

atr_slow = ta.atr(input(28,title="Length of ATR (slow) for diversion test", group=GROUP_TEST))
test_stat = (atr_fast - atr_slow) / std_error
reject_H0 = math.abs(test_stat) > input.float(1.645,title="Reliability factor", tooltip="Strategy uses 2-tailed test; Confidence Interval = Point Estimate (avg ATR) +/- Reliability Factor x Standard Error; i.e use 1.645 for a 90% confidence interval", group=GROUP_TEST)

// main entry signal, subject to confirmation(s), gets passed onto the next bar
var _signal_diverted_ATR = false
if not _signal_diverted_ATR
    _signal_diverted_ATR := reject_H0


// confirmation: trend prediction; based on expected lognormal returns
_prcntge_chng = math.log(close / close[1]) 

// Expected return (drift) = average percentage change + half variance over the lookback period
len_drift = input(14, title="Length of drift", group=GROUP_TREND)
_drift = ta.sma(_prcntge_chng, len_drift) - math.pow(ta.stdev(_prcntge_chng, len_drift), 2) * 0.5
_signal_uptrend = _drift > _drift[1]

entry_signal_all = _signal_diverted_ATR and _signal_uptrend // main signal + confirmations
// } end of "Entry variables" block

// MAIN {
// Update the stop limit if strategy holds a position
if strategy.position_size > 0 and ta.change(stop_loss_price)
    strategy.exit(ENUM_LONG, comment="sl", stop=stop_loss_price)

// Entry
if within_timeframe and entry_signal_all
    strategy.entry(ENUM_LONG, strategy.long, comment=strategy.position_size > 0 ? "adding" : "initial")

// Alerts
_atr = ta.atr(14)
alert_helper(msg) =>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + str.tostring(close, "#.##") + "; atr=" + str.tostring(_atr, "#.##") + ")"
    alert(str.tostring(prefix) + str.tostring(msg) + str.tostring(suffix), alert.freq_once_per_bar)

if strategy.position_size > 0 and ta.change(strategy.position_size)
    if strategy.position_size > strategy.position_size[1]
        alert_helper("BUY")
    else if strategy.position_size < strategy.position_size[1]
        alert_helper("SELL")

// Clean up - set the variables back to default values once no longer in use
if strategy.position_size == 0
    stop_loss_price := float(0)
if ta.change(strategy.position_size)
    _signal_diverted_ATR := false
// } end of MAIN block