이 전략은 트레이딩 신호로 이중 이동 평균의 크로스오버를 사용하고, 트렌드를 따르는 트레이딩을 위해 ATR 스톱과 결합합니다. 핵심 아이디어는 빠른 이동 평균이 느린 이동 평균을 넘을 때 긴 거리를 이동하고, 아래를 넘을 때 짧은 거리를 이동하는 것입니다.
이 전략은 주로 트렌드 방향을 결정하기 위해 두 개의 이동 평균 세트를 사용합니다. 빠른 이동 평균은 25 일, 느린 이동 평균은 100 일 동안 지속됩니다. 빠른 MA가 느린 MA를 넘을 때 구매 신호가 생성되고 느린 MA를 넘을 때 판매 신호가 생성됩니다.
일부 잘못된 신호를 필터링하기 위해, 전략은 크로스 카운트 (crossCount) 라고 불리는 크로스 오버 카운터를 추가합니다. 시그널은 룩백 기간 (예정 25 일) 에 대한 빠른 MA의 크로스 수가 maxNoCross (예정 10) 보다 작을 때만 트리거됩니다.
또한, 전략은 확인 메커니즘을 가지고 있으며, 초기 신호 이후 두 이동 평균 사이에 가격이 다시 들어가면 신호가 확인됩니다.
포지션을 입력 한 후 전략은 ATR을 사용하여 스톱 로스 수준을 설정합니다. ATR은 특정 기간 동안 가격 변동 범위를 측정하며 여기서 14x가 스톱 거리로 사용됩니다. 스톱 레벨은 가격 움직임에 따라 떠 있습니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
필터링이 가능한 이중 MA 교차를 사용하여 잘못된 신호를 피하면서 강력한 트렌드 움직임을 효과적으로 포착 할 수 있습니다.
확인 메커니즘은 가짜 탈출에 의해 위조되는 것을 방지합니다.
변동 ATR 스톱 로스는 수익을 극대화하면서 마이너 다운을 제한합니다.
최적화 가능한 매개 변수가 거의 없으며 구현하기가 쉽습니다.
암호화폐와 전통적인 자산을 포함한 모든 시장에 적용됩니다.
여러 가지 기술적인 견고성 지표를 결합합니다.
이 전략의 주요 위험은 다음과 같습니다.
범위에 제한된 기간 동안 MA가 자주 넘어가면 여러 손실이 발생할 수 있습니다.
부적절한 ATR 매개 변수 설정은 너무 넓거나 너무 좁은 정지로 이어질 수 있습니다.
큰 격차는 바로 정지로 이어질 수 있습니다.
엄청난 변동성을 유발하는 주요 뉴스 이벤트도 포지션을 중단 할 수 있습니다.
부적절한 MA 매개 변수는 트렌드를 놓치고 있거나 잘못된 신호가 너무 많을 수 있습니다.
최근 가격 변동은 ATR 정지를 쓸모 없게 만들 수 있습니다.
이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.
더 나은 조합을 찾기 위해 MA 매개 변수를 최적화하여 다른 기간과 가중 평균을 테스트합니다.
더 나은 정지 거리를 찾기 위해 다른 ATR 기간을 테스트하십시오.
신호 품질을 향상시키기 위해 부피 스파이크, 변동성 지표와 같은 추가 필터를 추가합니다.
트렌드 메트릭을 포함해서 불안한 시장에서 불황을 피하세요.
기계 학습 알고리즘을 추가하여 백테스팅을 통해 매개 변수를 자동으로 최적화합니다.
단기적인 소음을 피하기 위해 더 높은 시간 프레임에서 더 많은 확인을 찾으십시오.
수익성 있는 포지션을 확장하기 위해 단계적 수익을 취하는 규칙을 적용합니다.
이 전략은 견고한 트렌드 추적을 위해 이중 MA 교차, 트렌드 필터링, 확인 및 동적 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)