Strategi Perdagangan Skor Multi-Indikator

Penulis:ChaoZhang, Tarikh: 2023-11-07 16:16:45
Tag:

img

Ringkasan

Strategi perdagangan penarafan pelbagai penunjuk mengintegrasikan penarafan penunjuk teknikal untuk mengenal pasti arah trend dan kekuatan untuk perdagangan automatik. Ia mempertimbangkan sekumpulan penunjuk termasuk Ichimoku Cloud, HMA, RSI, Stoch, CCI dan MACD. Setiap hasil penunjuk dinilai dan skor keseluruhan dikira dengan menjimatkan semua skor penunjuk. Apabila skor keseluruhan di atas ambang, pergi panjang. Apabila di bawah ambang, pergi pendek.

Logika Strategi

Strategi ini terdiri daripada beberapa bahagian:

  1. Mengira sekumpulan penunjuk termasuk Ichimoku Cloud, Hull Moving Average, Indeks Kekuatan Relatif, Stochastic, Indeks Saluran Komoditi dan Moving Average Convergence Divergence.

  2. Beri skor positif untuk isyarat bullish dan skor negatif untuk isyarat bearish.

  3. Jumlah dan purata semua penunjuk skor untuk mendapatkan skor keseluruhan.

  4. Bandingkan skor keseluruhan dengan ambang yang telah ditetapkan untuk menentukan arah trend keseluruhan.

  5. Posisi terbuka berdasarkan penilaian, panjang apabila menaik, pendek apabila menurun.

  6. Tetapkan stop loss dan ambil keuntungan berdasarkan ATR.

Strategi ini memanfaatkan sepenuhnya kelebihan pelbagai penunjuk untuk menentukan trend pasaran. berbanding dengan satu penunjuk, ia membantu menapis beberapa isyarat palsu dan meningkatkan kebolehpercayaan.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Banyak penunjuk yang digabungkan meningkatkan ketepatan isyarat. Penunjuk tunggal terdedah kepada isyarat palsu. Skor dan purata membantu menapis isyarat palsu dengan berkesan.

  2. Menggunakan indikator kekuatan untuk mengenal pasti trend dan momentum. Sebagai contoh, Ichimoku Cloud untuk trend, Stochastics untuk overbought dan oversold.

  3. Perdagangan automatik mengelakkan kesan emosi dan mengikuti isyarat strategi dengan ketat.

  4. Menggunakan ATR untuk menghentikan kerugian dan mengambil keuntungan membantu pengurusan risiko.

  5. Parameter dan ambang skor boleh dioptimumkan untuk produk yang berbeza.

  6. Logik yang mudah dan jelas, mudah difahami dan diubah.

Analisis Risiko

Risiko strategi ini:

  1. Banyak penunjuk digabungkan tidak semestinya lebih baik daripada satu. perlu ujian berulang untuk mencari parameter optimum.

  2. Skor purata tidak dapat sepenuhnya mengelakkan kerugian apabila penunjuk memberikan isyarat yang salah.

  3. Hentian ATR mungkin terlalu dekat atau terlalu longgar. Perlu penyesuaian berdasarkan sifat produk.

  4. Elakkan pemasangan berlebihan dari pengoptimuman yang berlebihan. Uji ketahanan pada produk dan tempoh masa yang berbeza.

  5. Frekuensi perdagangan yang tinggi meningkatkan kos transaksi yang juga mempengaruhi pulangan akhir.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji lebih banyak kombinasi penunjuk untuk mencari pilihan optimum untuk produk tertentu.

  2. Sesuaikan berat skor penunjuk, optimumkan algoritma skor.

  3. Parameter ATR dinamik untuk menyesuaikan lebih baik dengan turun naik pasaran.

  4. Tambah penapis perdagangan untuk mengurangkan kekerapan perdagangan yang tidak perlu, seperti penapis trend atau penapis jumlah.

  5. Optimumkan langkah demi langkah untuk mencari julat parameter, kemudian optimumkan rawak / grid untuk set parameter terbaik.

  6. Uji ketahanan pada pelbagai produk dan jangka masa untuk mengelakkan pemasangan berlebihan.

  7. Gabungkan dengan strategi perdagangan lain yang berkesan untuk portfolio.

