이중 EMA 크로스오버 트렌드 추적 전략

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

img

전반적인 설명

듀얼 EMA 크로스오버 트렌드 추적 전략 (Dual EMA Crossover Trend Tracking strategy) 은 가격 트렌드 방향을 결정하기 위해 듀얼 EMA 지표를 사용하는 양적 거래 전략이다. 이 전략은 서로 다른 매개 변수와 함께 두 개의 EMA 지표를 계산하고 가격 트렌드를 판단하기 위해 골든 크로스와 데드 크로스 신호를 결합한다. 짧은 기간 EMA가 더 긴 기간 EMA를 넘을 때 구매 신호를 생성하고, 짧은 기간 EMA가 더 긴 기간 EMA를 넘을 때 판매 신호를 생성한다.

전략 논리

이 전략의 핵심 지표는 더 긴 주기 EMA1와 더 짧은 주기 EMA2를 포함한 두 개의 EMA 세트입니다. EMA1 매개 변수는 21이고 EMA2 매개 변수는 10입니다. 전략은 4 시간 주기를 기반으로 두 개의 EMA를 계산합니다.

더 짧은 주기의 EMA2가 더 긴 주기의 EMA1를 넘을 때 구매 신호가 생성됩니다. 이것은 가격의 단기 트렌드가 강화되고 상승 추세가 시작되었음을 나타냅니다. 더 짧은 주기의 EMA2가 더 긴 주기의 EMA1을 넘을 때 판매 신호가 생성됩니다. 이것은 가격의 단기 상승 추세가 중단되고 하락 추세가 시작되었음을 나타냅니다.

잘못된 신호를 필터하기 위해 전략은 두 개의 골든 크로스 및 데드 크로스 지표 세트를 설정합니다. 두 개의 지표 세트가 동일한 신호를 발산 할 때 신호가 활성화됩니다. 이는 가격 변동으로 인한 오류를 효과적으로 줄일 수 있습니다.

이점 분석

  • 이중 EMA 구조는 동향을 결정하기 위해 단기 및 중기 트렌드의 변화를 효과적으로 포착할 수 있습니다.

  • 두 개의 골든 크로스 및 데드 크로스 지표 세트의 추가 필터링은 잘못된 신호를 줄이고 가격 변동으로 인한 불필요한 거래를 피할 수 있습니다.

  • 지표를 계산하기 위해 4시간 레벨을 사용하면 높은 빈도의 가격 변동에 대처할 수 있습니다.

  • 전략 구조는 간단하고 명확하고 이해하기 쉽고 구현하기 쉽고 양적 거래 애플리케이션에 적합합니다.

위험 분석

  • 이중 EMA 구조는 통합 시장을 판단하는 데 덜 효과적입니다. 긴 통합 기간은 잘못된 신호를 생성 할 수 있습니다.

  • 4시간 수준 지표는 갑작스러운 사건에 반응하기에 충분히 민감하지 않습니다. 주요 갑작스러운 뉴스는 4시간 이내에 큰 움직임을 일으킬 수 있습니다.

  • 이 전략은 근본 분석을 결합하지 않고 기술 지표에만 의존합니다. 회사의 기본 요소에 큰 변화가 발생하면 기술 지표가 실패 할 수 있습니다.

이러한 위험은 다음과 같이 제어 할 수 있습니다.

  1. 더 많은 시간주기 EMA 지표를 추가하여 모델 조합을 설정합니다.

  2. 문자 감정 분석을 사용하여 주요 갑작스러운 사건을 결정하고 역동적으로 위치를 조정합니다.

  3. 동적으로 매개 변수를 조정하기 위해 경제 환경, 정책 및 회사의 기본 변화와 연관.

최적화

전략은 더 이상 최적화 될 수 있습니다.

  1. 모델 조합을 추가합니다. 전략 안정성을 향상시키기 위해 다른 매개 변수와 더 많은 지표 조합을 설정 할 수 있습니다.

  2. 스톱 손실 메커니즘을 추가합니다. 합리적인 스톱 손실 포인트는 단일 손실을 효과적으로 제어 할 수 있습니다.

  3. 동적 매개 변수 최적화. EMA 매개 변수는 다른 시장 환경에 따라 자동으로 최적화 될 수 있습니다.

  4. 머신러닝 기술을 적용합니다. 텐서플로우와 같은 모델은 실시간으로 가격 트렌드를 분류하도록 훈련 할 수 있습니다.

결론

이중 EMA 황금 십자 죽은 십자 트렌드 추적 전략은 간단하고 실용적인 트렌드 트레이딩 전략이다. 방향 시장 기회를 잡기 위해 단기 및 중기 가격 트렌드를 결정하기 위해 이중 EMA 지표를 사용합니다. 동시에 두 세트 황금 십자 및 죽은 십자 필터링 지표를 결합하면 잘못된 거래를 줄일 수 있습니다. 전략은 간단한 구조와 구현이 쉽고 양적 거래 응용 프로그램에 적합합니다. 지속적인 최적화 및 개선으로 전략의 장점을 더욱 확장하고 안정적인 수익성을 향상시킬 가능성이 있습니다.


/*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=3


/// Component Code Startt
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

strategy(title="Ema cross strat", overlay=true)
margin = input(true, title="Margin?")
Margin = margin  ? margin : false
resCustom = input(title="EMA Timeframe", defval="240" )
source = close,
len2 = input(21, minval=1, title="EMA1")
len3 = input(10, minval=1, title="EMA2")
ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off)
ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off)


mylong = crossover(ema3, ema2)
myshort = crossunder(ema3,ema2)

last_long = na
last_short = na
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(ema3, ema2)
myshort2 = crossunder(ema3, ema2)

last_long2 = na
last_short2 = na
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0

condlongx =   in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx =  in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossover(condshortx, 1.9)




if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0    
    strategy.close("Long",when = not Margin)
    
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when = Margin)

더 많은