
이 전략은 SMA, EMA, KAMA와 같은 여러 가지 이동 평균을 조합하여 가격 트렌드 방향을 식별하고 가격 돌파구에 기반한 스톱 라인을 설정하여 트렌드를 추적하는 전략을 설계합니다. 가격이 상승하면 trails the upper band을 스톱으로; 가격이 하락하면 trails the 하위 한계를 스톱으로 합니다. 전략의 장점은 가격 데이터를 평형화 할 수있는 여러 가지 이동 평균의 조합이며 트렌드를 식별합니다.
이 전략은 KAMA를 트렌드 방향을 판단하는 기본 지표로 사용합니다. KAMA는 가격 변화에 더 민감하게 반응하여 전환을 일찍 식별 할 수 있습니다. 또한, 전략에는 SMA, EMA 및 기타 여러 종류의 이동 평균의 조합이 포함되어 있으며, 주요 트렌드 방향을 식별하기 위해 가격에 파장을 가할 수 있습니다.
전략의 스톱 라인은 가격 자체와 이동 평균에 기초하여 설정된다. 구체적으로, 상향으로 추적하는 스톱 라인은 이동 평균에 대한 비율을 추가하여 보퍼링으로; 하향으로 추적하는 스톱 라인은 이동 평균에 대한 비율을 빼어 보퍼링으로. 이렇게하면 가격 반전이 발생했을 때 즉시 스톱을 구현할 수 있다.
진입 조건은, 가격이 하향으로 상향 상위 스톱 라인을 돌파할 때 더 많이 하고, 가격이 상향으로 하향으로 하향 상위 스톱 라인을 돌파할 때 공백을 하는 것이다.
이 전략의 가장 큰 장점은 여러 가지 이동 평균의 조합을 통해 트렌드 판단에 대한 정확도를 높이고 가짜 신호를 줄일 수 있다는 것입니다. 한편, 전략의 중지 손실선은 이동 평균의 동적 변화에 기반하여 실시간 가격에 따라 조정하여 갑작스러운 사건에 대한 대응을 할 수 있습니다.
또한, 단일 지표 전략에 비해, 이 전략은 트렌드 추적과 브레이크 전략의 장점을 결합한다. 트렌드 상황에서, 최대 이익을 얻을 수 있다. 반면, 충격적인 상황에서, 손실을 중지하여 손실을 줄일 수 있다.
이 전략의 주요 위험은 스톱 라인 설정이 너무 느슨하여 적시에 중단되지 않을 수 있다는 것입니다. 이것은 스톱 라인의 회수 비율이 고정되어 있기 때문에 시장 상황이 급격히 변하면 스톱 라인을 적시에 업데이트하지 않으면 큰 손실이 발생할 수 있습니다.
또한, 이동 평균은 자체적으로 지연성이 강하여 가격 변화에 즉각적으로 반응할 수 없습니다. 이것은 또한 시장이 급격히 변할 때 적시에 멈추지 못하게 할 수 있습니다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
다른 파라미터 설정 아래의 스톱 라인 비율을 테스트하여 더 좋은 파라미터 조합을 찾습니다.
시장의 변동에 따라 조정하기 위해 스톱 라인을 동적으로 설정하는 시도;
다른 지표 판단을 추가하고, 더 많은 변수를 Stop Loss Basis에 도입하여 전략의 적응성을 향상시킵니다.
이동 평균의 주기 변수를 최적화하여 최적의 평평한 가격의 주기 설정을 찾습니다.
이 전략은 전체적으로 상당히 튼튼하며, 여러 가지 이동 평균 조합을 통해 트렌드 방향을 판단하고, 동적 추적 스톱 메커니즘을 설계하여 트렌드 운영을 추적하는 것을 목표로 한다. 장점은 가짜 신호를 줄일 수 있고, 스톱을 통해 위험을 제어할 수 있다는 것이다. 단점은 스톱 라인이 너무 넓게 설정되어 신속하게 스톱을 할 수 없다는 것이다. 다음 최적화 전략은 스톱 라인을 설계하여 시장 변화에 따라 동적으로 조정할 수 있도록 해야 한다.
/*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))