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

저자:차오장, 날짜: 2024-02-18 15:17:36
태그:

img

전반적인 설명

이 전략은 MACD 지표와 시그널 라인 이동 평균 사이의 교차점을 계산하여 트렌드 방향을 결정하고, 트렌드를 추적하기 위해 EMA 지표로 현재의 트렌드의 강도를 판단합니다. MACD 라인이 신호 라인을 통해 상향으로 돌파 할 때 길고, 하향으로 돌파 할 때 짧습니다. EMA 라인은 또한 잘못된 브레이크를 필터링하기 위해 트렌드의 강도를 판단 할 수 있습니다.

전략 논리

이 전략의 핵심은 MACD 지표에 기반하여 트렌드 방향과 입점 시기를 결정하는 것입니다. MACD 라인과 신호 라인의 교차는 가격 트렌드의 반전을 나타냅니다. 따라서 긴 및 짧은 포지션은 브레이크아웃 방향에 따라 결정됩니다. 구체적으로, 폐쇄 가격이 EMA 라인의 위에 있고 MACD 라인이 아래에서 신호 라인을 통과하면 긴; 폐쇄 가격이 EMA 라인의 아래에 있고 MACD 라인이 위로부터 신호 라인을 통과하면 짧은.

EMA 라인은 트렌드를 판단하는 데 도움이 된다. 가격이 EMA 라인 위에 있다면 상승 추세를 나타낸다. 이 때, MACD 아래에서 돌파구가 황금 십자 신호를 형성할 가능성이 있다. 가격이 EMA 라인 아래에 있다면 하향 추세를 나타낸다. 이 때, MACD 위에서 돌파구가 죽음의 십자 신호를 형성할 가능성이 있다. EMA 길이는 또한 중장기 트렌드 판단의 정도를 결정한다.

이렇게 하면, 시가가 새로운 트렌드를 형성하기 위해 역전되기 시작할 때 시기에 시장에 진입할 수 있습니다. 트렌드 추적 효과를 달성합니다.

이점 분석

이 전략은 두 가지 판단 조건을 결합하여 가격의 트렌드 방향을 고려하고 특정 진입 시기를 결정하기 위해 지표를 사용하여 잘못된 브레이크의 위험을 피하고 전략의 신뢰성을 향상시킵니다. MACD 지표만 사용하는 것과 비교하면이 전략은 새로운 트렌드의 시작을 더 정확하게 결정할 수 있습니다.

EMA 라인의 적용은 또한 전략이 단기 변동의 영향을 필터링하고 중장기 트렌드를 어느 정도 잠금 할 수있게합니다. 이것은 반전을 판단하는 MACD 지표의 효율성을 개발하는 데 매우 유용합니다.

또한 이 전략은 장과 단 두 가지 조건들을 설정하여 황소 시장과 곰 시장에 적용할 수 있으며, 이를 통해 전략의 적응성을 강화합니다.

위험 분석

이 전략의 주요 위험은 MACD 지표 자체는 Fakeout 신호를 잘못 판단 할 가능성이 높다는 것입니다. 이 시점에서 EMA 라인의 보조 기능이 필요합니다. 그러나 특별한 시장 조건에서 실패는 여전히 발생할 수 있습니다.

또한, 전략은 수익 요인을 채택하여 스톱 로스 및 수익 조건을 설정합니다. 이는 일부 주관성을 포함합니다. 부적절한 설정은 또한 전략 성과에 영향을 줄 수 있습니다.

마지막으로, 전략은 단순히 직접 거래에서 일부 위험을 초래하는 기금 관리 문제를 고려하지 않고 계정의 자금의 100%로 포지션 크기를 설정합니다.

최적화 방향

이 전략의 주요 최적화 방향은 다음과 같습니다.

  1. 판단을 위해 다른 지표를 증가시켜 여러 지표 조합을 형성하여 MACD가 잘못된 신호를 생성 할 가능성을 추가로 피합니다. 예를 들어 KDJ 및 BOLL을 고려할 수 있습니다.

  2. EMA 라인의 길이는 트렌드 방향을 판단하는 최적의 매개 변수를 찾기 위해 다중 매개 변수 최적화 될 수 있습니다.

  3. MACD 매개 변수 또한 역전 시기를 결정하는 가장 정확한 값을 찾기 위해 추가로 최적화 할 수 있습니다.

  4. 자본 관리 모듈을 추가합니다. 예를 들어, 이윤 인수는 동적 입력으로 사용될 수 있으며, 미끄러짐 중지도 설정할 수 있습니다.

  5. 암호화폐, 인덱스 선물 등 다양한 유형의 계약에 대한 효과를 테스트하여 가장 적합한 거래 종류를 찾습니다.

결론

전반적으로, 이 MACD EMA 크로스오버 트렌드 추적 전략은 비교적 간단하고 실용적입니다. 이중 지표 조건과 합리적인 스톱 로스 및 영리 방식을 통해 수익에 대한 잠금을 통해 신호 신뢰성을 보장합니다. 주요 최적화 공간은 매개 변수 선택, 지표 조합, 자본 관리 등에 있습니다. 추가 최적화 및 테스트로이 전략이 가장 효율적인 트렌드 추적 전략 중 하나가 될 수 있다고 믿습니다.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// STEP 2:
// See if this bar's time happened on/after start date
afterStartDate = true

//EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="15")
len1 = input(title="EMA Length", type=input.integer, defval=206)
col1 = color.yellow
// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off)
// Draw EMA
plot(emaSmooth, title="EMA", linewidth=1, color=col1)

//MACD
fast_length = input(title="Fast Length", type=input.integer, defval=15)
slow_length = input(title="Slow Length", type=input.integer, defval=24)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=true)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true)
zeroline = 0

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)
//plot(zeroline, title="Zero Line", color=color.black, transp=0)

///////////////////////////LONG////////////////////////////////////////////////////////////////////

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth and close[1] > emaSmooth[1]
macdunderhis = macd < zeroline
macdcrossup = crossover(macd, signal)

longcondition = upcondition and macdunderhis and macdcrossup

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

//////////////////////////////////////SHORT//////////////////////////////////////////////////////////////////////////////////

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth and close[1] < emaSmooth[1]
macdoverhis = macd > zeroline
macdcrosunder = crossunder(macd, signal)

shortcondition = downcondition and macdoverhis and macdcrosunder

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)


//////////////////////////////////////EXIT CONDITION//////////////////////////////////////////////////////////////////////////////////
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
//////LOWEST LOW//////
//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=46, minval=2)
stop_level_long = lowest(low, loLen)[1]

if strategy.position_size>0 
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong)
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1)
highLen = input(title="highest high lookback", type=input.integer,
  defval=25, minval=2)
stop_level_short = highest(high, highLen)[1]

if strategy.position_size<0 
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort)
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short)
    
//PLOTT TP SL
plot(stop_level_long, title="SL Long", linewidth=1, color=color.red)
plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)

더 많은