MACD 마감 중간값 거북이 하이브리드 전략


생성 날짜: 2023-10-30 12:16:20 마지막으로 수정됨: 2023-10-30 12:16:20
복사: 1 클릭수: 630
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

MACD 마감 중간값 거북이 하이브리드 전략

개요

이 전략은 MACD 지표의 골드 포크 데드 포크 신호, K 라인 종료 가격과 중간 라인의 관계, 가격 변동 특성을 사용하여 입문 및 출구 시기를 판단하며, 재입문 및 수정 입문 메커니즘을 설정하여 더 많은 거래 기회를 얻고 동시에 위험을 제어하여 안정적인 수익을 달성합니다.

전략 원칙

이 전략은 다음과 같은 몇 가지 원칙에 기초하고 있습니다.

  1. MACD의 분석을 사용하여 빠른 선과 느린 선의 골드 포크 데드 포크를 사용하여 다단계 및 공백 시장, 그리고 특정 진입 지점을 판단하십시오.

  2. K선 종결 가격과 중간선과의 관계를 사용하여 다공계 트렌드가 종료되었는지 여부를 판단하고, 출구 지점을 판단한다.

  3. 재입장 메커니즘을 설정하여, MACD의 현재 회전이 끝난 후, 추세에 따라 계속 재입장하면 수익 기회를 증가시킨다.

  4. 수정 입문 메커니즘을 설정하여, 가격이 부분적으로 조정되지만 반전되지 않은 경우, 포지션을 추가합니다. 이것은 트렌드 내부 조정입니다.

  5. 위의 몇 가지 점을 종합하여, 동적으로 포지션을 조정하여, 추세에서 가능한 한 많은 수익을 얻으며, 추세가 끝나면 빠르게 퇴출하십시오.

구체적으로, 전략은 먼저 MACD의 빠른 선과 느린 선이 골드 포크 또는 데드 포크 현상이 발생하는지 판단하고, 골드 포크가 더하면 더 많이 하고, 데드 포크가 더하면 더 적게 한다. 그 다음 K 선이 마이너스 라인을 만지는지 판단하고, 만지면 트렌드 종료로 평정한다.

또한, 전략은 다시 입문 메커니즘을 설정합니다. 즉, 원본 방향의 추세가 끝난 후, MACD가 동일한 방향의 신호를 계속 표시하면, 전략은 다시 트렌드를 추적 할 수 있습니다. 또한 수정 입문 메커니즘을 설정합니다. 가격이 약간의 조정이 발생하지만 완전히 반전되지 않은 경우, 전략은 적절한 포지션을 올립니다. 이것은 트렌드의 정상적인 회귀 행동입니다.

이러한 설정을 통해, 전략은 동적으로 트렌드에서 포지션을 조정할 수 있으며, 더 많은 출입과 출퇴근을 할 수 있으며, 위험을 통제하는 조건에서 더 높은 수익을 얻을 수 있습니다.

전략적 이점

이 전략은 여러 지표를 통합하여 다음과 같은 주요 장점을 가지고 있습니다.

  1. MACD는 트렌드와 반향점을 식별하여 특정 입시점을 결정합니다.

  2. 마감 가격과 중간 선의 관계를 판단하면 트렌드의 끝을 정확하게 판단할 수 있다.

  3. 재입장 메커니즘은 포지션 개시 횟수를 증가시키고 자금 활용 효율성을 향상시킵니다.

  4. 입시 메커니즘을 수정하여 트렌드 상황을 충분히 파악할 수 있습니다.

  5. 전략적 조작의 빈도가 높지만 위험은 조절할 수 있으며, 높은 수익 요소를 쉽게 얻을 수 있다.

  6. 각 매개 변수는 조정할 수 있으며, 다른 품종과 상황에 맞게 최적화할 수 있다.

  7. 전략이 명확하고 이해하기 쉬우며, 코드가 간결하고, 하드 디스크가 편리하다.

  8. 탐지 데이터는 풍부하고 신뢰성이 높으며 실판에서는 효과를 쉽게 확인할 수 있다.

전략적 위험

이 전략에는 다음과 같은 주요 위험도 있습니다.

  1. MACD가 거짓 신호를 발산할 확률은 다른 지표와 함께 검증해야 한다.

  2. 큰 레벨의 스톱 패드 설정이 너무 작으면 큰 상황의 충격으로 경기에서 제외될 수 있다.

  3. 재입장과 수정입장 운영의 빈도를 높여 자금 활용률을 조절해야 한다.

  4. 이 경우, 부진이 발생할 경우, 부진이 발생할 경우, 부진이 발생할 경우, 부진이 발생할 수 있습니다.

  5. 거래 품종과 파라미터 설정은 최적화가 필요하며 모든 품종에 적용되지 않습니다.

  6. 지속적인 재검토와 최적화가 필요하며, 시장에 따라 변수를 조정한다.

  7. 실판에서 슬라이드 포인트 비용의 영향을 고려해야 합니다.

