오실레이터 차등 이동 평균 타이밍 전략


생성 날짜: 2023-12-26 14:40:12 마지막으로 수정됨: 2023-12-26 14:40:12
복사: 0 클릭수: 374
1
집중하다
1179
수행원

오실레이터 차등 이동 평균 타이밍 전략

개요

이 전략은 빠른 라인 EMA와 느린 라인 EMA의 차이를 계산하여 MACD 진동기를 형성하고 MACD의 평선을 계산하여 신호 라인을 형성하여 이중 필터 시스템을 구축합니다. MACD 라인이 신호 라인을 아래에서 통과하면 구매 신호를 생성하고 MACD 라인이 신호 라인을 위에서 아래로 통과하면 판매 신호를 생성합니다.

전략 원칙

이 전략의 핵심 지표는 MACD 진동기 (MACD oscillator) 이며, 그것은 빠른 EMA (일반적으로 12 일 EMA로 설정된) 를 느린 EMA (일반적으로 26 일 EMA로 설정된) 를 으로 계산된다. 빠른 EMA는 더 민감하며, 가격의 단기 변동을 포착할 수 있다. 느린 EMA는 가격 변화에 더 느리게 반응한다.

이 전략은 입력 파라미터를 각각 빠른 라인 길이, 느린 라인 길이, 가격 소스, 신호 라인 길이로 평형 주기로 설정한다. 다양한 시장에 따라 파라미터를 조정하여 최적의 파라미트 조합을 찾는다. 배경 색상 블록은 재측정의 시간 범위를 보여줍니다. 전략은 그 시간 범위를 제외하고는 상장을 열지 않습니다.

우위 분석

  1. MACD 지표는 고전적이고 이해하기 쉬운 것으로, 단기 중기 반항 기회를 효과적으로 활용할 수 있다.

  2. 이중 EMA로 구성된 MACD 시스템은 단일 MA 시스템보다 더 나은 평탄성을 갖는다.

  3. 조정 가능한 매개 변수가 많으며, 다양한 시장에 대해 매개 변수를 최적화할 수 있다.

  4. 합성 교통량 지표는 고품질의 신호를 식별한다.

위험 분석

  1. 위기 상황에서는 MACD 지표가 더 많은 잘못된 신호를 냅니다.

  2. 트렌드를 판단할 수 없고, 트렌드와 교차해서 손실이 발생할 수 있다.

  3. 그러나, 이 실험의 결과로, 극한의 경우를 무시할 수 있는 제한된 시간 범위가 있습니다.

  4. 매개 변수 설정은 combine 더 많은 시장 데이터를 최적화해야 합니다. 그렇지 않으면 특정 시장 세그먼트를 overfit 할 수 있습니다.

트렌드를 판단하는 지표와 함께 스톱로스 메커니즘을 설정하여 위험을 제어할 수 있다. 동시에 재측정 범위와 시장 샘플링 공간을 확장하여 파라미터를 최적화한다.

최적화 방향

  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)