이 전략은 빠른 EMA와 느린 EMA 사이의 차이를 계산하여 MACD 오시일레이터를 형성하고 MACD 자체의 EMA를 계산하여 신호선을 형성하여 이중 필터링 시스템을 구축합니다. MACD 라인이 아래에서 신호선을 넘을 때 구매 신호를 생성하고 MACD 라인이 위에서 신호선을 넘을 때 판매 신호를 생성하여 단기 및 중기 가격 변동에서 이익을 얻습니다.
이 전략의 핵심 지표는 MACD 오시일레이터 (MACD oscillator) 이다. 이 지표는 느린 EMA (일반적으로 26일 EMA) 를 빠른 EMA (일반적으로 12일 EMA) 에서 빼어 계산된다. 빠른 EMA는 더 민감하며 단기 가격 변동에 반응한다. 느린 EMA는 가격 변화에 더 느리게 반응한다. 두 가지를 빼어내는 것은 단기 및 중기 가격 사이클의 차이를 나타내는 오시일레이터를 형성한다. MACD 오시일레이터의 EMA (일반적으로 9일) 는 신호선을 얻기 위해 계산된다. MACD 신호가 MAC 신호선 아래에서 상을 넘을 때, 단기 트렌드의 상승 동력이 중기 트렌드보다 강하다는 것을 신호하며 구매 신호를 생성한다.
이 전략의 입력 매개 변수는 각각 빠른 라인 길이, 느린 라인 길이, 가격 소스 및 신호 라인 매끄러운 기간으로 설정됩니다. 최적의 매개 변수 조합을 찾기 위해 다른 시장에 따라 조정 할 수 있습니다. 배경 색상 블록은 백테스트 시간 프레임을 보여줍니다. 전략은이 시간 프레임 내에서만 포지션을 열 수 있습니다.
MACD 지표는 고전적이고 이해하기 쉽는데, 단기중기 회전 기회를 효과적으로 포착합니다.
MACD 시스템의 이중 EMA 구조는 단일 MA 시스템보다 더 부드럽습니다.
비교적 더 조정 가능한 매개 변수는 다른 시장에서 최적화를 허용합니다.
부피 지표와 결합하면 고품질 신호를 식별하는 데 도움이 됩니다.
MACD는 변동 시장에서 더 많은 잘못된 신호를 생성할 수 있습니다.
트렌드를 결정할 수 없고 트렌드를 넘어서면 손실을 초래할 수 있습니다.
제한된 백테스트 기간은 극단적인 시장 조건을 무시할 수 있습니다.
매개 변수 조정에는 특정 시장 기간에 과도하게 적합하지 않도록 더 많은 시장 데이터가 필요합니다.
위험은 트렌드 지표와 스톱 로스 메커니즘을 통합하여 제어 할 수 있습니다. 매개 변수 최적화를 위해 백테스트 범위와 시장 샘플 공간이 확장 될 수 있습니다.
밀폐, 중위, 재설정 가격 등과 같은 다른 가격 소스를 테스트합니다.
더 많은 역사적 데이터를 기반으로 최적의 매개 변수 집합을 검색합니다.
신호 품질을 판단하기 위해 다른 지표를 통합합니다. 예를 들어 볼륨 신호입니다.
중요한 트렌드 충돌을 피하기 위해 트렌드 및 사이클 분석을 포함합니다.
이 전략은 이중 EMA 필터 시스템을 구축함으로써 단기에서 중장기 반전 기회를 포착합니다. 그것은 고전적이고 실용적인 시장 타이밍 전략에 속합니다. 위험은 매개 변수 최적화, 신호 필터링 및 스톱 손실 수단으로 제어 할 수 있습니다. 최고점 구매와 바닥 판매를 피하기 위해 트렌드 분석 도구를 통합하면 안정적인 이익을 얻을 수 있습니다.
/*backtest start: 2022-12-19 00:00:00 end: 2023-12-25 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="MACD Histogram Backtest", shorttitle="MACD") // Getting inputs 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=false) // 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 grow = (hist[1] < hist) fall = (hist[1] > hist) and hist >= 0 stop = (hist[1] > hist) 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) //Strategy Testing // Component Code Start // Example usage: // if testPeriod() // strategy.entry("LE", strategy.long) testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(01, "Backtest Start Month") testStartDay = input(2, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true // Component Code Stop //Entry and Close settings if testPeriod() strategy.entry("grow", true, 10, when = grow, limit = close) strategy.close("grow", when = fall) strategy.close("grow", when = stop) //if testPeriod() // strategy.entry("fall", false, 1000, when = fall, limit = close) // strategy.close("fall", when = grow)