
이 전략은 카우프만 적응 이동 평균 (KAMA) 지표를 사용하여 트렌드 추적 거래 시스템을 설계했다. 이 시스템은 트렌드가 형성될 때 빠르게 트렌드를 추적하고, 흔들리는 상황에서 소음을 필터링한다. 또한, 시스템은 또한 패러폴리 라인 전환 시스템 (PSAR) 과 평균 실제 진동률 추적 스톱 (ATR Trailing Stop) 을 스톱 메커니즘으로 통합하여 강력한 위험 제어 능력을 갖추고 있다.
KAMA 지표의 길이는 최근 한 시간 동안의 시장 변동률 동력에 따라 조정됩니다. 가격 변화가 최근의 소음보다 커지면 EMA 창이 짧아지고, 가격 변화가 최근의 소음보다 작으면 EMA 창이 길어집니다. 이것은 KAMA가 흐름을 빠르게 추적할 수 있도록 해 주며, 흔들리는 상황에서 소음을 필터링합니다.
시스템은 주로 가장 빠른 KAMA ((KAMA 1) 를 기준으로 트렌드 방향을 판단한다. KAMA 1은 상향을 할 때 더하고, 하향을 할 때 공백한다. 가짜 돌파구를 필터링하기 위해 KAMA 필터를 설정한다. KAMA 1의 변화는 최근의 변동이 표준 차이를 초과할 때만 거래 신호를 발생시킨다.
손실을 막기 위해, 시스템은 세 가지 선택 가능한 손실 방식을 제공합니다: KAMA 기반 반전, PSAR 반전, ATR 이동 중지. 투자자는 하나 또는 여러 가지 조합을 개별적으로 선택할 수 있습니다.
KAMA 지표의 독특한 디자인은 시스템이 신생 트렌드를 빠르게 포착하고, 불안정한 상황에서 거래를 중단하고, 거래 주파수를 효과적으로 제어하고, 불필요한 슬라이드 및 수수료 손실을 줄일 수 있도록합니다.
시스템 내에는 여러 가지 손해 방지 장치가 있습니다. 투자자는 개인 위험 선호도에 따라 적절한 손해 방지 계획을 선택할 수 있으며, 단독 손실을 강력하게 제어 할 수 있습니다.
이 시스템은 지표와 스톱라인에 전적으로 기반을 두고 있으며, 일반적인 이동 거래의 잘못된 입장을 방지한다.
다중 매개 변수 설정 및 조건 조합은 시스템 사용자 정의에 큰 공간을 제공합니다. 사용자는 지역에 따라 다양한 품종과 주기에 대해 최적화 할 수 있습니다.
이 시스템은 시스템적 위험을 고려하지 않고, 극단적인 상황에서는 손실을 효과적으로 통제할 수 없다.
시스템 PARAMETERS는 다른 품종에 따라 다른 주기적으로 조정해야 할 수도 있으며, 그렇지 않으면 너무 급진적이거나 너무 보수적인 결과가 발생할 수 있습니다.
만약 KAMA 지표만을 막으로 의존한다면, 충격 상황에서 쉽게 갇힐 수 있다. 이것은 PSAR 또는 ATR 이동식 막과 함께 조합하여 사용해야 해결될 수 있다.
트렌드 필터 지표, 예를 들어 ADX 또는 암시 변동률 지표를 추가하여 흔들림과 트렌드 전환 단계에서 잘못된 신호를 피하십시오.
단일 품종 및 고정 주기에 대해 PARAMETERS 최적화 및 회귀를 수행하여 안정성을 향상시킵니다. 최적화 차원은 KAMA 파라미터 조합, 정지 파라미터 등이 포함됩니다.
매개 변수 최적화 대신 MACHINE LEARNING 모델을 시도하십시오. 많은 역사 데이터를 사용하여 거래 시점과 정지를 판단하는 신경 네트워크 또는 의사 결정 트리 모델을 훈련하십시오.
디지털 화폐와 같은 다른 품종으로 전략을 이식하려고 노력하십시오. 이것은 PARAMETERS를 조정하거나 다른 보조 지표를 추가해야 할 수도 있습니다.
이 전략은 KAMA 트렌드 판단과 여러 가지 스톱 도구를 통합하여 트렌드 방향을 효과적으로 추적하고 위험을 제어할 수 있습니다. KAMA 지표의 독창성은 전략이 신생 트렌드 방향을 신속하게 판단하여 가짜 돌파구를 방지 할 수있게합니다. 사용자 정의 및 최적화 가능한 PARAMETERS는 사용자에게 개인 맞춤 조정을위한 큰 공간을 제공합니다.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BenHampson
// @version=4
// Credit to:
// - ChuckBanger for much of the KAMA code
// - cheatcountry for the KAMA Filter code
// - millerrh for much of the ATR Stop code
// - racer8 for much of the Position Sizing code
// I have combined aspects of their work and built upon it to form a strategy I like.
// The KAMA, with its filter, is used for entry.
// An ATR trailing stop loss, PSAR, and the KAMA can all optionally be used as exits, or you can use a combination of the three.
strategy(title="KAMA Strategy - Kaufman's Adaptive Moving Average", shorttitle="KAMA Strategy", overlay=true)
src = input(title="Source", type=input.source, defval=close)
// Exits
KAMA1SL = input(title = 'KAMA 1 Stop Loss', type = input.bool, defval = true)
ATRTSL = input(title = 'ATR Trailing Stop Loss', type = input.bool, defval = false)
PSARSL = input(title = 'PSAR Stop Loss', type = input.bool, defval = false)
// KAMA 1 (Fastest)
length1 = input(title="KAMA 1: Length", type=input.integer, defval=14)
fastLength1 = input(title="KAMA 1: Fast KAMA Length", type=input.integer, defval=2)
slowLength1 = input(title="KAMA 1: Slow KAMA Length", type=input.integer, defval=20)
length2 = input(title="KAMA 2: Length 2", type=input.integer, defval=15)
fastLength2 = input(title="KAMA 2: Fast KAMA Length", type=input.integer, defval=3)
slowLength2 = input(title="KAMA 2: Slow KAMA Length", type=input.integer, defval=22)
length3 = input(title="KAMA 3: Length 3", type=input.integer, defval=16)
fastLength3 = input(title="KAMA 3: Fast KAMA Length", type=input.integer, defval=4)
slowLength3 = input(title="KAMA 3: Slow KAMA Length", type=input.integer, defval=24)
length4 = input(title="KAMA 4: Length", type=input.integer, defval=17)
fastLength4 = input(title="KAMA 4: Fast KAMA Length", type=input.integer, defval=5)
slowLength4 = input(title="KAMA 4: Slow KAMA Length", type=input.integer, defval=26)
// KAMA 5 (Medium)
length5 = input(title="KAMA 5: Length", type=input.integer, defval=18)
fastLength5 = input(title="KAMA 5: Fast KAMA Length", type=input.integer, defval=6)
slowLength5 = input(title="KAMA 5: Slow KAMA Length", type=input.integer, defval=28)
length6 = input(title="KAMA 6: Length", type=input.integer, defval=19)
fastLength6 = input(title="KAMA 6: Fast KAMA Length", type=input.integer, defval=7)
slowLength6 = input(title="KAMA 6: Slow KAMA Length", type=input.integer, defval=30)
length7 = input(title="KAMA 7: Length", type=input.integer, defval=20)
fastLength7 = input(title="KAMA 7: Fast KAMA Length", type=input.integer, defval=8)
slowLength7 = input(title="KAMA 7: Slow KAMA Length", type=input.integer, defval=32)
// KAMA 8 (Slowest)
length8 = input(title="KAMA 8: Length", type=input.integer, defval=21)
fastLength8 = input(title="KAMA 8: Fast KAMA Length", type=input.integer, defval=9)
slowLength8 = input(title="KAMA 8: Slow KAMA Length", type=input.integer, defval=34)
// Kaufman's Adaptive Moving Average
getKAMA(src, length1, fastLength1, slowLength1) =>
mom = abs(change(src, length1))
volatility = sum(abs(change(src)), length1)
// Efficiency Ratio
er = volatility != 0 ? mom / volatility : 0
fastAlpha = 2 / (fastLength1 + 1)
slowAlpha = 2 / (slowLength1 + 1)
// KAMA Alpha
sc = pow((er * (fastAlpha - slowAlpha)) + slowAlpha, 2)
kama = 0.0
kama := sc * src + (1 - sc) * nz(kama[1])
kama
kama1 = getKAMA(src, length1, fastLength1, slowLength1)
kama2 = getKAMA(src, length2, fastLength2, slowLength2)
kama3 = getKAMA(src, length3, fastLength3, slowLength3)
kama4 = getKAMA(src, length4, fastLength4, slowLength4)
kama5 = getKAMA(src, length5, fastLength5, slowLength5)
kama6 = getKAMA(src, length6, fastLength6, slowLength6)
kama7 = getKAMA(src, length7, fastLength7, slowLength7)
kama8 = getKAMA(src, length8, fastLength8, slowLength8)
//If the kama1 has increased...
kama1delta = kama1[0] - kama1[1]
kama3delta = kama3[0] - kama3[1]
kama8delta = kama8[0] - kama8[1]
// KAMA Plots
plot(kama1, title="KAMA 1", color=#e91e63, display=display.all, linewidth=2)
plot(kama2, title="KAMA 2", color=color.red, display=display.all)
plot(kama3, title="KAMA 3", color=color.red, display=display.all)
plot(kama4, title="KAMA 4", color=color.orange, display=display.all)
plot(kama5, title="KAMA 5", color=color.orange, display=display.all)
plot(kama6, title="KAMA 6", color=color.yellow, display=display.all)
plot(kama7, title="KAMA 7", color=color.yellow, display=display.all)
plot(kama8, title="KAMA 8", color=color.white, display=display.all)
//========================================= KAMA FILTER ===========================================
// Copyright (c) 2019-present, Franklin Moormann (cheatcountry)
// Moving Average Adaptive Filter [CC] script may be freely distributed under the MIT license.
entryFilter = input(title="KAMA Entry Filter", type=input.float, defval=1, minval=0.01)
exitFilter = input(title="KAMA Exit Filter", type=input.float, defval=0.5, minval=0.01)
entryMAAF = entryFilter * stdev(kama1delta, length1)
exitMAAF = exitFilter * stdev(kama1delta, length1)
srcEma = ema(src, length1)
//========================================= TRAILING ATR STOP ====================================
// The following is an adaptation of Trailing ATR Stops by @millerrh
// He based it on scripts by @garethyeo & @SimpleCryptoLife
// Inputs
atrLookback = input(defval=14,title="Trailing ATR Lookback Period",type=input.integer)
multiplier = input(defval=3,title="Trailing ATR Multiplier",type=input.float, step=0.1, minval=0.5, maxval=4)
trailMode = input(title="Trail Mode", defval="Trailing", options=["Running", "Trailing"])
trigInput = input(title="Trigger Trailing Stop On", defval="Wick", options=["Close","Wick"])
// Calculate ATR
atrValue = atr(atrLookback)
atrMultiplied = atrValue * multiplier
// Plot the price minus the ATR
atrLow = low - atrMultiplied
// Calculate the low trailing ATRs every time. The trailing stop loss never goes down.
// Set them to something to start with
trailAtrLow = atrLow
// If the ATR Low has gone up AND it has gone above the trail, the low trailing ATR should also go up. If the ATR Low has gone up or down, but not below the trail, the ATR trail stays where it is
trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]
// Trigger stop based on candle close or low
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na
// Determine if price is below support
supportHit = trigSupport <= trailAtrLow
// If price is below support, reset the trailing ATR
trailAtrLow := supportHit ? atrLow : trailAtrLow
// Plot Lines
plotLow = ATRTSL ? trailAtrLow : na
plot(plotLow, title="ATR Low", color=color.white, transp=50, style=plot.style_linebr, linewidth=1, display=display.all)
//====================================== PSAR STOP ==========================================
start = input(0.02, "PSAR Start")
increment = input(0.02, "PSAR Increment")
maximum = input(0.2, "PSAR Max Value")
psar = sar(start, increment, maximum)
psarPlot = PSARSL ? psar : na
plot(psarPlot, "Parabolic SAR", style=plot.style_cross, color=#3A6CA8, display=display.all)
//========================================= ENTRY & EXITS =====================================================
// Entry
long = kama1delta > 0 and kama1delta > entryMAAF
strategy.entry("Buy", true, when = long)
// Close
longClose = (PSARSL ? crossunder(close, psar) : na) or (KAMA1SL ? kama1delta < 0 and abs(kama1delta) > exitMAAF : na) or (ATRTSL ? supportHit : na)
strategy.close("Buy", when = longClose, comment = "Sell")