다중 지표 점수 거래 전략

저자:차오장, 날짜: 2023-11-07 16:16:45
태그:

img

전반적인 설명

다중 지표 점수 거래 전략은 자동 거래의 경향 방향과 강도를 식별하기 위해 기술 지표 점수를 통합합니다. 이치모쿠 클라우드, HMA, RSI, 스톡, CCI 및 MACD를 포함한 지표 그룹을 고려합니다. 각 지표 결과는 점수를 받고 전체 점수는 모든 지표의 점수를 평균하여 계산됩니다. 전체 점수가 임계 이상일 때 길게 가십시오. 임계 이하일 때 짧게 가십시오.

전략 논리

이 전략은 여러 부분으로 구성됩니다.

  1. 이치모쿠 클라우드, 헐 이동 평균, 상대적 강도 지수, 스토카스틱, 상품 채널 지수 및 이동 평균 컨버전스 디버전스를 포함한 지표 그룹을 계산합니다.

  2. 각 지표에 점수를 부여합니다. 상승 신호에 대해 긍정적으로 점수를 부여하고 하락 신호에 대해 부정적으로 점수를 부여합니다.

  3. 전체 점수를 얻기 위해 모든 지표의 점수를 합치고 평균합니다.

  4. 전체 점수를 미리 설정된 임계치와 비교하여 전체 트렌드 방향을 결정합니다. 점수가 임계치보다 높을 때 길고, 낮을 때 짧습니다.

  5. 판단에 기반한 오픈 포지션입니다. 상승할 때 길고 하락할 때 짧습니다.

  6. ATR에 기초한 스톱 로스를 설정하고 수익을 취합니다.

이 전략은 시장 동향을 결정하기 위해 여러 지표의 장점을 최대한 활용합니다. 단일 지표와 비교하면 일부 잘못된 신호를 필터링하고 신뢰성을 높이는 데 도움이됩니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 여러 가지 지표가 결합되어 신호의 정확성을 향상시킵니다. 단일 지표는 잘못된 신호에 유연합니다. 점수 및 평균화는 잘못된 신호를 효과적으로 필터링하는 데 도움이됩니다.

  2. 트렌드 및 추진력을 식별하기 위해 지표의 강점을 활용하십시오. 예를 들어 트렌드를위한 Ichimoku 클라우드, 과잉 구매 및 과잉 판매를위한 스토카스틱스.

  3. 자동 거래는 감정적인 영향을 피하고 전략 신호를 엄격히 따릅니다.

  4. ATR을 사용해서 Stop Loss를 사용하면 리스크 관리에 도움이 됩니다.

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

더 많은