MACD + EMA 다중 시간 프레임 브레이크 전략

저자:차오장, 날짜: 2024-03-22 11:13:12
태그:

img

전반적인 설명

이 전략은 MACD 지표와 여러 EMA 라인을 결합하여 주간 및 내일 두 시간 프레임에서 강력한 시장 트렌드를 포착합니다. 주간 차트에서 MACD 지표를 사용하여 전반적인 트렌드 방향을 결정하고, 내일 차트에서 세 EMA 라인 (5 일, 15 일, 30 일) 을 사용하여 트렌드를 확인하고 브레이크 포인트에서 거래를합니다. 주요 아이디어는 강력한 트렌드를 따라 큰 파도를 타고 단기 EMA가 장기 EMA를 넘어서면 거래를 입력하고 EMA가 철회하거나 스톱-손실 조건을 유발하면 종료하는 것입니다.

전략 원칙

  1. 주간 MACD는 전반적인 추세를 결정합니다: 주간 MACD 지표를 계산하고 현재 주와 전주 MACD 히스토그램 값의 차이를 비교합니다. 긍정적 인 차이는 상승 추세를 나타내고 부정적인 차이는 하락 추세를 나타냅니다. 시장 개방 시 매주 월요일 트렌드 방향을 업데이트합니다.

  2. 다중 EMA 라인은 트렌드를 확인합니다. 5 일, 15 일 및 30 일 EMA 라인을 내일 차트에 그려보십시오. 단기 EMA가 장기 EMA보다 높고 떨어져있을 때 트렌드는 상승합니다. 반대로, 트렌드는 하락합니다.

  3. EMA 교차점에서의 거래:

    • 롱 엔트리: 주간 MACD 트렌드가 상승하고 내일 폐쇄가 15 일간의 EMA를 넘을 때, 롱으로 이동합니다. 엔트리 가격 이하의 고정 포인트로 스톱 로스를 설정하거나 5 일간의 EMA가 15 일간의 EMA를 넘을 때 종료합니다.
    • 단기 엔트리: 주간 MACD 트렌드가 하락하고 5일 EMA가 30일 EMA를 넘을 때, 단기 엔트리. 엔트리 가격 이상의 고정 포인트로 스톱 로스를 설정하거나 5일 EMA가 15일 EMA를 넘을 때 출구하십시오.
  4. 추가 포지션: 현재 추가 입시 조건이 정해지지 않았습니다.

이점 분석

  1. 두 시간 프레임을 결합하면 트렌드 결정이 더 신뢰할 수 있습니다. 주간 MACD는 범위 제한 시장에 갇히지 않는 반면 내일 EMA 크로스오버는 트렌드 내의 각 파도를 캡처합니다.

  2. 5/15/30일 EMA를 선택하면 내일 차트에서 소음을 효과적으로 필터링하고 명확한 트렌드를 파악할 수 있습니다.

  3. 스톱 로스 설정은 합리적이며 개별 거래에서 위험을 제어합니다. 고정 포인트 스톱 로스와 EMA 스톱 로스를 결합하면 손실 통제와 트렌드 다음이 가능합니다.

  4. 러 코드 디자인은 MACD와 EMA 계산과 같은 주요 구성 요소로 매우 재사용 가능하고 확장 가능합니다.

위험 분석

  1. MACD 히스토그램 차이 문턱의 잘못된 선택은 너무 느슨하거나 엄격한 트렌드 기준으로 이어질 수 있으며 잘못된 판단을 유발할 수 있습니다. 백테스팅 및 매개 변수 최적화는 최적의 문턱을 선택하는 데 도움이 될 수 있습니다.

  2. 내일 EMA 매개 변수의 잘못된 선택 - 너무 짧으면 과잉 거래로 이어질 수 있으며 너무 길으면 기회를 놓칠 수 있습니다. 백테스팅 및 매개 변수 최적화는 최적의 매개 변수 조합을 선택하는 데 도움이 될 수 있습니다.

  3. 부적절한 고정 스톱 로스 포인트 - 너무 좁게 설정하면 빈번한 스톱 아웃이 발생할 수 있으며 너무 넓게 설정하면 거래 당 과도한 손실이 발생할 수 있습니다. 각 도구의 변동성 특성에 따라 맞춤형 스톱 로스는 도움이 될 수 있습니다.

  4. EMA는 트렌드 전환점에 지연할 수 있고, 잠재적으로 가장 좋은 입출점들을 놓칠 수 있습니다. 그러나 장기적으로는 여전히 위험을 효과적으로 통제하고 전반적으로 좋은 성과를 낼 수 있습니다.

최적화 방향

  1. 주간 MACD에 RSI와 같은 다른 지표를 추가하여 트렌드 강도를 확인하고 정확도를 향상시키는 것을 고려하십시오.

  2. 거래 빈도와 위험을 줄이기 위해 CCI와 같은 다른 지표를 추가 필터로 추가로 추가하는 것을 고려하십시오.

  3. 각 주식의 역사적 변동성을 기반으로 사용자 정의 스톱-러스 포인트를 설정하여 그 특성에 더 잘 맞게 설정합니다.

  4. 포지션의 확장 및 퇴출을 위한 전략 규칙을 추가하는 것을 고려하십시오. 자본 효율성을 향상시키기 위해 점차적으로 강한 추세를 추가하고 약화 추세를 줄입니다.

요약

