MACD 트렌드 전략

저자:차오장, 날짜: 2023-12-11 14:57:00
태그:

img

전반적인 설명

MACD 트렌드 추적 전략 (MACD Trend Following Strategy) 은 MACD 지표에 기반한 양적 거래 전략이다. 이 전략은 시장 추세를 결정하고 가격 추세를 추적하기 위해 MACD 황금 십자 및 죽음의 십자 신호를 식별합니다.

전략 논리

MACD 트렌드 다음 전략의 핵심 논리는 다음과 같습니다.

  1. MACD 라인과 신호 라인을 계산합니다.
  2. MACD 라인이 0을 넘어서면 가장 높은 지점을 기록하고
  3. MACD 라인이 0 아래를 넘어가면 가장 낮은 지점을 기록하고 황금색 십자 신호를 기다립니다.
  4. 골든 크로스가 발생했을 때, 현재 폐쇄 가격을 긴 엔트리 포인트로 기록하고, 스톱 로스 포인트를 설정하고, 긴 포지션을 열고
  5. 도드 크로스가 발생했을 때, 현재 폐쇄 가격을 짧은 엔트리 포인트로 기록하고, 스톱 로스 포인트를 설정하고, 오픈 쇼트 포지션을 설정합니다.
  6. 긴 포지션을 보유할 때, 수익률이 미리 설정된 목표에 도달하거나 마감점이 스톱 로스 포인트에 도달하면 수익을 실현하기 위해 포지션을 닫습니다.
  7. 쇼트 포지션을 보유할 때, 수익률이 미리 설정된 목표에 도달하거나 마감점이 스톱 로스 포인트에 도달하면 수익을 실현하기 위해 포지션을 닫습니다.

이러한 트렌드 추적 메커니즘을 통해 전략은 시장 트렌드의 전환을 적시에 파악하고 이익을 얻을 수 있습니다.

이점 분석

MACD 트렌드 다음 전략은 다음과 같은 장점을 가지고 있습니다:

  1. 전략 신호의 출처는 단일적이고 명확하며 MACD 지표에 의해 직접 생성되며 신호의 간섭을 피합니다.
  2. 정확한 판단으로 시장 트렌드 방향을 결정하기 위해 MACD 지표의 황금 십자 및 죽음의 십자 특성을 활용하십시오.
  3. 트렌드의 전환을 적시에 추적하고, 강력한 수익 추적 기능을 갖습니다.
  4. 적절한 리스크 제어 장치와 스톱 로스 메커니즘

위험 분석

MACD 트렌드 다음 전략은 또한 다음과 같은 위험을 가지고 있습니다:

  1. MACD 지표는 잘못된 신호를 생성하는 경향이 있으며 이는 극단기 거래에서 손실을 초래할 수 있습니다.
  2. 부적절한 스톱 손실 포인트 설정은 단일 손실을 증가시킬 수 있습니다.
  3. 이윤 추적 비율과 손해를 막는 지점 사이의 균형을 맞추기 어렵고, 손실로 이어지는 과도한 추적 위험이 있습니다.

위 위험에 대응하기 위해 다음과 같은 최적화 조치가 채택될 수 있습니다.

  1. 다른 표시기와 결합하여 잘못된 신호를 필터링합니다.
  2. 동적으로 스톱 로스 포인트를 조정합니다.
  3. 이윤 추적 비율 및 스톱 로스 포인트의 매개 변수를 최적화합니다.

최적화 방향

MACD 트렌드 다음 전략은 다음과 같은 측면에서 최적화 될 수 있습니다:

  1. 잘못된 신호 비율을 줄이기 위해 MACD 지표 매개 변수를 최적화하십시오. MACD의 다른 사이클 매개 변수를 테스트 할 수 있습니다.

  2. 신호를 필터링하기 위해 거래량과 같은 다른 지표를 추가합니다. 최소 거래량 조건을 설정할 수 있습니다.

  3. 동적인 트레일링 스톱 로스 메커니즘을 설정합니다. 스톱 로스 포인트는 변동성에 따라 동적으로 조정할 수 있습니다.

  4. 포지션을 열기 위해 신호 결정 논리를 최적화합니다. 더 엄격한 트리거 조건을 설정할 수 있습니다.

  5. 신호를 필터링하기 위해 기계 학습 모델을 통합합니다. 신호의 신뢰성을 판단하는 모델을 훈련시킬 수 있습니다.

결론

일반적으로, MACD 트렌드 다음 전략은 비교적 성숙한 양적 전략이다. 그것은 시장 트렌드 방향을 결정하기 위해 MACD 지표를 활용하고, 가격 추세를 효과적으로 추적할 수 있는 스톱 로스 메커니즘으로 위험을 제어한다. 그러나 MACD 지표 자체는 또한 일부 결함이 있으며, 잘못된 신호를 생성하기 쉽다. 따라서 이 전략의 추가 최적화를 위한 공간이 있다. 주로 지표 매개 변수, 스톱 로스 메커니즘, 신호 필터링 등과 같은 측면에 있다.


/*backtest
start: 2023-11-10 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("MACD Cross Strategy", overlay=true)

// Get MACD values
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
var float entryLongPrice = na
var float entryShortPrice = na

var float highestLongProfit = 0
var float highestShortProfit = 0

var float highestMACD = 0
var float lowestMACD = 0
var bool haveOpenedLong = false
var bool haveOpenedShort = false

var float stoploss = 0.04 // To be adjust for different investment
var float minProfit = 0.05 // To be adjust for different investment

if macdLine > 0
    lowestMACD := 0
    highestMACD := math.max(highestMACD, macdLine)
    haveOpenedShort := false
else
    highestMACD := 0
    lowestMACD := math.min(lowestMACD, macdLine)
    haveOpenedLong := false

// Enter long position when MACD line crosses above the signal line
if ta.crossover(macdLine, signalLine) and macdLine < highestMACD and macdLine > 0 and haveOpenedLong == false
    strategy.entry("Long", strategy.long)
    strategy.exit("Exit Long", from_entry = "Long", stop=close*(1 - stoploss))
    entryLongPrice := close
    haveOpenedLong := true

if ta.crossunder(macdLine, signalLine) and macdLine > lowestMACD and macdLine < 0 and haveOpenedShort == false
    strategy.entry("Short", strategy.short)
    strategy.exit("Exit Short", from_entry = "Short", stop=close*(1 + stoploss))
    entryShortPrice := close
    haveOpenedShort := true

// log.info("entryLongPrice:{0}", entryLongPrice)
if strategy.position_size > 0
    profit = close - entryLongPrice
    log.info("profit:{0}", profit)
    if profit > 0
        highestLongProfit := math.max(highestLongProfit, profit)
        if profit / entryLongPrice > minProfit and highestLongProfit * 0.8 > profit
            strategy.close("Long")
            highestLongProfit := 0

if strategy.position_size < 0
    profit = entryShortPrice - close
    if profit > 0
        highestShortProfit := math.max(highestShortProfit, profit)
        log.info("highestShortProfit={0}, profit={1}", highestShortProfit, profit)
        if profit / entryShortPrice > minProfit and highestShortProfit * 0.8 > profit
            strategy.close("Short")
            highestShortProfit := 0

더 많은