이중 이동 평균 추세 추종 전략


생성 날짜: 2023-12-21 11:45:35 마지막으로 수정됨: 2023-12-21 11:45:35
복사: 0 클릭수: 339
1
집중하다
1166
수행원

이중 이동 평균 추세 추종 전략

개요

이중 이동 평균 트렌드 추적 전략은 주식 가격 트렌드를 추적하는 정량 거래 전략이다. 이 전략은 쌍 지수 이동 평균 시스템을 사용하여 가격 트렌드 방향을 판단하고, ADX 지표의 트렌드 판단 강도를 결합하여 중·장선에서 가격 트렌드를 포착한다.

전략 원칙

이 전략은 주로 쌍 지수 이동 평균 시스템을 기반으로 가격 트렌드 방향을 판단한다. 이 전략은 빠르고 천천히 두 개의 다른 파라미터를 사용하는 EMA를 사용한다. 빠른 라인 EMA1은 가격 변화에 더 빠르게 반응하고, 느린 라인 EMA2는 가격 변화에 더 뒤쳐진다. 빠른 라인 상에서 느린 라인을 통과하면 구매 신호를 표시하며, 가격이 상승하기 시작한다는 것을 나타냅니다. 빠른 라인 아래에서 느린 라인을 통과하면 판매 신호를 표시하며, 가격이 떨어지기 시작한다는 것을 나타냅니다.

또한, 전략은 ADX 지표 판단 트렌드 강도를 도입했다. ADX는 가격 변동을 계산하여 트렌드의 강도를 판단했다. ADX 값이 상승하면 트렌드가 강화되고 있음을 나타냅니다. ADX 값이 떨어지면 트렌드가 약화되고 있음을 나타냅니다. 전략은 ADX 지표를 통해 거래 필터 조건을 설정하여 트렌드 강도가 강할 때만 거래 신호를 발송한다.

특히, 전략의 거래 신호 생성 규칙은 다음과 같습니다.

  1. 빠른 선에서 느린 선을 통과할 때 더 많은 일을 하고, 빠른 선 아래의 느린 선을 통과할 때 공백을 한다.
  2. ADX>25일때만 추가 공백이 허용됩니다.

이 방법은 거래 시스템의 안정성을 더욱 높이기 위해 약한 경향의 무효 신호를 효과적으로 필터링 할 수 있습니다.

전략적 이점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 중·장기선 가격 동향을 포착하기: 이중 EMA 평균 시스템은 가격의 중장선 경향을 효과적으로 판단하고, 단기 시장 소음으로 방해받지 않는다.

  2. 필터 가짜 해체: ADX 지표로 트렌드 강도를 판단하여 트렌드 전환점 근처에 나타나는 가짜 파열을 피하여 불필요한 손실을 초래합니다.

  3. 변수 최적화 공간이 넓다: 빠른 느린 라인 파라미터 조합, ADX 파라미터 등은 최적화 할 여지가 있으며, 조합 파라미터를 통해 더 나은 거래 효과를 얻을 수 있습니다.

  4. 매우 적응력이 좋다이 전략은 대부분의 주식과 시간 주기에서 적용되며, 여러 시장에서 검증되었습니다.

  5. 쉽게 실행할 수 있습니다이 전략은 단순한 평균값을 필요로 하고, 자원을 적게 사용하며, 프로그래밍이 쉽고, 실제 사용비용이 낮습니다.

전략적 위험

이 전략에는 다음과 같은 몇 가지 측면에 초점을 맞춘 위험도 있습니다.

  1. 추세 반전 위험트렌드 전략은 트렌드 반전을 완벽하게 예측할 수 없으며, 실제 트렌드 반전이 일어날 때 큰 손실을 입을 수 있습니다.

  2. 과잉 위험을 최적화합니다.: 변수를 극도로 최적화하면 전략이 역사적 데이터에 과도하게 적합하게 될 수 있으며, 이는 전략의 안정성과 실전에서의 효과를 떨어뜨릴 수 있다.

  3. 비상사태 위험주요 돌발적 사건은 기존의 가격 추세 패턴을 깨고 이동 평균 지표가 작동하지 않고 인적 개입 또는 손실을 제어하기 위해 스톱을 설정해야 합니다.

위와 같은 위험 요소에 대해, 우리는 다음과 같은 몇 가지 측면에서 최적화할 수 있습니다.

  1. 가격 전환점을 판단하는 부가적인 지표를 도입한다. 예를 들어 거래량을 도입하면 가격 전환과 동시에 거래량이 커진다.

  2. 적절한 ADX 파라미터를 허용하여 트렌드 초기에 기회를 잡을 수 있도록하십시오. 또한 MACD와 같은 보조 판단 지표를 도입 할 수 있습니다.

  3. 매개 변수 집합에 대해 다중 그룹 훈련 테스트를 실시하고, 안정성과 실전 효과 모두 좋은 매개 변수를 선택하십시오. 단일 매개 변수 집합에 대한 과도한 최적화 위험을 피하십시오.

전략 최적화 방향

