MOST 및 KAMA를 기반으로 트렌드 라이딩 전략

저자:차오장, 날짜: 2024-02-29
태그:

img

이 전략은 가격 트렌드 방향을 파악하기 위해 SMA와 EMA와 같은 여러 이동 평균을 결합하고, 가격 돌파구에 따라 트렌드 다음 전략을 설계하기 위해 스톱 로스 라인을 설정합니다. 가격이 상승하면 상단 범위를 스톱 로스로 추적하고, 가격이 떨어지면 하단 범위를 스톱 로스로 추적합니다. 전략의 장점은 여러 이동 평균의 조합이 가격 데이터를 매끄럽게하고 트렌드를 식별 할 수 있다는 것입니다. 동적 스톱 로스 디자인은 지나치게 민감한 스톱을 피합니다. 전략의 위험은 스톱 로스 라인의 설정이 시간 내에 손실을 중지 할 수 없을 정도로 느슨해질 수 있다는 것입니다.

전략 원칙

이 전략은 KAMA가 가격 변화에 더 민감하게 반응하고 사전에 전환을 식별할 수 있기 때문에 KAMA를 트렌드 방향을 판단하는 기초로 사용합니다. 동시에 전략은 가격을 필터링하고 주요 트렌드 방향을 식별하기 위해 SMA와 EMA와 같은 다른 여러 이동 평균의 조합을 포함합니다.

전략의 스톱-러스 라인 설정은 가격 자체와 이동 평균에 기반합니다. 구체적으로, 상승 트레일링 스톱-러스 라인은 이동 평균과 버퍼의 비율입니다. 하향 트레일링 스톱-러스 라인은 버퍼의 비율을 빼고 이동 평균입니다. 이것은 가격이 역전될 때 즉각적인 스톱-러스를 허용합니다.

진입 조건은 가격이 하위에서 상향 스톱 로스 라인을 통과할 때 길고, 가격이 상위에서 하위로 하향 스톱 로스 라인을 통과할 때 짧습니다.

이점 분석

이 전략의 가장 큰 장점은 여러 이동 평균을 결합함으로써 트렌드 판단의 정확성을 향상시키고 잘못된 신호를 줄일 수 있다는 것입니다. 동시에 전략의 스톱 로스 라인은 이동 평균에 따라 동적으로 변경되며 실시간으로 조정하고 갑작스러운 이벤트에 대응 할 수 있습니다.

또한, 단일 지표 전략에 비해, 이 전략은 트렌드 추적과 돌파구 전략의 장점을 결합한다. 트렌딩 시장에서는 이익을 극대화 할 수 있으며, 윙사 시장에서는 스톱 로스 설정을 통해 손실을 줄일 수 있다.

위험 분석

이 전략의 주요 위험은 스톱 로스 라인 설정이 시간적으로 손실을 멈추기 위해 너무 느슨할 수 있다는 것입니다. 이는 스톱 로스 라인의 리트레이션 비율이 고정되어 있기 때문에 시장에서 폭력적인 변화가 발생하면 스톱 로스 라인이 시간적으로 업데이트 될 수 없으므로 더 큰 손실이 발생할 수 있습니다.

또한, 이동 평균 자체는 높은 히스테레시 (hysteresis) 를 가지고 있으며 가격 변화에 즉각적으로 반응할 수 없습니다. 이것은 또한 시장이 빠르게 역전될 때 손실을 제때 중단하지 못하는 결과를 초래할 수 있습니다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 더 나은 매개 변수 조합을 찾기 위해 스톱 손실 라인 비율에 대한 다른 매개 변수 설정을 테스트합니다.

  2. 시장 변동 정도에 따라 스톱 로스 라인이 동적으로 변하도록 시도합니다.

  3. 판단할 수 있는 다른 지표를 늘리고, 전략의 적응성을 높이기 위해 스톱 로스 기본에 더 많은 변수를 도입합니다.

  4. 순환 평균의 주기 매개 변수를 최적화하여 가장 좋은 주기 설정을 찾아 평탄한 가격을 설정합니다.

요약

전체적으로, 이 전략은 트렌드 방향을 결정하기 위해 여러 이동 평균을 결합하고, 트렌드를 따르는 것을 목표로 하는 동적 트레일링 스톱 로스 메커니즘을 설계함으로써 상당히 견고합니다. 이점은 잘못된 신호를 줄이고 스톱 로스를 통해 위험을 제어 할 수 있다는 것입니다. 단점은 스톱 로스 라인이 너무 넓게 설정되어 신속하게 손실을 멈출 수 없다는 것입니다. 전략을 최적화하는 다음 단계는 스톱 로스 라인의 설계에 초점을 맞추어 시장 변화에 따라 동적으로 조정 할 수 있도록하는 것입니다.


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Atlantean Trend Signal BUY SELL Strategy', overlay=true)

