시일레이터 프로파일 반전 전략 다중 시간 프레임 MACD 제로 크로싱 기반

저자:차오장, 날짜: 2024-02-18 15:27:21
태그:

img

전반적인 설명

3 10.0 오시일레이터 프로필 역전 전략은 다른 시간 프레임에 걸쳐 MACD 지표를 계산함으로써 잠재적 인 가격 역전을 식별합니다. 더 높은 자본 효율성을 추구하기 위해 트렌드를 따르는 스톱 로스 접근 방식을 채택합니다.

전략 논리

이 전략은 빠른 및 느린 라인과 MACD 지표 및 신호 라인을 구성하기 위해 3 및 10 기간의 SMA 이동 평균을 계산합니다. 빠른 라인과 신호 라인이 0 라인을 상향 또는 하향으로 넘을 때 가격이 중요한 지점에 도달하고 반전이 발생할 수 있음을 나타냅니다. 또한 반전 신호의 신뢰성을 확인하기 위해 볼륨 압력 판단, RSI 지표 등을 포함합니다. 반전 신호가 특정 신뢰성 요구 사항을 충족하면 길거나 짧습니다.

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

  1. MACD 제로 크로싱은 가격이 중요한 지점에 도달한다는 것을 나타냅니다.
  2. 부피 압력은 상승성 또는 하락성 정서를 판단합니다.
  3. MACD 기울기 변화와 함께 RSI 인덱스는 반전 신호의 강도를 결정합니다.
  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)

더 많은