동적 자기 적응 카우프만 이동 평균 트렌드 추적 전략

저자:차오장, 날짜: 2024-02-26 16:36:30
태그:

img

전반적인 설명

이 전략은 카우프만 적응 이동 평균 (KAMA) 을 기반으로 설계되어 거래 위치를 동적으로 조정하고 자동으로 시장 추세를 추적합니다. 전략의 주요 기능은 다음과 같습니다.

  1. 동적으로 거래 단계 크기를 계산하고 시장 변동에 적응합니다.
  2. KAMA의 방향에 따라 구매 및 판매 신호를 생성
  3. 신호가 발사 된 후 중지 손실 거리를 설정하고 가격 이동에 따라 그에 따라 조정
  4. 가짜 신호를 필터링하기 위해 바 근처의 선택적 확인

이러한 기능의 적용을 통해 전략은 위험을 통제하면서 추세로부터 추가 수익을 얻으려고합니다.

전략 논리

이 전략은 카우프만 적응 이동 평균 지표에 기반하여 작동합니다. KAMA는 이동 평균의 무게와 부드러움을 동적으로 조정하기 위해 가격 동력과 변동성의 비율을 계산하여 가격 변화에 더 빠르게 반응 할 수 있습니다.

KAMA가 하향 스톱 로스 라인을 넘을 때, 트렌드 반전을 나타내고 구매 신호를 유발합니다. KAMA가 하향 스톱 로스 라인을 넘을 때, 트렌드 반전을 제안하고 판매 신호를 유발합니다. 포지션을 입력한 후 전략은 ATR에 기반한 동적 스톱 로스 거리를 계산하고 유리한 스톱 로스 라인을 설정합니다. KAMA가 유리한 방향으로 움직일 때, 스톱 로스 라인도 그에 따라 조정되어 더 많은 이익을 잠금하기 위해 더 유리한 위치로 이동합니다.

이 방법으로 전략은 트렌드를 추적하고, 지점을 닫기 위해 역 신호가 발사되거나 발동될 때까지 점진 손실을 줄일 수 있습니다.

장점

전통적인 이동 평균 전략에 비해 이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. KAMA는 높은 감수성을 가지고 있으며 가격 동향을 더 빨리 파악할 수 있습니다.
  2. 동적 스톱 로스 거리는 트렌드에 적응하면서 더 많은 수익을 확보합니다.
  3. 선택적인 막대기 닫기 확인이 가짜 신호를 필터링하고 불필요한 항목을 줄입니다.

일반적으로 전략은 반응적이고 제어 가능하며 전형적인 트렌드 추적 시스템입니다.

위험성

이 전략은 또한 몇 가지 위험을 안고 있습니다.

  1. 트렌드 역전 위험: KAMA는 가격 변동에 유연하게 적응할 수 있지만 급격한 트렌드 역전에는 적절한 시기에 대응하지 않을 수 있습니다.
  2. 너무 공격적인 스톱 손실. 동적 스톱 손실 거리가 너무 넓게 설정되면 너무 공격적이 될 수 있으며 적시에 이익을 잠금하지 못합니다.
  3. 가짜 신호 위험. 바 근접 확인을 사용하면 가짜 신호를 줄이는 데 도움이되지만 완전히 제거 할 수 없습니다.

이러한 위험을 관리하기 위해 스톱 로스 거리를 최적화하고 최대 스톱 로스 비율을 설정하는 방법과 같은 방법을 사용할 수 있습니다. 확인을 위해 다른 지표를 결합하는 것도 잘못된 거래를 피합니다.

최적화 방향

전략 최적화를 위한 가능한 방향은 다음과 같습니다.

  1. KAMA 매개 변수 최적화: 이동 평균 길이를 조정, 부드러운 정조;
  2. 동적 스톱 손실을 최적화: 다양한 제품에 따라 최적 스톱 손실 거리와 단계 크기를 테스트합니다.
  3. 필터링 지표 추가: 다른 트렌드 지표를 통합하여 거래 신호를 확인하고 신뢰성을 향상시킵니다.

예를 들어, MACD는 보조 확인 지표로 추가될 수 있으며, MACD Dif가 KAMA의 황금 십자가와 함께 긍정적으로 확대되는 것을 요구합니다. 이것은 일부 가짜 신호를 필터링하여 불필요한 반복 항목을 피할 수 있습니다.

결론

이 전략의 전반적인 운영은 원활하다. 동적 스톱 로스를 사용하여 트렌드를 추적하고 트렌드 수익을 극대화하며, KAMA 지표의 적응력이 급격한 시장 변화에 신속하게 대응함으로써, 이 전략은 중장기 거래에 적합한 효율적인 트렌드 추적 시스템이 될 수 있다.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)

// Function to calculate pips with higher precision
getPips(price) =>
    difc = syminfo.mintick
    hlpips = price / difc
    math.round(hlpips / syminfo.mintick) * syminfo.mintick

// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )

tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)

// Function to calculate the TMA
gettma() =>
    mom = math.abs(ta.change(src, length))
    volatility = math.sum(math.abs(ta.change(src)), length)
    er = volatility != 0 ? mom / volatility : 0
    fastAlpha = 2 / (fastLength + 1)
    slowAlpha = 2 / (slowLength + 1)
    alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
    kama = 0.0
    kama := alpha * src + (1 - alpha) * nz(kama[1], src)
    await = awaitBarConfirmation ? barstate.isconfirmed : true
    maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
    thma = kama
    hma_dif = (thma - thma[2])/2
    colour = hma_dif > 0 ? color.green : color.red
    isGreen = hma_dif > 0
    [thma, isGreen, colour]

// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1

// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na

[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

plot(thma, title='KAMA', linewidth=2, color=colour)

if ta.crossover(thma, psl) and strategy.position_size < 0
    strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)

if ta.crossunder(thma, psl) and strategy.position_size > 0
    strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)

if isGreen and strategy.position_size <= 0
    if na(psl)
        psl := close + getPips(pips)
    strategy.entry("Buy", strategy.long, alert_message=buyMess)
    lastSignal := 1

if not isGreen and strategy.position_size >= 0
    if na(psl)
        psl := close - getPips(pips)
    strategy.entry("Sell", strategy.short, alert_message=sellMess)
    lastSignal := -1

if (thma >= lastPsl or na(lastPsl)) and thma > psl
    psl := psl + getPips(pips)
    lastPsl := psl

if (thma <= lastPsl or na(lastPsl)) and thma < psl
    psl := psl - getPips(pips)
    lastPsl := psl

plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)


더 많은