다중 지표 스코어링 거래 전략


생성 날짜: 2023-11-07 16:16:45 마지막으로 수정됨: 2023-11-07 16:16:45
복사: 0 클릭수: 730
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다중 지표 스코어링 거래 전략

개요

다중 지표 점수 거래 전략은 기술 지표 점수를 통합하여 트렌드 방향과 강도를 식별하여 자동 거래를 구현합니다. 이 전략은 Ichimoku Cloud, HMA, RSI, Stoch, 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))