HMA와 CCI 콤보 트렌드 전략

저자:차오장, 날짜: 2023-09-11 15:02:37
태그:

이 전략은 HMA와 CCI를 결합하여 트렌드를 식별하고 거래합니다. 구체적으로 HMA가 상향으로 깨지고 CCI가 하위 대역을 넘을 때 길게 가고 HMA가 하향으로 깨지고 CCI가 상위 대역을 넘을 때 짧게됩니다. HMA가 반대 방향으로 다시 깨거나 CCI가 다시 임계 범위를 넘을 때 출구가 발생합니다.

이 전략의 장점은 트렌드 방향을 결정하기 위해 HMA를 사용하며, 트렌드 시작을 확인하기 위해 CCI를 사용함으로써 화프사와 풀백 오류를 효과적으로 줄이는 것입니다. 그러나 HMA와 CCI 모두 낙후된 문제가 있으며 최적의 입구 지점을 놓치고 있습니다. 또한 CCI는 복잡한 시장 상황에서 제한된 능력을 가지고 있습니다.

요약하자면, HMA와 CCI 콤보 트렌드 다음 전략은 강한 트렌드 단계에서 괜찮은 결과를 가져올 수 있습니다. 그러나 라이브 거래에서 LIQR 이벤트에서 손실을 줄이기 위해 여전히 스톱 로스에 관심이 필요합니다. 적절한 매개 변수 최적화로만 이 전략이 장기적으로 성공적으로 적용 될 수 있습니다.


/*backtest
start: 2023-08-11 00:00:00
end: 2023-09-10 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("HMA+CCI strategy", overlay=true)

src = input(close)
hmaLen = input(21)
cciLen = input(10)
cciLower = input(-50)
cciUpper = input(50)
cciLowerExit = input(-100)
cciUpperExit = input(100)
hmaExit = input(false)
cciExit = input(true)
//rciLower = input(-60)
//rciUpper = input(60)

// Backtest
fromyear = input(2017, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(21, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

leverage = input(100)

term = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

//itvs = input(9, "short interval")
//itvm = input(36, "middle interval")
//itvl = input(52, "long interval")
//src = input(close, "source")
//upperband=input(title="High line[%]",defval=80,type=integer)
//lowerband=input(title="Low line[%]",defval=-80,type=integer)

ord(seq, idx, itv) =>
    p = seq[idx]
    o = 1
    for i = 0 to itv - 1
        if p < seq[i]
            o := o + 1
    o

d(itv) =>
    sum = 0.0
    for i = 0 to itv - 1
        sum := sum + pow((i + 1) - ord(src, i, itv), 2)
    sum

rci(itv) => (1.0 - 6.0 * d(itv) / (itv * (itv * itv - 1.0))) * 100.0

hullma = wma(2*wma(src, hmaLen/2)-wma(src, hmaLen), round(sqrt(hmaLen)))
cci = cci(close, cciLen)
plot(hullma, color=hullma[1]>hullma?red:green, linewidth=4)
longCondition = hullma[1] < hullma and crossover(cci, cciLower) //rci < -60 // crossover(cci, cciLower)
shortCondition = hullma[1] > hullma and crossunder(cci, cciUpper) //rci > 60
exitLong1 = hmaExit ? hullma[1] > hullma : false
exitLong2 = cciExit ? cci > cciUpperExit : false
exitShort1 = hmaExit ? hullma[1] < hullma : false
exitShort2 = cciExit ? cci < cciLowerExit : false

if (longCondition and term)
    strategy.entry("Long",  strategy.long )
if (shortCondition and term)
    strategy.entry("Short",  strategy.short)
        
if strategy.position_size > 0 and term
    if (exitLong1 or exitLong2)
        strategy.close_all()
if strategy.position_size < 0 and term
    if (exitShort1 or exitShort2)
        strategy.close_all()

더 많은