이 전략에는 몇 가지 개선방안이 있습니다.

  1. 손절매 메커니즘 소개: 이동 중지 또는 비율 중지 설정, 트렌드 반전 시 적극적으로 중지하여 포지션 손실을 과도하게 방지 할 수 있습니다.

  2. 거래량 지표와 함께예를 들어, 거래량이 증가하면 가격 전환점에서 잘못된 신호가 발생하지 않도록 할 수 있습니다.

  3. 변수 적응 최적화: 지표의 매개 변수가 고정된 정적인 매개 변수 대신 실시간 시장 변화에 따라 자율적으로 조정될 수 있게 해줌으로써 전략의 안정성을 크게 향상시킬 수 있다.

  4. 기계 학습을 도입합니다.: 기계 학습 알고리즘을 사용하여 많은 역사적 데이터를 분석하여 이동 평균과 ADX의 매개 변수를 결정하고 가격의 미래 움직임을 예측할 수 있습니다. 이것은 이동 평균 전략의 진화 방향 중 하나입니다.

  5. 크로스 사이클 최적화: 각 거래주기의 파라미터 설정은 다를 수 있으며, 각 주기에서 파라미터의 최적의 구성을 테스트할 수 있다.

요약하다

듀얼 모바일 어드 트렌드 추적 전략은 전체적으로 성숙한 안정적인 전략이다. 이 전략은 듀얼 EMA 평균 시스템으로 가격 중장선 트렌드를 포착하고 ADX 지표가 신호를 필터링하여 주식 가격 트렌드를 효과적으로 파악하여 단기 시장 소음으로 방해받지 않도록 한다. 동시에, 이 전략에는 약간의 위험이 있으며, 파라미터 조합과 손해 중지 방법을 최적화해야 하며, 전략의 안정성을 향상시키기 위해 더 많은 보조 지표와 기계 학습 알고리즘을 도입할 수도 있다.

전략 소스 코드
/*backtest
start: 2022-12-14 00:00:00
end: 2023-11-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kitaec Strategy4", shorttitle = "Kitaec str4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(14, defval=14, minval=1, maxval=1000, title="Smoothing")
len2 = input(14, defval=14, minval=1, maxval=1000, title="Smoothing2")
len3=input(550)
src = close
ema1=ema(src, len)
ema2=ema(ema1, len2)
d=ema1-ema2
zlema=ema1+d

ema21=ema(src, (len/3)*2)
ema22=ema(ema21, (len2/3)*2)
d2=ema21-ema22
zlema2=ema21+d2

ema31=ema(src, len3)
ema32=ema(ema21, len3)
d3=ema31-ema32
zlema3=ema31+d2

fromyear = input(1900, defval = 1900, 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(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//MAs
//ma1 = security(tickerid, "60", vwma(src, len)[1])
//ma2 = security(tickerid, "120", vwma(src, len)[1])
//plot(ma1, linewidth = 2, color = blue, title = "MA")
//plot(ma2, linewidth = 2, color = red, title = "MA2")

// ADX
lenadx = 14
lensig = 14
limadx = 18

up = change(high)
down = -change(low)
trur = rma(tr, lenadx)
plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, lenadx) / trur)
minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, lenadx) / trur)
sum = plus + minus 
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
adx2 = ema(adx, 14)
adx2i = ema(adx2,14)
dadx2 = adx2 - adx2i
zladx2 = adx2 + dadx2
plus2 = ema(plus, 14)
plus2i = ema (plus2, 14)
dplus2 = plus2 - plus2i
zlplus2 = plus2 + dplus2

minus2 = ema(minus, 14)
minus2i = ema (minus2, 14)
dminus2 = minus2 - minus2i
zlminus2 = minus2 + dminus2

vwma = vwma(close, 150)
vwma2 = ema(vwma, 9)
vwma2i = ema(vwma2, 9)
dvwma2 = vwma2 - vwma2i
zlvwma2 = vwma2 + dvwma2


rmax=rma(src, len)
rmax2=rma(rmax, len2)
rmd=rmax-rmax2
zlrmax=rmax+rmd
rmaxz=rma(src, (len/3)*2)
rmaxz2=rma(rmaxz, (len2/3)*2)
rmzd=rmaxz-rmaxz2
zlrmaxz=rmaxz+rmzd
rmaxcol2=zlrmaxz[1] > zlema2[1] ? red:lime
rmaxcol= zlrmax[1] > zlema[1] ? red:lime


rmazlema3=rma(zlema3, 100)
plot(rmazlema3, color=gray, linewidth=2)
plot(zlema, color=green)
plot(zlema2, color=yellow)
plot(zlema3, color=teal, linewidth=2)
plot(ema2, color=na)
plot(rmax, color=rmaxcol2, linewidth=3)
plot(zlrmax, color=rmaxcol, linewidth=3)


//Trading
size = strategy.position_size
lot = 0.0 
lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1]

if zlrmax[1] < zlema[1]
    strategy.entry("Buy", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if zlrmax[1] > zlema[1]
    strategy.entry("Sell", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))