다중 시간대 MACD 제로크로스 반전 전략


생성 날짜: 2024-02-18 15:27:21 마지막으로 수정됨: 2024-02-18 15:27:21
복사: 0 클릭수: 548
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다중 시간대 MACD 제로크로스 반전 전략

개요

다중 시간 주기 MACD 제로 축 교차 역전 전략은 다른 주기 MACD 지표를 계산하여 가격의 반전이 가능한 신호를 식별하고, 트렌드 추적 스톱 로스를 채택하여 더 높은 자금 활용 효율을 추구한다.

전략 원칙

이 전략은 동시에 3주기 및 10주기 SMA 이동 평균을 계산하고, 빠른 느린 라인을 구성하고, MACD 지표와 신호 라인을 계산한다. 빠른 라인과 신호 라인이 상향 또는 하향으로 0축 교차할 때, 가격은 위기점에 도달하고, 반전이 발생할 수 있음을 나타냅니다. 또한, 이 전략은 교류량의 다중 공백상태 판단, RSI 지표 등과 결합하여 반전 신호의 신뢰성을 식별한다. 반전 신호가 특정 신뢰성 요구 사항을 충족 할 때, 더하거나 공백한다.

특히, 전략은 다음과 같은 방법으로 가격 반전을 판단합니다.

  1. MACD 0축 교차는 가격의 위기점을 나타냅니다.
  2. 거래량 매매 압력 판단 빈자리
  3. RSI 지표는 MACD 경사 변화와 함께 시상 하향을 나타냅니다.
  4. 빠른 선과 신호 선이 역으로 교차하여 역전 신호를 형성한다.

역전 신호의 신뢰성이 높을 때, 전략은 트렌드 추적 스톱 손실 방식을 도입하여 높은 수익을 추구한다.

우위 분석

이 전략에는 다음과 같은 장점이 있습니다.

  1. 여러 지표로 판단하여 역전 신호를 더 신뢰하게 만듭니다.
  2. MACD 제로 축 교차를 사용하여 회전 지점을 판단, 높은 정확도
  3. RSI 지표 및 거래량 보조 판단, 신뢰성이 높다
  4. 트렌드 추적, 손실을 막는 방법, 더 높은 자금 사용 효율을 추구

위험 분석

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

  1. MACD 지표는 가짜 신호를 발산할 확률이 높고, 함정에 빠지기 쉽다.
  2. 다중공간 교환 과정에서, 정지 손실이 뚫린 확률이 높습니다.
  3. 잘못된 매개 변수 설정은 거래 빈도를 높이고 거래 비용과 슬라이드 지점을 증가시킬 수 있습니다.

위험은 다음과 같은 방법으로 줄일 수 있습니다.

  1. 제약금지범위를 적절히 완화하여 제약금지범위를 적절히 완화시켜야 합니다.
  2. 최적화 매개 변수, 거래 빈도 감소
  3. 중요한 저항 지점 근처에서만 입지를 고려하십시오.

최적화 방향

이 전략은 다음과 같은 방향으로 더 개선될 수 있습니다.

  1. 역전 신호의 신뢰성을 판단하는 데 도움이 되는 기계 학습 알고리즘을 추가합니다.
  2. 감정 지표가 증가하여
  3. 입구 정확도를 높이기 위해 핵심 저항 지점을 지원합니다.
  4. 손해 방지 방법을 최적화하여 자금 사용 효율성을 더욱 높여주기
  5. 거래 빈도를 낮추는 최적의 변수 조합을 테스트합니다.

요약하다

다중 시간 주기 MACD 제로 축 교차 역전 전략은 가격, 거래량 및 변동 지표와 같은 여러 차원의 정보를 종합적으로 고려하여, 다중 지표 판단을 통해 역전 현장 시기를 결정하고, 수익성이 충분 한 후 적시에 중단하여 역전 상황에서 더 나은 수익을 얻을 수 있습니다. 이 전략은 기계 학습 및 핵심 위치 최적화 등의 방법으로 더 개선되어 거래 빈도 및 위험을 줄이고 수익 공간을 향상시킬 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-02-11 00:00:00
end: 2024-02-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 10.0 Oscillator Profile Flagging", shorttitle="3 10.0 Oscillator Profile Flagging", overlay=false)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10.0)
takeProfit = input( title="Take Profit", defval=0.8)
stopLoss = input( title="Stop Loss", defval=0.75)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
plot(macd, color=color.blue, title="Total Volume")
plot(signal, color=color.orange, title="Total Volume")
intrabarRange = high - low
rsi = ta.rsi(close, 14)
rsiSlope = rsi - rsi[1]

getRSISlopeChange(lookBack) =>
    j = 0
    for i = 0 to lookBack
        if ( rsi[i] - rsi[ i + 1 ] ) > -5
            j += 1
    j

getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0.0
    float s = 0.0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0.0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0.0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0.0 and signalSlope[1] > 0.0
bool isNegativeMacdReversal = macdSlope < 0.0 and macdSlope[1] > 0.0

bool isPositiveSignalReversal = signalSlope > 0.0 and signalSlope[1] < 0.0
bool isPositiveMacdReversal = macdSlope > 0.0 and macdSlope[1] < 0.0

bool hasBearInversion = signalSlope > 0.0 and macdSlope < 0.0
bool hasBullInversion = signalSlope < 0.0 and macdSlope > 0.0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0.0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0.0
bool hasSignalSellerBias = hasSignalBias and signal < 0.0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0.0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )

// 393.60 Profit 52.26% 15m
if ( hasBullInversion and rsiSlope > 1.5 and volume > 300000.0 )
    strategy.entry("15C1", strategy.long, qty=10.0)
strategy.exit("TPS", "15C1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 356.10 Profit 51,45% 15m
if ( getVolBias(shortLookBack) == false and rsiSlope > 3.0 and signalSlope > 0)
    strategy.entry("15C2", strategy.long, qty=10.0)
strategy.exit("TPS", "15C2", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 124 Profit 52% 15m
if ( rsiSlope < -11.25 and macdSlope < 0.0 and signalSlope < 0.0)
    strategy.entry("15P1", strategy.short, qty=10.0)
strategy.exit("TPS", "15P1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)

// 455.40 Profit 49% 15m
if ( math.abs(math.abs(macd) - math.abs(signal)) < .1 and buyVolume > sellVolume and hasBullInversion)
    strategy.entry("15P2", strategy.short, qty=10.0)
strategy.exit("TPS", "15P2", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)