MACD+EMA 멀티 타임프레임 브레이크아웃 전략은 트렌드 결정과 확인을 위한 과학적 근거를 가진 트렌드 추후 전략이다. 주요 시장 트렌드를 효과적으로 파악하고 안정적인 수익을 창출할 수 있다. 한편, 전략은 합리적인 스톱 로스 및 출구 규칙으로 마이너드 다운을 효과적으로 제한하여 위험 통제에 상당히 완전하다. 그러나 추후 트렌드 신호와 스케일링 규칙의 부족과 같은 몇 가지 단점도 있다. 이를 더 이상 최적화하고 개선할 수 있다. 전반적으로, 이것은 학습하고 활용할 가치가 있는 매우 가치 있는 양적 거래 전략이다.


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


// 1) 전주와 전전주의 히스토그램의 차이를 계산하여, 매주 월요일에 매매 방향을 표시하고, 
// 2) 5일, 15일, 30일 선을 호출하여 평행하게 그리고, 매매 방향에 따라 
// 3) 분봉기준의 이동평균선 매매전략  
// 4) 수익 실현은 미설정 해둠 


//@version=5
strategy('Last week MACD+ 15day, 30day break through, by Ho.J', overlay=true, initial_capital=30000, commission_value = 7.5, commission_type=strategy.commission.cash_per_order, slippage = 0)

// 백테스팅 기간 설정
start_time = input(timestamp("Jan 19 2024 00:00:01"), confirm = true)
end_time = input(timestamp("MAR 19 2024 23:59:59"), confirm = true)
is_in_time = true
stopLoss = input.int(100, title="손절 수준")


// 지난주 값 불러오기 입력 매개변수, 1은 5일, 3은 15일, 6은 30일 이동평균선을 구하는 변수임
emaLength1 = input(1, title="EMA Length")
emaLength2 = input(3, title="EMA Length")
emaLength3 = input(6, title="EMA Length")
timeframePeriod = "W" // 'D'는 일간 데이터를 의미


// 분봉기준 EMA 계산
shortEMA = ta.ema(close, 50)
mediumEMA = ta.ema(close, 60)
longEMA = ta.ema(close, 150)


// 분봉기준 EMA 그리기
plot(shortEMA, color=color.blue, title="5일 EMA")
plot(mediumEMA, color=color.orange, title="15일 EMA")
plot(longEMA, color=color.red, title="30일 EMA")



// 주간 MACD 계산, 전주와 전전주 히스토그램을 계산하여 상대적인 상승, 하락을 계산 
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
histogram = macdLine - signalLine
histLastWeek = request.security(syminfo.tickerid, timeframePeriod, histogram[1], lookahead=barmerge.lookahead_on)
histWeekBeforeLast = request.security(syminfo.tickerid, timeframePeriod, histogram[2], lookahead=barmerge.lookahead_on)
histDiff = histLastWeek - histWeekBeforeLast


// 현재 주의 월요일 첫 봉인지 확인
isMondayFirstBar = (dayofweek == dayofweek.monday) and (hour == 09) and (minute == 00) // 여기서 시간은 시장 개장 시간에 따라 조정해야 함


// 월요일 첫봉에, 주간 MACD 히스토그램이 상승하면 '매수', 하락하면 '매도' 표시
var label myLabel = na
if (isMondayFirstBar)
    if (histDiff > 0)
        myLabel := label.new(bar_index, high, "이번주는 매수만", color=color.green, textcolor=color.white, style=label.style_label_down, size=size.large)
    else if (histDiff < 0)
        myLabel := label.new(bar_index, low, "이번주는 매도만", color=color.red, textcolor=color.white, style=label.style_label_up, size=size.large)


// 지난주 EMA 값 요청
// 'lookahead'를 사용하여 지난 데이터를 기준으로 계산
lastWeekEMA1 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength1), lookahead=barmerge.lookahead_on)
lastWeekEMA2 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength2), lookahead=barmerge.lookahead_on)
lastWeekEMA3 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength3), lookahead=barmerge.lookahead_on)

// 지난주 EMA 그리기
plot(lastWeekEMA1, color=color.red, title="Last Week EMA1")
plot(lastWeekEMA2, color=color.rgb(157, 126, 126), title="Last Week EMA2")
plot(lastWeekEMA3, color=color.rgb(199, 192, 192), title="Last Week EMA3")


// 매수/매도 조건
buySignal = ta.crossover(close, lastWeekEMA2) and histDiff > 0
// addbuySignal = ta.crossover(close, lastWeekEMA3) and histDiff > 0

sellSignal = ta.crossunder(shortEMA, longEMA) and histDiff < 0
// addSellSignal = ta.crossunder(close, lastWeekEMA3) and histDiff < 0


// 매수 조건
if (buySignal)
    strategy.entry('Buy', strategy.long)
    alert('Buy Signal', alert.freq_once_per_bar_close)
	
// if (addbuySignal)
   // strategy.entry('Buy', strategy.long)
   // alert('add Buy Signal', alert.freq_once_per_bar_close)

if (strategy.position_size > 0 and ((strategy.position_avg_price - close) >= stopLoss) or ta.crossunder(close, mediumEMA))
    strategy.close('Buy')
    alert('Close Buy Signal', alert.freq_once_per_bar_close)

// 매도 조건
if (sellSignal)
    strategy.entry('Sell', strategy.short)
    alert('Sell Signal', alert.freq_once_per_bar_close)
	
//if (addSellSignal)
   // strategy.entry('Sell', strategy.short)
   // alert('add Sell Signal', alert.freq_once_per_bar_close)

if (strategy.position_size < 0 and ((close - strategy.position_avg_price) >= stopLoss) or ta.crossover(shortEMA, mediumEMA))
    strategy.close('Sell')
    alert('Close Sell Signal', alert.freq_once_per_bar_close)

더 많은