Strategi ini adalah strategi saluran harga adaptif berdasarkan penunjuk Julat Benar Purata (ATR) dan Indeks Arah Purata (ADX). Ia bertujuan untuk mengenal pasti pasaran sampingan dan trend pergerakan harga dan membuat perdagangan dengan sewajarnya.
Mengira tertinggi tinggi (HH) dan terendah rendah (LL) pada panjang yang diberikan.
Hitung +DI dan -DI berdasarkan pergerakan harga ke atas dan ke bawah.
Jika ADX < 25, pasaran dianggap sisi. Jika dekat > saluran atas (HH - ATR pengganda * ATR), pergi panjang. Jika dekat < saluran bawah (LL + ATR pengganda * ATR), pergi pendek.
Jika ADX >= 25 dan +DI > -DI, pasaran adalah bullish.
Jika ADX >= 25 dan +DI < -DI, pasaran adalah bearish.
Kedudukan keluar selepas bar exit_length sejak masuk.
Strategi menyesuaikan diri secara automatik berdasarkan keadaan pasaran, menggunakan strategi saluran di pasaran sampingan dan trend mengikuti di pasaran trend.
Menggunakan ATR dan ADX memastikan kesesuaian. ATR menyesuaikan lebar saluran, ADX menentukan trend.
Keluar paksa menambah kestabilan.
ADX boleh menghasilkan isyarat palsu dengan kerap.
Parameter ATR dan ADX yang lemah membawa kepada prestasi yang buruk.
Tidak dapat melindungi secara berkesan terhadap peristiwa Black Swan.
Mengoptimumkan parameter untuk ATR dan ADX untuk meningkatkan daya adaptasi.
Tambah stop loss untuk mengehadkan kerugian.
Tambah penapis untuk mengelakkan isyarat palsu.
Strategi ini menggabungkan penunjuk dan mekanisme untuk menyesuaikan diri di seluruh keadaan pasaran. tetapi penilaian yang salah boleh berlaku kerana batasan penunjuk. pengoptimuman masa depan pada parameter dan kawalan risiko.
/*backtest start: 2023-11-03 00:00:00 end: 2023-12-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Adaptive Price Channel Strategy", overlay=true) length = input(20, title="Length") exit_length = input(10, title="Exit After X Periods") atr_multiplier = input(3.2, title="ATR Multiplier") startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date") endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date") hh = ta.highest(high, length) ll = ta.lowest(low, length) atr = ta.atr(length) // calculate +DI and -DI upMove = high - high[1] downMove = low[1] - low plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0) minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0) plusDI = ta.rma(plusDM, length) / atr * 100 minusDI = ta.rma(minusDM, length) / atr * 100 // calculate ADX dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100 adx = ta.rma(dx, length) var int barSinceEntry = na if (not na(close[length]) ) if (adx < 25) // Sideways market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 else if (adx >= 25 and plusDI > minusDI) // Bullish market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (adx >= 25 and plusDI < minusDI) // Bearish market if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 if (na(barSinceEntry)) barSinceEntry := barSinceEntry[1] + 1 else if (barSinceEntry >= exit_length) strategy.close("PChLE") strategy.close("PChSE") barSinceEntry := na plot(hh, title="Highest High", color=color.green, linewidth=2) plot(ll, title="Lowest Low", color=color.red, linewidth=2)