리소스 로딩... 로딩...

슈퍼트렌드 기반의 멀티타임프레임 트렌드 추적 전략

저자:차오장, 날짜: 2024-02-21 11:05:17
태그:

img

전반적인 설명

이 전략의 핵심 아이디어는 더 높은 시간 프레임에서 슈퍼 트렌드 지표를 필터로 사용하여 더 낮은 시간 프레임에서 구매 및 판매 신호를 생성하여 시장 추세를 식별하기 위해 여러 시간 프레임을 결합하는 것입니다. 더 높은 시간 프레임에서 제공되는 시장 구조 정보를 활용하여 거래 결정의 품질을 향상시키는 것을 목표로합니다.

전략 논리

이 전략은 보안 함수를 호출하여 더 높은 시간 프레임 (현행 시간 프레임의 기본 4x) 에서 슈퍼트렌드 지표 값을 검색합니다. 슈퍼트렌드 지표는 슈퍼트렌드 라인과 트렌드 라인 두 줄로 구성됩니다. 트렌드 라인의 위의 슈퍼트렌드 라인은 상승 신호이며 아래에 있는 것은 하락 신호입니다.

더 높은 시간 프레임에서 슈퍼 트렌드 지표의 방향은 필터 조건으로 작용합니다. 두 시간 프레임에서 슈퍼 트렌드의 방향이 정렬 될 때만 거래 신호가 생성됩니다. 즉 두 시간 프레임 모두 같은 방향으로 신호를 내렸을 때 신호가 유발됩니다.

이것은 더 짧은 시간 프레임에서 시장 소음의 간섭을 피하고 신호 신뢰성을 향상시킵니다. 또한 더 높은 시간 프레임 시장 구조를 사용하여 올바른 전반적인 판단을 할 수 있습니다.

장점

  • 더 높은 tf에서 시장 구조 정보를 사용하여 낮은 시간 프레임에서 소음을 필터
  • 여러 시간 프레임 분석을 결합하여 더 신뢰할 수 있는 신호
  • 전략 최적화를 위한 사용자 정의 가능한 슈퍼트렌드 매개 변수
  • 백테스트 기간을 제한하기 위한 내장 날짜 범위 설정

위험 분석

  • 더 높은 시간 프레임에서 지연 신호는 단기 기회를 놓칠 수 있습니다.
  • 더 긴 시간 프레임 시장 구조 판단의 부정확성
  • 슈퍼트렌드 자체로부터의 잠재적 오류 신호
  • 백테스트 날짜 제한은 중요한 데이터를 생략하고 결과 정확성에 영향을 줄 수 있습니다.

해결책:

  • 신호 지연을 줄이기 위해 더 높은 시간 프레임 설정을 정렬
  • 더 높은 시간 프레임 판단을 확인하기 위해 다른 지표를 추가하십시오.
  • 신호 품질을 향상시키기 위해 슈퍼트렌드 매개 변수를 최적화
  • 안정성 테스트를 위해 백테스트 기간을 점차 확장하십시오.

최적화 방향

이 전략은 여러 분야에서 개선될 수 있습니다.

  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)


더 많은