더블 이동 평균 교차 거래 전략


생성 날짜: 2023-11-02 14:21:24 마지막으로 수정됨: 2023-11-02 14:21:24
복사: 0 클릭수: 657
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

더블 이동 평균 교차 거래 전략

개요

이 전략은 쌍동이 평균의 교차를 거래 신호로 사용하여 ATR 중지와 결합하여 트렌드 추적 거래를 수행합니다. 핵심 아이디어는 단기 이동 평균에서 장기 이동 평균을 통과 할 때 더 많은 것을하고, 아래를 통과 할 때 공백을 만들고, 동시에 ATR을 사용하여 중지 지점을 설정합니다.

전략 원칙

이 전략은 주로 이동 평균의 두 그룹을 통해 트렌드 방향을 판단한다. 빠른 이동 평균의 길이는 25일이고, 느린 이동 평균의 길이는 100일이다. 빠른 이동 평균 위에 느린 이동 평균을 통과하면 구매 신호가 발생하고, 빠른 이동 평균 아래에 느린 이동 평균을 통과하면 판매 신호가 발생한다.

일부 가짜 신호를 필터링하기 위해, 전략에 크로스 카운터 크로스 카운트가 추가되었다. 크로스 카운트는 빠른 이동 평균의 크로스 수가 maxNoCross보다 적을 때만 신호를 유발한다.

또한, 전략은 초기 신호가 발급된 후, 가격이 두 이동 평균 사이에 다시 들어간다면, 그 신호를 확인하는 확인 메커니즘을 추가한다.

입시 후, 전략은 ATR 지표를 사용하여 중지 거리를 설정한다. ATR은 지난 일정 기간 동안의 가격 변동 범위를 측정하며, 여기에 ATR의 14배로 중지 거리를 설정한다.

우위 분석

이 전략에는 다음과 같은 장점이 있습니다.

  1. 이중 이동 평균을 사용하여 교차 필터링 메커니즘을 결합하면 가짜 신호를 효과적으로 필터링하여 더 강력한 추세를 잡을 수 있습니다.

  2. 위조 침입을 막기 위해 확인 메커니즘을 추가합니다.

  3. ATR의 플로잉 트래킹 스톱로스는 수익을 최대한 고정시키고 과대 인출을 방지할 수 있습니다.

  4. 편리하게 최적화할 수 있는 파라미터가 적고, 실행하기 쉽다.

  5. 디지털 화폐와 전통적인 기본 시장 등 다양한 시장에서 적용할 수 있다.

  6. 여러 지표들을 종합적으로 활용하여 전략을 구성하여 전략을 더욱 견고하게 만든다.

위험 분석

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

  1. 진동상태에서 이동평균이 교차하는 경우가 많고, 이로 인해 손실이 발생할 수 있다.

  2. ATR 매개 변수를 잘못 설정하면 너무 느슨하거나 너무 꽉 막히는 손실이 발생할 수 있습니다.

  3. 큰 점프 또는 이 직접적으로 정지 손실을 유발할 수 있습니다.

  4. 급격한 가격 변동으로 인한 갑작스러운 주요 사건으로 인해 직접적인 손실이 발생할 수 있습니다.

  5. 이동 평균 변수가 불합리한 경우 트렌드를 놓치거나 너무 많은 가짜 신호를 생성할 수 있습니다.

  6. 최근 가격 변동 범위의 변경으로 ATR 중지 손실 거리가 조정되지 않을 수 있습니다.

최적화 방향

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

  1. 이동 평균 변수를 최적화하여 더 적합한 조합을 찾습니다. 다른 주기 변수와 중도 이동 평균을 테스트 할 수 있습니다.

  2. 다른 ATR 주기 변수를 테스트하여 더 좋은 스톱 거리 (stop loss distance) 를 찾습니다.

  3. 추가 필터링 조건을 추가하여 거래량 확대, 흔들림 지표 등으로 신호 품질을 향상시킵니다.

  4. 트렌드를 판단하는 지표와 결합하여, 변동이 있는 상황에서는 속지 않도록 한다.

  5. 기계 학습 알고리즘을 추가하고, 역사 데이터 훈련을 통해, 자동으로 파라미트 콤비니지를 최적화한다.

  6. 큰 차트에서 더 많은 확인을 찾고, 짧은 선의 잡음으로 오해하지 마십시오.

  7. 이윤 포지션 하락 규칙을 설정하고, 점차적으로 이윤을 잠금합니다.

요약하다

이 전략은 쌍 이동 평균 교차, 트렌드 필터링, 확인 메커니즘 및 ATR 동적 중지 등 여러 가지 기술 지표를 통합합니다. 변수 최적화 및 위험 제어 측면에서 개선 할 여지가 있지만 거래 아이디어는 간단하고 명확하며 복제를 쉽게 수행 할 수 있습니다.

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

//@version=3
strategy("QuantCat Intraday Strategy (15M)", overlay=true)

//MA's for basic signals, can experiment with these values

fastEMA = sma(close, 25)
slowEMA = sma(close, 100)

//Parameters for validation of position

lookback_value = 25
maxNoCross=10 //value used for maximum number of crosses on a certain MA to mitigate noise and maximise value from trending markets

//Amount of crosses on MA to filter out noise

ema25_crossover = (cross(close, fastEMA)) == true ? 1 : 0
ema25_crossover_sum = sum(ema25_crossover, lookback_value) ///potentially change lookback value to alter results
crossCount = (ema25_crossover_sum <= maxNoCross)

//Entries long

agrLong =  ((crossover(fastEMA, slowEMA)) and (crossCount == true)) ? true : false
consLong = ((close < fastEMA) and (close > slowEMA) and (fastEMA > slowEMA) and (crossCount == true)) ? true : false

//Entries short

agrShort =  ((crossunder(fastEMA, slowEMA)) and (crossCount == true)) ? true : false
consShort = ((close > fastEMA) and (close < slowEMA) and (fastEMA < slowEMA) and (crossCount == true)) ? true : false

//ATR

atrLkb = input(14, minval=1, title='ATR Stop Period')
atrRes = input("15",  title='ATR Resolution')
atr = request.security(syminfo.tickerid, atrRes, atr(atrLkb))

//Strategy

longCondition = ((agrLong or consLong) == true)
if (longCondition)
    strategy.entry("Long", strategy.long)

shortCondition = ((agrShort or consShort) == true)
if (shortCondition)
    strategy.entry("Short", strategy.short)

//Stop multiplier 

stopMult = 4

//horizontal stoplosses

longStop = na
longStop :=  shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * stopMult) : longStop[1] 
shortStop = na
shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * stopMult) : shortStop[1]

//Strategy exit functions

strategy.exit("Long ATR Stop", "Long", stop=longStop)
strategy.exit("Short ATR Stop", "Short", stop=shortStop)

//Plots 

redgreen = (fastEMA > slowEMA) ? green : red
    
p1 = plot(fastEMA, title="Fast EMA", color=redgreen, linewidth=2) 
p2 = plot(slowEMA, title="Slow EMA", color=redgreen, linewidth=2) 
fill(p1, p2, color=redgreen)

s1 = plot(longStop, style=linebr, color=red, linewidth=2,     title='Long ATR Stop')
s2 = plot(shortStop, style=linebr, color=red, linewidth=2,  title='Short ATR Stop')

fill(p2, s1, color=red, transp=95)
fill(p2, s2, color=red, transp=95)