ma_length = input.int(title='Moving Average Length', minval=1, defval=3)
percent = input.float(3.3, 'STOP LOSS Percent', step=0.1, minval=0)
src = input(title='Source', defval=close)
mav = input.string(title="Moving Average Type", defval="KAMA", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL", "KAMA"])
T3a1 = 0.7
_type = false //input(false, title='Activate Moving Average Screening Mode')
_type1 = false //input(false, title='Activate Moving Average Color Change Screening Mode')
activateScreener = input.bool(false, title="Activate Screener?")
showsignallabels = input(title='Show Signal Labels?', defval=true)

Var_Func(src, ma_length) =>
    valpha = 2 / (ma_length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

VAR = Var_Func(src, ma_length)
DEMA = 2 * ta.ema(src, ma_length) - ta.ema(ta.ema(src, ma_length), ma_length)

Wwma_Func(src, ma_length) =>
    wwalpha = 1 / ma_length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

WWMA = Wwma_Func(src, ma_length)

// KAMA Calculation
Kama_Func(src, ma_length) =>
    xvnoise = math.abs(src - src[1])
    nfastend = 0.666
    nslowend = 0.0645
    nsignal = math.abs(src - src[ma_length])
    nnoise = math.sum(xvnoise, ma_length)
    nefratio = nnoise != 0 ? nsignal / nnoise : 0
    nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2)
    nAMA = 0.0
    nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))
    nAMA

Zlema_Func(src, ma_length) =>
    zxLag = ma_length / 2 == math.round(ma_length / 2) ? ma_length / 2 : (ma_length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, ma_length)
    ZLEMA

ZLEMA = Zlema_Func(src, ma_length)

Tsf_Func(src, ma_length) =>
    lrc = ta.linreg(src, ma_length, 0)
    lrc1 = ta.linreg(src, ma_length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, ma_length, 0) + lrs
    TSF

TSF = Tsf_Func(src, ma_length)

HMA = ta.wma(2 * ta.wma(src, ma_length / 2) - ta.wma(src, ma_length), math.round(math.sqrt(ma_length)))

T3e1 = ta.ema(src, ma_length)
T3e2 = ta.ema(T3e1, ma_length)
T3e3 = ta.ema(T3e2, ma_length)
T3e4 = ta.ema(T3e3, ma_length)
T3e5 = ta.ema(T3e4, ma_length)
T3e6 = ta.ema(T3e5, ma_length)
T3c1 = -T3a1 * T3a1 * T3a1
T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1
T3c3 = -6 * T3a1 * T3a1 - 3 * T3a1 - 3 * T3a1 * T3a1 * T3a1
T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1
T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3

getMA(src, ma_length) =>
    ma = 0.0
    ma := switch mav
        'SMA' => ta.sma(src, ma_length)
        'EMA' => ta.ema(src, ma_length)
        'WMA' => ta.wma(src, ma_length)
        'DEMA' => DEMA
        'TMA' => ta.sma(ta.sma(src, math.ceil(ma_length / 2)), math.floor(ma_length / 2) + 1)
        'VAR' => VAR
        'WWMA' => WWMA
        'ZLEMA' => ZLEMA
        'TSF' => TSF
        'HULL' => HMA
        'TILL' => T3
        'KAMA' => Kama_Func(src, ma_length)
    ma
ALL = getMA(src, ma_length)
exMov = ALL
fark = exMov * percent * 0.01
longStop = exMov - fark
longStopPrev = nz(longStop[1], longStop)
longStop := exMov > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = exMov + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := exMov < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and exMov > shortStopPrev ? 1 : dir == 1 and exMov < longStopPrev ? -1 : dir
MOST = dir == 1 ? longStop : shortStop
cro = _type and _type1 ? ta.crossover(exMov, exMov[1]) : _type ? ta.crossover(close, exMov) : ta.crossover(exMov, MOST)
cru = _type and _type1 ? ta.crossunder(exMov, exMov[1]) : _type ? ta.crossunder(close, exMov) : ta.crossunder(exMov, MOST)
direction = 0
direction := cro ? 1 : cru ? -1 : direction[1]
col1 = exMov > exMov[1]
col3 = exMov < exMov[1]
colorM = col1 and _type and _type1 ? color.rgb(14, 241, 52) : col3 and _type and _type1 ? color.red : color.new(#00bcd4, 0)
if (cro)
    strategy.entry('LONG', strategy.long)
if (cru)
    strategy.close('LONG')

plot(_type ? na : MOST, color=color.new(color.maroon, 0), linewidth=3, title='MOST')
plot(exMov, color=colorM, linewidth=2, title='exMov')
plotshape(cro and showsignallabels, title='BUY', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(#00bcd4, 0), textcolor=color.new(color.white, 0))
plotshape(cru and showsignallabels, title='SELL', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(#e91e63, 0), textcolor=color.new(color.white, 0))


더 많은