マルチインジケータースコア取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023年11月7日 16:16:45
タグ:

img

概要

マルチインジケータースコアリング・トレーディング戦略は,自動取引のトレンド方向と強さを特定するために技術指標のスコアリングを統合する. イチモク・クラウド,HMA,RSI,ストック,CCI,MACDを含む指標のグループを考慮する.各インジケーターの結果はスコアされ,全体スコアはすべてのインジケーターのスコアを平均することによって計算される.全体スコアが値を超えると,ロングに行く.値を下回るとショートに行く.

戦略の論理

この戦略にはいくつかの部分があります.

  1. イチモク・クラウド,ハル移動平均,相対強度指数,ストーカスティック,コモディティチャネル指数,移動平均収束ディバージェンスを含む指標のグループを計算します.

  2. 各指標をスコアにします.上昇信号にプラススコア,下落信号にネガティブスコアを与えます.

  3. 総スコアを得るため,すべての指標のスコアを合計して平均します.

  4. 全体のトレンド方向を決定するために,全体的なスコアと事前に設定された値を比較します.スコアが値より高くなった場合,ショートします.

  5. 判断に基づいて ポジションを開く 上昇したときはロング,下落したときはショート

  6. ストップ・ロスを設定して ATRをベースに 利益を取ります

この戦略は,市場動向を決定するために複数の指標の利点を完全に利用しています.単一の指標と比較して,いくつかの誤った信号をフィルターし,信頼性を高めるのに役立ちます.

利点分析

この戦略の利点は以下の通りです.

  1. 複数の指標を組み合わせると信号の正確性が向上する.単一の指標は誤った信号に易い.スコアと平均値は誤った信号を効果的にフィルタリングするのに役立ちます.

  2. 傾向と勢いを特定するために指標の強みを使用します.例えば,傾向のためのイチモククラウド,過剰購入と過剰販売のためのストーキャスティックス.

  3. 自動取引は感情的な影響を避け 戦略信号を厳格に遵守します

  4. ATRをストップ・ロストとテイク・プロフィートに使うことは リスク管理に役立ちます

  5. パラメータとスコアスロージルは,異なる製品に対して最適化できます.

  6. シンプルで明快な論理で 分かりやすく修正できます

リスク分析

この戦略のリスクは

  1. 複数の指標を組み合わせると 一つの指標よりも必ずしも良いわけではありません.最適なパラメータを見つけるために 繰り返しテストが必要です.

  2. 平均的なスコアは 指標が誤った信号を出すとき 損失を完全に避けることはできません

  3. ATRストップは,あまりにも近すぎたり,あまりにも緩すぎたりします.製品の性質に基づいて調整が必要です.

  4. 過剰な最適化による過剰なフィットメントを避ける.異なる製品と時間帯で強さをテストする.

  5. 取引頻度が高いことで 取引コストが上がり 最終収益にも影響します

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. 特定の製品に最適な選択を見つけるために,より多くの指標組み合わせをテストします.

  2. インディケーターのスコアを調整し スコアアルゴリズムを最適化する

  3. 市場変動に適した動的ATRパラメータ

  4. トレードフィルターやボリュームフィルターなど,不要なトレード頻度を減らすためにトレードフィルターを追加します.

  5. パラメータ範囲を見つけるためにステップアップで最適化し,次に最高のパラメータセットをランダム/グリッドで最適化します.

  6. 耐久性を複数の製品と時間枠で試験し,過度に適合しないようにします.

  7. ポートフォリオの他の効果的な取引戦略と組み合わせます

結論

マルチインジケータースコアリング戦略は,インジケータースコアを平均することによって信号の正確性と信頼性を向上させる.大きな最適化スペースがあれば,さまざまな製品で良い結果を得るために最適化することができる.過剰なフィッティングリスクは,パラメータ最適化と戦略テストを科学的に保つために注意が必要である.幅広い最適化方向性を持つ戦略アイデアとして,さらなる研究と適用に値する.


/*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))

もっと