이중 이동 평균 반전 추적 전략 기반


생성 날짜: 2024-02-20 17:08:43 마지막으로 수정됨: 2024-02-20 17:08:43
복사: 1 클릭수: 527
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이중 이동 평균 반전 추적 전략 기반

개요

쌍평평선 역추적 전략은 이동 평균의 교차를 거래 신호로 사용하는 양적 거래 전략이다. 이 전략은 MACD 지표의 빠른 느린 평균 선의 차치값과 그 신호 선, 그리고 거래량의 다공평 비율 판단을 결합하여 거래 신호를 형성하여 시장 역추적 기회를 잡는다.

전략 원칙

이 전략은 주로 빠른 선과 느린 선의 관계를 판단하며, 빠른 선에서 느린 선을 통과할 때 멀티 신호를 생성하고, 빠른 선 아래 느린 선을 통과할 때 공백 신호를 생성한다. 또한, MACD 차치의 공백 상태, 차치와 신호 선의 관계, 거래량의 공백 상태 등의 통합 판단 시장의 공백 상태.

구체적으로, 전략은 MACD 차이의 크기와 방향을 판단하고, 차수와 신호선이 교차하는 경우, 차수와 신호선 방향이 일치하거나 반대되는 경우 등을 판단한다. 이러한 상황은 시장의 subidabubb 급격한 하락 반발 특성을 반영한다. 또한, 거래량의 다공적 분산도 보조 판단 지표로 작용한다.

격차와 신호선이 시장의 반전 신호를 보여준다고 판단하고 거래량이 시장의 반전을 확인하는 경우에 거래 전략이 생성된다.

전략적 이점

  • 쌍평평선 교차를 사용하여 시장의 전환점을 판단하고, 파충류 이론의 근거가 굳어집니다.
  • 통행량 판단을 합쳐서 가짜 돌파구를 피합니다.
  • MACD 지표 판단 하위 부분 동향, 반발 특성을 식별
  • Parameters 부분 제어 정책의 유연성

위험과 해결책

  • 양평선 교차는 whipsaw 문제를 일으킨다.

    • 평균선 변수를 조정하고 Threshold을 확대합니다.
  • 트랜스포메이션이 완전히 차단되지 않아서

    • OBV와 같은 부수표와 결합하여 실제 거래량 추세를 판단합니다.
  • subsection 조정의 깊이와 강도를 판단할 수 없습니다.

    • 스톱로드를 늘리고 중요한 지지를 평가합니다.

최적화 방향

  • 규칙 판단 대신 기계 학습 모델을 활용합니다.

    • 전략의 무작위성을 높이고 과장 적합성을 낮추는 것
  • 손해 방지 기술을 추가합니다.

    • 이윤의 일부를 고정하고 위험을 줄여라
  • 감정 지표와 뉴스페이지 분석

    • 모델 판단의 정확성을 높여라
  • 다른 품종, 시장으로 이식

    • 전략 확장성 테스트

요약하다

쌍평선 반전 추적 전략은 평선 지표, MACD 지표, 그리고 거래량 지표를 종합적으로 고려하여 반전 신호를 포착하여 적절한 반전 지점을 선택하여 포지션을 구축합니다. 전략 최적화 공간은 여전히 넓고, 기계 학습 및 풍력 제어 수단으로 전략 안정성과 수익률을 더욱 향상시킬 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

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)

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(macdSlope, color=color.red, title="Total Volume")
//plot(signalSlope, color=color.green, title="Total Volume")
intrabarRange = high - low

getLookBackSlope(lookBack) => signal - signal[lookBack]
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
    float s = 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 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 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 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0

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

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

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

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

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 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 )

// 7.48 Profit 52.5% 
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack  and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
    strategy.entry("Short1", strategy.short)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - 0.75, stop=strategy.position_avg_price + 0.5)

// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
    strategy.entry("Long1", strategy.long)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + 0.75, stop=strategy.position_avg_price - 0.5)