초월적 시간 프레임을 기반으로 한 추세 추종 전략


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

초월적 시간 프레임을 기반으로 한 추세 추종 전략

개요

이 전략의 핵심 아이디어는 여러 시간 프레임과 결합하여 시장의 추세를 식별하고, 상위 시간 프레임의 초과 지표를 필터로 사용하여 하위 시간 프레임에서 구매 및 판매 신호를 발송하는 것입니다. 이 전략은 상위 시간 프레임에서 제공되는 시장 구조 정보를 사용하여 거래 의사 결정의 질을 향상시키는 것을 목표로합니다.

전략 원칙

이 전략은 security 함수를 호출하여 상위 시간 프레임의 초과 지표값을 얻습니다. 초과 지표는 두 개의 라인: 초과 라인 및 트렌드 라인입니다. 초과 라인은 트렌드 라인의 위쪽에 있을 때 낙관적 인 신호이며, 아래에 있을 때 낙관적 인 신호입니다.

이 전략은 높은 시간 프레임의 오버 트렌드 방향을 필터링 조건으로 삼고, 낮은 시간 프레임의 오버 트렌드 방향이 높은 시간 프레임과 일치하는 경우에만 거래 신호를 발송합니다. 즉, 두 시간 프레임의 오버 트렌드 지표가 동방향 신호를 발송하는 경우에만 이 전략은 더 많이 또는 더 적게합니다.

이렇게 하면 낮은 시간 프레임 시장의 잡음에 방해받지 않고 신호의 신뢰성을 높일 수 있습니다. 동시에 높은 시간 프레임을 사용하여 시장 구조를 판단하고 올바른 전체 판단을 할 수 있습니다.

전략적 이점

  • 높은 시간 프레임에서 제공되는 시장 구조 정보를 활용하여 낮은 시간 프레임의 잡음을 필터링하여 거래 의사 결정의 질을 향상시킵니다.
  • 여러 시간 프레임 분석을 결합하여 거래 신호를 더욱 신뢰성있게 만듭니다.
  • 트렌드 이상 지표의 사용자 정의 변수, 구매 및 판매 전략을 최적화
  • 내장된 날짜 범위 설정으로 재검토의 시간 범위를 제한할 수 있습니다.

위험 분석

  • 높은 시간 프레임 신호가 지연되어 단선 기회를 놓칠 수 있습니다.
  • 높은 시간 프레임은 시장 구조를 판단하는 데 오류가 있을 가능성이 높습니다.
  • 트렌드 지표 자체도 잘못된 신호를 보낼 수 있습니다.
  • 탐지 시간 범위 제한은 중요한 데이터를 무시하여 테스트 결과의 정확성에 영향을 줄 수 있습니다.

해결책:

  • 신호 지연을 줄이기 위해 높은 시간 프레임 설정을 적절하게 조정
  • 다른 지표와 함께 높은 시간 프레임 구조 판단을 확인
  • 오버 트렌드 지표 매개 변수를 최적화하여 신호 품질을 향상시킵니다.
  • 단계적으로 재검토 시간 범위를 확장하여 테스트 전략의 안정성을 테스트합니다.

전략 최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 트렌드 지표 변수를 최적화하여 최적의 변수 조합을 찾습니다.
  2. 다른 지표를 추가하여 조합하여 다중 인자 모델을 형성합니다.
  3. 다른 높은 낮은 시간 프레임의 조합을 테스트합니다.
  4. 위험을 통제하기 위한 손해 방지 장치
  5. 기계 학습 알고리즘과 함께 하이퍼패러미터를 동적으로 조정합니다.

매개 변수 최적화, 조합 지표, 개선된 스톱로즈, 그리고 기계 학습을 도입하는 방법과 같은 방법을 통해 이 다중 시간 프레임 트렌드 추적 전략의 효과를 크게 향상시킬 수 있다.

요약하다

이 전략은 높은 시간 프레임의 트렌드 판단을 사용하여 낮은 시간 프레임의 거래 실행을 유도합니다. 이 다중 시간 프레임 디자인은 시장 소음을 효과적으로 필터링하여 더 명확한 트렌드 방향을 식별 할 수 있습니다. 또한 내장된 날짜 설정 기능은 회귀를 더 유연하게 만듭니다.

전략 소스 코드
/*backtest
start: 2023-02-14 00:00:00
end: 2024-02-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Higher TF - Repainting", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

HTFMultiplier = input(4, minval=1, step=1)

SupertrendMult = input(1)
SupertrendPd = input(4, minval=4, step=4)

backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30)
backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"])

repaintOption = input(title="Repaint", defval="Yes", options=["Yes", "No - set lookahead false", "No - do not use security"])

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_getBackTestTimeFrom(backtestFrom, backtestBars)=>
    byDate = backtestFrom == "days"
    byMonth = backtestFrom == "months"
    byYear = backtestFrom == "years"
    
    date = dayofmonth(timenow)
    mth = month(timenow)
    yr = year(timenow)
    
    leapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,29)
    nonleapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,28)
    
    restMonths = array.new_int(10,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,30)
    array.set(leapYearDaysInMonth,2,31)
    array.set(leapYearDaysInMonth,3,30)
    array.set(leapYearDaysInMonth,4,31)
    array.set(leapYearDaysInMonth,5,31)
    array.set(leapYearDaysInMonth,6,30)
    array.set(leapYearDaysInMonth,7,31)
    array.set(leapYearDaysInMonth,8,30)
    array.set(leapYearDaysInMonth,9,31)
    
    array.concat(leapYearDaysInMonth,restMonths)
    array.concat(nonleapYearDaysInMonth,restMonths)
    isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0)
    numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2)
    if(byDate)
        mth := (date - backtestBars) < 0 ? mth - 1 : mth
        yr := mth < 1 ? yr - 1 : yr
        mth := mth < 1 ? 1 : mth
        date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1
    if(byMonth)
        date := 1
        yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12)
        mth := mth - (backtestBars%12) + 1
    if(byYear)
        date := 1
        mth := 1
        yr := yr - backtestBars
    [date, mth, yr]


repaint = repaintOption == "Yes"
useSecurityLookahead = repaintOption == "No - set lookahead false"

[SupertrendRepaint, DirRepaint] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = true, gaps=true)
[SupertrendNoLookahead, DirNoLookahead] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = false, gaps=false)

[SupertrendRegular, DirRegular] = supertrend(SupertrendMult, SupertrendPd)

[date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars)
inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0)

longCondition = repaint ? DirRepaint == -1 : useSecurityLookahead? DirNoLookahead == -1 : DirRegular == -1
shortCondition = repaint ? DirRepaint == 1 : useSecurityLookahead? DirNoLookahead == 1 : DirRegular == 1
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange)
strategy.entry("Sell", strategy.short, when=shortCondition and inDateRange)