이 전략의 핵심 아이디어는 더 높은 시간 프레임에서 슈퍼 트렌드 지표를 필터로 사용하여 더 낮은 시간 프레임에서 구매 및 판매 신호를 생성하여 시장 추세를 식별하기 위해 여러 시간 프레임을 결합하는 것입니다. 더 높은 시간 프레임에서 제공되는 시장 구조 정보를 활용하여 거래 결정의 품질을 향상시키는 것을 목표로합니다.
이 전략은 보안 함수를 호출하여 더 높은 시간 프레임 (현행 시간 프레임의 기본 4x) 에서 슈퍼트렌드 지표 값을 검색합니다. 슈퍼트렌드 지표는 슈퍼트렌드 라인과 트렌드 라인 두 줄로 구성됩니다. 트렌드 라인의 위의 슈퍼트렌드 라인은 상승 신호이며 아래에 있는 것은 하락 신호입니다.
더 높은 시간 프레임에서 슈퍼 트렌드 지표의 방향은 필터 조건으로 작용합니다. 두 시간 프레임에서 슈퍼 트렌드의 방향이 정렬 될 때만 거래 신호가 생성됩니다. 즉 두 시간 프레임 모두 같은 방향으로 신호를 내렸을 때 신호가 유발됩니다.
이것은 더 짧은 시간 프레임에서 시장 소음의 간섭을 피하고 신호 신뢰성을 향상시킵니다. 또한 더 높은 시간 프레임 시장 구조를 사용하여 올바른 전반적인 판단을 할 수 있습니다.
해결책:
이 전략은 여러 분야에서 개선될 수 있습니다.
매개 변수 최적화, 지표 결합, 스톱 손실 개선 및 기계 학습을 도입함으로써 이 다시간 프레임 트렌드 추적 전략의 상당한 성능 향상을 달성할 수 있습니다.
이 전략은 더 낮은 시간 프레임에서 거래 실행을 안내하기 위해 더 높은 시간 프레임 트렌드 판단을 현명하게 활용합니다. 이러한 멀티 타임 프레임 디자인은 시장 소음을 효과적으로 필터링하고 더 명확한 트렌드 방향을 식별 할 수 있습니다. 내장된 날짜 설정은 또한 백테스팅을 더 유연하게 만듭니다. 전반적으로 이것은 추가 연구와 응용을받을 가치가있는 잘 설계된 멀티 타임 프레임 트렌드 추적 전략입니다.
/*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)