오시레이터 미세 이동 평균 시점 전략

저자:차오장, 날짜: 2023-12-26 14:40:12
태그:

img

전반적인 설명

이 전략은 빠른 EMA와 느린 EMA 사이의 차이를 계산하여 MACD 오시일레이터를 형성하고 MACD 자체의 EMA를 계산하여 신호선을 형성하여 이중 필터링 시스템을 구축합니다. MACD 라인이 아래에서 신호선을 넘을 때 구매 신호를 생성하고 MACD 라인이 위에서 신호선을 넘을 때 판매 신호를 생성하여 단기 및 중기 가격 변동에서 이익을 얻습니다.

전략 원칙

이 전략의 핵심 지표는 MACD 오시일레이터 (MACD oscillator) 이다. 이 지표는 느린 EMA (일반적으로 26일 EMA) 를 빠른 EMA (일반적으로 12일 EMA) 에서 빼어 계산된다. 빠른 EMA는 더 민감하며 단기 가격 변동에 반응한다. 느린 EMA는 가격 변화에 더 느리게 반응한다. 두 가지를 빼어내는 것은 단기 및 중기 가격 사이클의 차이를 나타내는 오시일레이터를 형성한다. MACD 오시일레이터의 EMA (일반적으로 9일) 는 신호선을 얻기 위해 계산된다. MACD 신호가 MAC 신호선 아래에서 상을 넘을 때, 단기 트렌드의 상승 동력이 중기 트렌드보다 강하다는 것을 신호하며 구매 신호를 생성한다.

이 전략의 입력 매개 변수는 각각 빠른 라인 길이, 느린 라인 길이, 가격 소스 및 신호 라인 매끄러운 기간으로 설정됩니다. 최적의 매개 변수 조합을 찾기 위해 다른 시장에 따라 조정 할 수 있습니다. 배경 색상 블록은 백테스트 시간 프레임을 보여줍니다. 전략은이 시간 프레임 내에서만 포지션을 열 수 있습니다.

이점 분석

  1. MACD 지표는 고전적이고 이해하기 쉽는데, 단기중기 회전 기회를 효과적으로 포착합니다.

  2. MACD 시스템의 이중 EMA 구조는 단일 MA 시스템보다 더 부드럽습니다.

  3. 비교적 더 조정 가능한 매개 변수는 다른 시장에서 최적화를 허용합니다.

  4. 부피 지표와 결합하면 고품질 신호를 식별하는 데 도움이 됩니다.

위험 분석

  1. MACD는 변동 시장에서 더 많은 잘못된 신호를 생성할 수 있습니다.

  2. 트렌드를 결정할 수 없고 트렌드를 넘어서면 손실을 초래할 수 있습니다.

  3. 제한된 백테스트 기간은 극단적인 시장 조건을 무시할 수 있습니다.

  4. 매개 변수 조정에는 특정 시장 기간에 과도하게 적합하지 않도록 더 많은 시장 데이터가 필요합니다.

위험은 트렌드 지표와 스톱 로스 메커니즘을 통합하여 제어 할 수 있습니다. 매개 변수 최적화를 위해 백테스트 범위와 시장 샘플 공간이 확장 될 수 있습니다.

최적화 방향

  1. 밀폐, 중위, 재설정 가격 등과 같은 다른 가격 소스를 테스트합니다.

  2. 더 많은 역사적 데이터를 기반으로 최적의 매개 변수 집합을 검색합니다.

  3. 신호 품질을 판단하기 위해 다른 지표를 통합합니다. 예를 들어 볼륨 신호입니다.

  4. 중요한 트렌드 충돌을 피하기 위해 트렌드 및 사이클 분석을 포함합니다.

결론

이 전략은 이중 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)    



더 많은