ADX,RSI,SMA Strategi Dagangan Gabungan Multi-Indikator

Penulis:ChaoZhang, Tarikh: 2023-09-14 16:19:46
Tag:

Logika Strategi

Strategi ini menggabungkan pelbagai penunjuk teknikal untuk mengenal pasti arah trend dan tahap overbought / oversold untuk isyarat perdagangan.

Penunjuk utama yang digunakan ialah:

  1. Indeks Arah Purata (ADX): Kekuatan Trend

  2. Indeks Kekuatan Relatif (RSI): Overbought/Oversold

  3. Purata Bergerak Sederhana (SMA): Trend Jangka Pendek

  4. SuperTrend: Trend jangka panjang/pendek

  5. Penembusan Saluran: Penembusan aliran masuk

Logik perdagangan adalah:

  1. ADX menunjukkan kehadiran trend dan kekuatan

  2. SuperTrend mengesahkan penyelarasan trend jangka pendek / jangka panjang

  3. RSI mengenal pasti rantau yang terlalu banyak dibeli/terlalu banyak dijual

  4. Masukkan pada SMA crossover

  5. Masukkan saluran pecah

Kombinasi pelbagai penunjuk meningkatkan ketepatan isyarat. Strategi yang berbeza digabungkan menjadi pendekatan sistematik.

Kelebihan

  • Pelbagai penunjuk meningkatkan kualiti

  • Strategi menggabungkan untuk kemasukan sistematik

  • ADX mengenal pasti trend, RSI overbought/oversold

  • SuperTrend menangkap trend, SMA & saluran masuk

Risiko

  • Penyesuaian pelbagai parameter memerlukan pengoptimuman

  • Keadaan gabungan berlaku kurang kerap

  • Isyarat penunjuk yang bertentangan yang sukar diselesaikan

Ringkasan

Strategi ini sepenuhnya menggunakan kekuatan pelbagai penunjuk untuk membina sistem yang kukuh. Tetapi pengoptimuman parameter adalah kunci untuk kekerapan perdagangan yang ideal. Secara keseluruhan ia menggabungkan pengenalan trend yang kuat dengan entri yang cekap.


/*backtest
start: 2023-09-12 00:00:00
end: 2023-09-13 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// strategy("Combined Strategy", overlay=true, default_qty_value=100, initial_capital=1000, margin_long=0.1)

adxlen = input(7, title="ADX Smoothing")
dilen = input(7, title="DI Length")
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)

// The same on Pine Scriptâ„¢
pine_supertrend(factor, atrPeriod) =>
    src = hl2
    atr = ta.atr(atrPeriod)
    upperBand = src + factor * atr
    lowerBand = src - factor * atr
    prevLowerBand = nz(lowerBand[1])
    prevUpperBand = nz(upperBand[1])

    lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
    upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
    int direction = na
    float superTrend = na
    prevSuperTrend = superTrend[1]
    if na(atr[1]) and ta.rsi(close, 21) < 66 and ta.rsi(close,3) > 80 and ta.rsi(close, 28) > 49 and sig > 20
        direction := 1
    else if prevSuperTrend == prevUpperBand
        direction := close > upperBand ? -1 : 1
    else
        direction := close < lowerBand ? 1 : -1
    superTrend := direction == -1 ? lowerBand : upperBand
    [superTrend, direction]

[pineSupertrend, pineDirection] = pine_supertrend(3, 10)
upTrend = pineDirection < 0
downTrend = pineDirection > 0

// Define the 20-period SMA
sma20 = ta.sma(close, 20)

a = ta.rsi(close,14)
OB = input(70)
OS = input(30)
os = a > OB
ob = a < OS

if upTrend and close > pineSupertrend and close > sma20 and os
    strategy.entry("Buy", strategy.long)

if ta.crossunder(close, sma20) or ob
    strategy.close_all()

//define when to breakout of channel 
//("ChannelBreakOutStrategy", overlay=true)
length = input.int(title="Length", minval=1, maxval=1000, defval=5)
upBound = ta.highest(high, length)
downBound = ta.lowest(low, length)
if (not na(close[length]))
	strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE")
strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")


Lebih lanjut