이에 대응하는 위험 관리 조치에는 다음과 같은 것들이 포함됩니다. 단독 손실을 제한하기 위해 스톱 스톱을 설정하고, 재원 활용도를 평가하고, 합리적인 현금 저축을 유지하며, 품종에 맞는 적절한 변수 조합을 선택하여 재검토하고, 변수를 최적화하기 위해 시장 특성의 변화에 지속적인 관심을 가지고, 재검토와 시뮬레이션에서 미끄러짐 비용의 영향을 고려합니다.

전략 최적화 방향

이 전략은 다음의 몇 가지 측면에서 더 개선될 수 있습니다.

  1. 다른 지표와 결합하여 신호 검증을 하여 신호 정확도를 높인다. KDJ 지표 등이다.

  2. 자율적 동적 중지 손해 차단 기준을 설정하십시오.

  3. 재입학 및 수정 입학 조건 논리를 최적화하십시오.

  4. 서식지 변수를 최적화하여 최적의 변수 조합을 설정한다.

  5. 재입학금 사용률을 최적화하고 재입학금 제한과 재입학금 수정을 설정한다.

  6. 융합량능력 지표, 반동시장에서의 포착손실을 피한다.

  7. 이동식 스톱을 설정하는 것과 같은 출전 메커니즘을 추가한다.

  8. 전략 패키지를 거래 로봇으로 삼아 자동화 거래를 고려하십시오.

  9. 슬라이드 포인트 비용과 같은 디스크 고려 요소를 추가하십시오.

이러한 최적화를 통해 전략의 안정성, 적응성, 자동화 수준 및 실내 실효성을 더욱 향상시킬 수 있습니다.

요약하다

이 전략은 MACD 지표의 거래 신호, K선 종식 가격 분석 및 여러 입문 메커니즘을 통합하여 추세를 파악하면서 위험을 제어하는 효율적인 양적 거래 전략 아이디어입니다. 이 전략은 운영 주파수, 자금 사용률이 좋으며 실현의 어려움이 낮다는 장점을 가지고 있지만 위험 제어 및 전략 최적화에 주의를 기울여야하며 실용적 가치와 확장 공간을 가지고 있습니다. 로봇 기술과 결합하여 자동화를 구현하면 매우 실용적인 양적 거래 솔루션이 될 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Puckapao

//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)

// Get date
startDate = input(title="Start Date", type=input.integer,
     defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange =  true

reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])

sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])

close_cnt = 0
close_cnt := nz(close_cnt[1])

on_long = false
on_long := nz(on_long[1])

on_short = false
on_short := nz(on_short[1])

sculp = false
reenter = false
slowdown = false

ema = ema(close, ema_period)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)

cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)

if (inDateRange)

    over_macd = macd > 0 and signal > 0 ? true : false
    under_macd = macd < 0 and signal < 0 ? true : false
    over_water = close > ema ? true : false
    under_water = close < ema ? true : false
    slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
    reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
    sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
    
    if(reenter == true)
        if(reenter_cnt < reenter_delay)
            reenter_cnt := reenter_cnt + 1
    else
        if(reenter_cnt > 0)
            reenter_cnt := reenter_cnt - 1
                    
    if(sculp == true)
        if(sculp_cnt < sculp_delay)
            sculp_cnt := sculp_cnt + 1
    else
        if(sculp_cnt > 0)
            sculp_cnt := sculp_cnt - 1
        
    if(slowdown == false)
        if(close_cnt < 2)
            close_cnt := close_cnt + 1
        else
            close_cnt := 0
    
    // plotchar(fork_cnt, "fork count", "")
    // plotchar(spoon_cnt, "spoon count", "")

    // Entry
    if (cross_up == true)
        strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
        on_long := true
        on_short := false
    if (cross_down == true)
        strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
        on_short := true
        on_long := false
        
    // Sculp bottom / top
    if (sculp == true and sculp_cnt >= sculp_delay)
        if (hist >= 0)
            strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
        else
            strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
        
        sculp_cnt := 0
        sculp := false
            
    // Re-Entry
    if (reenter == true and reenter_cnt >= reenter_delay)
        if (hist >= 0)
            strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
        else
            strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
            
        reenter_cnt := 0
        reenter := false
            
    // Close
    strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
    strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
    strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
    strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
    strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
    strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
    
    if (slowdown)
        if (hist >= 0)
            on_long := false
        else
            on_short := false


plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")