MACD 추세 추종 전략


생성 날짜: 2023-12-11 14:57:00 마지막으로 수정됨: 2023-12-11 14:57:00
복사: 0 클릭수: 649
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

MACD 추세 추종 전략

개요

MACD 트렌드 추적 전략은 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