이중 MA 중첩을 기반으로 한 적응형 백테스팅 시간 범위 선택 전략


생성 날짜: 2024-01-05 12:12:10 마지막으로 수정됨: 2024-01-05 12:12:10
복사: 0 클릭수: 589
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

이중 MA 중첩을 기반으로 한 적응형 백테스팅 시간 범위 선택 전략

개요

이 전략의 핵심 아이디어는 응답 시간 범위를 유연하게 선택할 수 있는 프레임 워크를 구현하는 것이며, 사용자가 다양한 요구에 따라 자동으로 또는 수동으로 응답 시작 시간을 설정할 수 있도록 합니다.

전략은 입력된 파라미터를 통해 4가지의 날짜 범위 선택 방법을 제공합니다. 전체 히스토리 데이터, 최근 지정된 날, 최근 지정된 주간 또는 수동으로 지정된 날짜 범위를 사용한다. 전략은 선택된 날짜 범위에 따라 역동적으로 재측정 창을 설정하며 거래 논리는 변하지 않고, 서로 다른 시간 창에서 전략의 성과에 대한 차이를 비교할 수 있다.

전략 원칙

이 전략은 재검토 날짜 범위 선택 모듈과 쌍 MA 거래 전략 모듈으로 구성된다.

탐지 날짜 범위 선택 모듈

  1. 4개의 날짜 범위 선택이 제공된다: 전체 역사 데이터 ((ALL), 최근 지정일 ((DAYS), 최근 지정주일 ((WEEKS), 수동 지정 날짜 범위 ((MANUAL) .
  2. 선택된 범위에 따라, 타임 변환 동적 설정을 통해 재측정 시작 및 종료 시간.
  3. 사용 시간 조건 window() 함수는 필터링 K 라인, 선택된 날짜 범위 내에서만 재검토한다.

쌍 MA 거래 전략 모듈

  1. 빠른 MA 기간 동안 fastMA, 기본 14; 느린 MA 기간 동안 slowMA, 기본 28 .
  2. 빠른 MA가 느린 MA를 통과하면 더 많이; 빠른 MA가 느린 MA를 통과하면 평지.
  3. MA의 곡선을 그려보세요.

전략적 강점 분석

  1. 다양한 실험 요구 사항을 충족하기 위해 제한없이 다양한 재검토 시간 범위를 유연하게 선택할 수 있습니다.
  2. 동일한 시간 범위에서 다른 주기 변수의 효과를 테스트할 수 있으며, 결과는 비교가 가능하다.
  3. 트레이딩 로직을 수정하는 것은 간단하며, 다른 전략의 틀로 사용될 수 있습니다.
  4. 이중MA 전략은 간단하고 이해하기 쉽고, 쉽게 접할 수 있습니다.

위험 분석 및 해결 방법

  1. 이중 MA 전략은 거칠고, 자주 거래하는 문제가 있다. 손해 막기 장치 등의 최적화를 고려할 수 있다.
  2. 수동으로 날짜 범위를 설정하는 것은 주의가 필요하며, 잘못된 날짜를 사용하지 않도록 해야 합니다.
  3. 전체 역사 회수 시간이 너무 길으면 테스트 주기가 늘어납니다. 슬라이드 포인트를 추가하거나 수수료를 줄이는 것이 고려될 수 있습니다.

전략 최적화 방향

  1. 상쇄 상쇄 논리 판단을 높이고 손실의 위험을 줄여줍니다.
  2. 주식 풀 필터링에 참여하여 지수 관련성이 높은 주식을 선택하여 안정성을 높입니다.
  3. 거래 신호의 필터를 늘리고, 일정한 주기에 불안정한 신호를 필터링하여 불필요한 거래를 줄인다.
  4. 다양한 분류 지수와 관련된 주식의 성과를 테스트하여 최적의 품종을 찾습니다.

요약하다

이 전략은 일반적인 재검사 날짜 범위 프레임워크로서 유연하고 사용자 정의 가능하며 사용자의 다양한 테스트 요구를 충족시킬 수 있습니다. 간단한 효과적인 쌍 MA 거래 논리와 함께 전략을 신속하게 검증하고 비교 할 수 있습니다. 이후 필터, 스톱 로직 등을 추가하여 전략을 최적화하여 실물 응용에 한 걸음 더 다가갈 수 있습니다.

전략 소스 코드
/*backtest
start: 2022-12-29 00:00:00
end: 2024-01-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title = "How To Auto Set Date Range", shorttitle = " ", overlay = true)

// Revision:        1
// Author:          @allanster 

// === INPUT MA ===
fastMA = input(defval = 14, title = "FastMA", type = input.integer, minval = 1, step = 1)
slowMA = input(defval = 28, title = "SlowMA", type = input.integer, minval = 1, step = 1)

// === INPUT BACKTEST RANGE ===
useRange     = input(defval = "WEEKS", title = "Date Range", type = input.string, confirm = false, options = ["ALL", "DAYS", "WEEKS", "MANUAL"])
nDaysOrWeeks = input(defval = 52, title = "# Days or Weeks", type = input.integer, minval = 1)
FromMonth    = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay      = input(defval = 15, title = "From Day", minval = 1, maxval = 31)
FromYear     = input(defval = 2019, title = "From Year", minval = 2014)
ToMonth      = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay        = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear       = input(defval = 9999, title = "To Year", minval = 2014)

// === FUNCTION EXAMPLE ===
window() => true

// === LOGIC ===
buy  = crossover(sma(close, fastMA), sma(close, slowMA))         // buy when fastMA crosses over slowMA
sell = crossunder(sma(close, fastMA), sma(close, slowMA))        // sell when fastMA crosses under slowMA

// === EXECUTION ===
strategy.entry("L", strategy.long, when=window() and buy)        // buy long when "within window of time" AND crossover
strategy.close("L", when=window() and sell)                      // sell long when "within window of time" AND crossunder         

// === PLOTTING ===
plot(sma(close, fastMA), title = 'FastMA', color = color.aqua, linewidth = 2, style = plot.style_line)    // plot FastMA
plot(sma(close, slowMA), title = 'SlowMA', color = color.yellow, linewidth = 2, style = plot.style_line)  // plot SlowMA