Strategi ini menggabungkan Super Trend, Pivot Points dan Average True Range (ATR) untuk membentuk garis stop loss dinamik, dan indikator Average Directional Movement Index (ADX) untuk menilai dan mengesan trend.
Super Trend digabungkan dengan Titik Pivot dan ATR stop loss menilai arah harga menembusi garis stop loss dinamik untuk menentukan arah pembukaan. Pada masa yang sama, penunjuk ADX menilai kekuatan trend dan hanya mengeluarkan isyarat perdagangan apabila trend cukup kuat.
Secara khusus, Titik Pivot pertama mendapatkan sokongan dan rintangan terkini, dan kemudian membentuk harga tengah dinamik dengan purata aritmetik dua hari sebelumnya. Kemudian ATR dikira dan dikalikan dengan faktor ATR, dan kemudian ditambah atau dikurangkan dari harga tengah dinamik untuk mendapatkan rel atas dan bawah. Apabila harga memecahkan rel atas, ia bullish. Apabila ia memecahkan rel bawah, ia bearish. Indikator ADX menilai kekuatan trend, dan hanya mengambil bahagian dalam perdagangan apabila trend cukup kuat.
Garis stop loss akan diselaraskan secara dinamik mengikut harga terkini dan nilai ATR, yang dapat mengesan trend dengan sangat baik.
Strategi ini mempunyai kelebihan berikut:
Gunakan penunjuk Super Trend untuk mengesan arah trend untuk mengelakkan kunci keuntungan oleh pasaran berayun.
Dengan bantuan penunjuk ADX untuk menilai kekuatan trend, elakkan kesilapan dalam perdagangan semasa penyatuan.
Garis stop loss disesuaikan secara dinamik untuk memaksimumkan keuntungan kunci.
Gabungkan RSI untuk mengelakkan overbuy dan oversell.
Secara keseluruhan, tetapan parameter strategi adalah munasabah. Pilihan dframe mengambil kira kesinambungan. Tetapan mengambil keuntungan dan berhenti kerugian juga baik.
Strategi ini juga mempunyai beberapa risiko:
Indikator Super Trend dan MA boleh mengeluarkan isyarat yang bertentangan.
Indikator ADX ditetapkan pada 14 kitaran, yang tidak cukup sensitif terhadap peristiwa tiba-tiba.
Parameter RSI ditetapkan sebagai lalai, yang mungkin gagal sepenuhnya mengelakkan overbought dan oversold.
Kesan peristiwa tiba-tiba tidak dipertimbangkan, seperti berita buruk / baik yang besar.
Penyelesaian yang sepadan:
Sesuaikan kitaran MA untuk sepadan dengan penunjuk Super Trend.
Cuba untuk memendekkan kitaran ADX untuk meningkatkan kepekaan terhadap peristiwa tiba-tiba.
Mengoptimumkan parameter RSI untuk mencari nilai optimum.
Tambah modul penapis berita untuk mengelakkan siaran berita utama.
Strategi ini juga boleh dioptimumkan dalam aspek berikut:
Tambah model pembelajaran mesin untuk menilai trend, membuat keputusan perdagangan lebih bijak.
Cuba memperkenalkan penunjuk emosi alternatif dan bukannya ADX untuk menilai kekuatan trend.
Meningkatkan modul stop loss adaptif untuk menjadikan stop loss lebih dinamik dan tepat.
Keluarkan lebih banyak ciri dengan teknologi pembelajaran mendalam untuk mengoptimumkan keseluruhan strategi.
Gunakan bahasa canggih seperti Python untuk pembangunan strategi untuk meningkatkan skalabiliti strategi.
Secara keseluruhan, strategi ini sangat praktikal. Inti adalah untuk mengesan hala tuju trend dan mengambil bahagian apabila trend cukup kuat. Tetapan stop loss dan mengambil keuntungan juga sangat sesuai untuk memaksimumkan kunci keuntungan sambil mengelakkan kerugian. Sudah tentu, masih ada banyak ruang untuk pengoptimuman. Menambah pembelajaran mesin dan teknologi pembelajaran mendalam akan menjadikan strategi lebih berkesan dan dapat diperluas.
/*backtest start: 2023-01-15 00:00:00 end: 2024-01-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Bendre ADX STrend", overlay = true) /////////////////////////// // SuperTrend + Pivot Point ////////////////////////// src = input(close, title="EMA Source") PPprd = input(defval = 2, title="Pivot Point Period") AtrFactor=input(defval = 2, title = "ATR Factor") AtrPd=input(defval = 21, title = "ATR Period") StartDate = input(timestamp("1 Dec 2023"), title="Start Date") EndDate = input(timestamp("12 Jan 2024"), title="End Date") window() => true var float ph = na var float pl = na ph := ta.pivothigh(PPprd, PPprd) pl :=ta.pivotlow(PPprd, PPprd) float center = na center := center[1] // float lastpp = ph ? ph : pl ? pl : 0.0 float lastpp = na(ph) ? na(pl) ? na : pl : ph if lastpp > 0 if na(center) center := lastpp else center := (center * 2 + lastpp) / 3 Up = center - (AtrFactor * ta.atr(AtrPd)) Dn = center + (AtrFactor * ta.atr(AtrPd)) var float TUp = na var float TDown = na Trend = 0 TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // Lines linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend") bsignalSSPP = close > Trailingsl ssignalSSPP = close < Trailingsl /////// // ADX ////// lenADX = 14 th = 14 TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = ta.sma(DX, lenADX) ////// // MA ///// lenMA = 21 srcMA = input(close, title="Source") // offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) offsetMA = input(0, title="Offset") outMA = ta.sma(srcMA, lenMA) // // RSI // length = input( 14 ) overSold = input( 30 ) overBought = input( 65 ) price = close vrsi = ta.rsi(price, length) // // DMI - Direction Movement Index // [diplus1, diminus1, adx] = ta.dmi(14, 14) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy and vrsi > overBought and adx > 19) // .order // Tuned version strategy.entry("Buy", strategy.long, when = window()) // strategy.close("Sell", "close Sell") if (sell) and (strategy.position_size > 0) // strategy.entry("Sell", strategy.short) strategy.close("Buy", "Close Buy") if(sell and vrsi < overSold and adx > 25) strategy.entry("Sell", strategy.short, when = window()) if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) ) strategy.close("Sell", "close Sell") // if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold) // strategy.entry("Sell", strategy.short, when = window()) // if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0 and (buy)) // strategy.close("Sell", "close Sell")