이중 EMA 전략 분석

저자:차오장, 날짜: 2024-02-28 18:07:59
태그:

img

전반적인 설명

이중 EMA 전략은 다른 주기의 EMA를 계산하여 가격의 트렌드 방향을 파악하고 입출구를 결정하는 트렌드 다음 전략입니다. 이 간단하고 실용적인 전략은 트렌딩 시장에서 잘 작동합니다.

전략 논리

이 전략은 주로 두 개의 EMA 지표, 즉 단기 9일 EMA와 더 긴 21일 EMA를 기반으로 합니다. 이 지표의 크로스오버는 입시 및 출구 신호를 생성합니다.

짧은 EMA가 긴 EMA를 넘을 때, 그것은 상승 추세로 들어가는 가격으로 간주됩니다. 전략은 상승 추세를 따라 긴 거리를 갈 것입니다. 짧은 EMA가 긴 EMA를 넘을 때, 그것은 하락 추세로 들어가는 가격으로 간주됩니다. 전략은 하락 추세를 따라 짧은 거리를 갈 것입니다.

EMA 지표는 가격 데이터에서 노이즈를 효과적으로 필터링하고 트렌드의 주요 방향을 식별 할 수 있습니다. 따라서 전략은 더 긴 가격 추세를 포착하기 위해 입점과 출구의 기초로 이중 EMA를 사용합니다.

장점

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

  1. 전략 아이디어는 간단하고 이해하기 쉽고 실행하기 쉽습니다.
  2. 가격 동향을 효과적으로 파악하고 동향을 추적하기 위해 적시에 포지션을 입력할 수 있습니다.
  3. EMA를 사용하면 소음을 필터링하고 단기 가격 변동의 간섭을 피합니다.
  4. EMA 매개 변수는 전략의 감수성을 조정할 수 있습니다.

위험성

이 전략에는 몇 가지 위험도 있습니다.

  1. EMA의 지연 특성은 트렌드가 역전될 때 손실을 증가시킬 수 있습니다.
  2. 잘못된 EMA 매개 변수 설정은 잘못된 신호 비율을 증가시킵니다.
  3. 이 전략은 강한 트렌드 시장과 범위 기간에 취약한 시장에 더 적합합니다.

강화

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

  1. 트렌드 반전을 확인하고 손실을 줄이기 위해 다른 지표를 포함하십시오. 예를 들어 MACD, KDJ 등.
  2. 스톱 로스 로직을 추가합니다. 좋은 스톱 로스 전략은 최대 드라우다운을 크게 줄일 수 있습니다.
  3. EMA 매개 변수를 최적화하여 다른 제품의 가격 특성에 더 잘 맞게 만듭니다.
  4. EMA 매개 변수 최적화를 자동화하기 위해 기계 학습 알고리즘을 사용합니다.

요약

요약하자면, 이중 EMA 전략은 트렌드를 따르는 전략으로 매우 유용합니다. 운영, 이해 및 강력한 트렌딩 시장에서 우수한 성능을 발휘하기 쉽습니다. 전략은 또한 안정성을 향상시키기 위해 다양한 개선으로 완화 할 수있는 몇 가지 위험을 가지고 있습니다. 전반적으로, 이중 EMA는 양적 거래의 중요한 참조 템플릿으로 사용됩니다.


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

//@version=5
// This can only draw so many lines. Use bar replay to go back further
strategy("Strategy Lines", shorttitle="Strategy Lines", overlay=true, max_lines_count=500)

//###########################################################################################################################################
// Replace your strategy here
//###########################################################################################################################################

shortEMA = ta.ema(close, input(9, title="Short EMA Length"))
longEMA = ta.ema(close, input(21, title="Long EMA Length"))

// Entry conditions for long and short positions
longCondition = ta.crossover(shortEMA, longEMA)
shortCondition = ta.crossunder(shortEMA, longEMA)

//###########################################################################################################################################
// Strategy Lines
//###########################################################################################################################################

var timeLow = bar_index
var line li = na
var openLPrice = 0.0000
var openSPrice = 0.0000

LongWColor = input.color(color.rgb(0,255,0,0),"Long Win Color", group="Strategy Lines")
LongLColor = input.color(color.rgb(0,0,255,0),"Long Loss Color", group="Strategy Lines")
ShortWColor = input.color(color.rgb(255,255,0,0),"Short Win Color", group="Strategy Lines")
ShortLColor = input.color(color.rgb(255,0,0,0),"Short Loss Color", group="Strategy Lines")
WinFontColor = input.color(color.rgb(0,0,0,0),"Win Font Color", group="Strategy Lines")
LossFontColor = input.color(color.rgb(255,255,255,0),"Loss Font Color", group="Strategy Lines")
LinesShowLabel = input(false,"Show Labels?",group = "Strategy Lines")

// // Start new line when we go long
// if strategy.position_size >0
//     line.delete(li)
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)

// // Start new line when we go short
// if strategy.position_size <0
//     line.delete(li)
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)

// //Delete Lines if we don't have a position open
// if strategy.position_size ==0
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=color.rgb(0,0,0,100))
//     line.delete(li)

if LinesShowLabel
    // Short Label
    if strategy.position_size>=0 and strategy.position_size[1] <0
        label.new(
             timeLow, na, 
             text=str.tostring((openSPrice-close[1])/(syminfo.mintick*10)), 
             color=close[1]<openSPrice?ShortWColor:ShortLColor, 
             textcolor=close[1]<openSPrice?WinFontColor:LossFontColor,
             size=size.small, 
             style=label.style_label_down, yloc=yloc.abovebar)
    // Long Label
    if strategy.position_size<=0 and strategy.position_size[1] >0
        label.new(
             timeLow, na,
             text=str.tostring((close[1]-openLPrice)/(syminfo.mintick*10)), 
             color=close[1]>openLPrice?LongWColor:LongLColor, 
             textcolor=close[1]>openLPrice?WinFontColor:LossFontColor,
             size=size.small, 
             style=label.style_label_down, yloc=yloc.abovebar)

// Open long position and draw line
if (longCondition)
    //strategy.entry("Long", strategy.long)
    // timeLow := bar_index
    // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)
    openLPrice := close

// Open short position and draw line
if (shortCondition)
    //strategy.entry("Short", strategy.short)
    // timeLow := bar_index
    // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)
    openSPrice := close

//###########################################################################################################################################
// Strategy Execution (Replace this as well)
//###########################################################################################################################################

if (longCondition)
    strategy.entry("Long", strategy.long)

if (shortCondition)
    strategy.entry("Short", strategy.short)

더 많은