Kesimpulan

Strategi penilaian pelbagai penunjuk meningkatkan ketepatan dan kebolehpercayaan isyarat melalui purata skor penunjuk. Dengan ruang pengoptimuman yang besar, ia boleh dioptimumkan untuk hasil yang baik pada produk yang berbeza. Risiko terlalu banyak memerlukan perhatian untuk memastikan pengoptimuman parameter dan ujian strategi saintifik. Sebagai idea strategi dengan arah pengoptimuman yang luas, ia layak penyelidikan dan penerapan lanjut.


/*backtest
start: 2022-10-31 00:00:00
end: 2023-11-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Ichi HMA RSI Stoch CCI MACD Technicals Rating Strategy",shorttitle="TRSv420",overlay=true,default_qty_type=strategy.percent_of_equity,default_qty_value=50,commission_type=strategy.commission.percent,commission_value=0.05)
res = input("", title="Indicator Timeframe", type=input.resolution)
Period = input(defval = 14, title = "Period Length", minval = 2)
MinSignalStrength= input(title="Minimum Signal Strength", type=input.float, defval=1.1, minval=0.00, maxval=2.00, step=0.1)
Price = input(defval=open, title="Price Source", type=input.source)
Use_Only_Buy= input(false, title = "Use ONLY BUY mode",type=input.bool)
Use_Only_Sell= input(false, title = "Use ONLY SELL mode",type=input.bool)
Use_ATR_SL_TP= input(true, title = "Use ATR for TP & SL",type=input.bool)
Use_Ichimoku= input(true, title = "Use Ichimoku",type=input.bool)
Use_HMA= input(true, title = "Use Hull MA",type=input.bool)
Use_RSI= input(true, title = "Use RSI",type=input.bool)
Use_Stoch= input(true, title = "Use Stoch",type=input.bool)
Use_CCI= input(true, title = "Use CCI",type=input.bool)
Use_MACD= input(true, title = "Use MacD",type=input.bool)
// Ichimoku Cloud
donchian(len) => avg(lowest(len), highest(len))
ichimoku_cloud() =>
    conversionLine = donchian(9)
    baseLine = donchian(26)
    leadLine1 = avg(conversionLine, baseLine)
    leadLine2 = donchian(52)
    [conversionLine, baseLine, leadLine1, leadLine2]
[IC_CLine, IC_BLine, IC_Lead1, IC_Lead2] = ichimoku_cloud()    
calcRatingMA(ma, src) => na(ma) or na(src) ? na : (ma == src ? 0 : ( ma < src ? 1 : -1 ))
calcRating(buy, sell) => buy ? 1 : ( sell ? -1 : 0 )
calcRatingAll() =>
    //============== HMA =================
    HMA10 = hma(Price, Period)
    HMA20 = hma(Price, 20)
    HMA30 = hma(Price, 30)
    HMA50 = hma(Price, 50)
    HMA100 = hma(Price, 100)
    HMA200 = hma(Price, 200)
    // Relative Strength Index, RSI
    RSI = rsi(Price,14)
    // Stochastic
    lengthStoch = 14
    smoothKStoch = 3
    smoothDStoch = 3
    kStoch = sma(stoch(Price, high, low, lengthStoch), smoothKStoch)
    dStoch = sma(kStoch, smoothDStoch)
    // Commodity Channel Index, CCI
    CCI = cci(Price, 20)
    // Moving Average Convergence/Divergence, MACD
    [macdMACD, signalMACD, _] = macd(Price, 12, 26, 9)
    // -------------------------------------------
    PriceAvg = hma(Price, Period)
    DownTrend = Price < PriceAvg
    UpTrend = Price > PriceAvg
    float ratingMA = 0
    float ratingMAC = 0
    if(Use_HMA)
        if not na(HMA10)
            ratingMA := ratingMA + calcRatingMA(HMA10, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA20)
            ratingMA := ratingMA + calcRatingMA(HMA20, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA30)
            ratingMA := ratingMA + calcRatingMA(HMA30, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA50)
            ratingMA := ratingMA + calcRatingMA(HMA50, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA100)
            ratingMA := ratingMA + calcRatingMA(HMA100, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA200)
            ratingMA := ratingMA + calcRatingMA(HMA200, Price)
            ratingMAC := ratingMAC + 1
    if(Use_Ichimoku)
        float ratingIC = na
        if not (na(IC_Lead1) or na(IC_Lead2) or na(Price) or na(Price[1]) or na(IC_BLine) or na(IC_CLine))
            ratingIC := calcRating(
             IC_Lead1 > IC_Lead2 and Price > IC_Lead1 and Price < IC_BLine and Price[1] < IC_CLine and Price > IC_CLine,
             IC_Lead2 > IC_Lead1 and Price < IC_Lead2 and Price > IC_BLine and Price[1] > IC_CLine and Price < IC_CLine)
        if not na(ratingIC)
            ratingMA := ratingMA + ratingIC
            ratingMAC := ratingMAC + 1
    ratingMA := ratingMAC > 0 ? ratingMA / ratingMAC : na
    float ratingOther = 0
    float ratingOtherC = 0
    if(Use_RSI)
        ratingRSI = RSI
        if not(na(ratingRSI) or na(ratingRSI[1]))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(ratingRSI < 30 and ratingRSI[1] < ratingRSI, ratingRSI > 70 and ratingRSI[1] > ratingRSI)
    if(Use_Stoch)
        if not(na(kStoch) or na(dStoch) or na(kStoch[1]) or na(dStoch[1]))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(kStoch < 20 and dStoch < 20 and kStoch > dStoch and kStoch[1] < dStoch[1], kStoch > 80 and dStoch > 80 and kStoch < dStoch and kStoch[1] > dStoch[1])
    if(Use_CCI)
        ratingCCI = CCI
        if not(na(ratingCCI) or na(ratingCCI[1]))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(ratingCCI < -100 and ratingCCI > ratingCCI[1], ratingCCI > 100 and ratingCCI < ratingCCI[1])
    if(Use_MACD)
        if not(na(macdMACD) or na(signalMACD))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(macdMACD > signalMACD, macdMACD < signalMACD)
    ratingOther := ratingOtherC > 0 ? ratingOther / ratingOtherC : na
    float ratingTotal = 0
    float ratingTotalC = 0
    if not na(ratingMA)
        ratingTotal := ratingTotal + ratingMA
        ratingTotalC := ratingTotalC + 1
        ratingTotal := ratingTotal + ratingOther
        ratingTotalC := ratingTotalC + 1
    ratingTotal := ratingTotalC > 0 ? ratingTotal / ratingTotalC : na
    [ratingTotal, ratingOther, ratingMA, ratingOtherC, ratingMAC]
[ratingTotal, ratingOther, ratingMA, ratingOtherC, ratingMAC]  = security(syminfo.tickerid, res, calcRatingAll(), lookahead=false)
tradeSignal = ratingTotal+ratingOther+ratingMA
dynSLpoints(factor) => factor * atr(14) / syminfo.mintick
if not (Use_Only_Sell)
    strategy.entry("long", strategy.long, when = tradeSignal > MinSignalStrength)
if not (Use_Only_Buy)    
    strategy.entry("short", strategy.short, when = tradeSignal < -MinSignalStrength)
if(Use_ATR_SL_TP)
    strategy.exit("sl/tp", loss = dynSLpoints(3), trail_points = dynSLpoints(5), trail_offset = dynSLpoints(2))

Lebih lanjut