超越的な時間枠に基づくトレンドフォロー戦略


作成日: 2024-02-21 11:05:17 最終変更日: 2024-02-21 11:05:17
コピー: 0 クリック数: 690
1
フォロー
1617
フォロワー

超越的な時間枠に基づくトレンドフォロー戦略

概要

この戦略の核心的な考え方は,複数の時間枠を組み合わせて市場動向を識別し,高水準の時間枠の超越指標をフィルターとして使用し,低水準の時間枠で買入・販売の信号を発信することです.この戦略は,高水準の時間枠で提供される市場構造情報を活用して取引決定の質を向上させることを目的としています.

戦略原則

この策略は,security関数 を呼び出すことで,高級時間枠 (現在の時間枠の 4 倍をデフォルト) の超越指数値を取得する.超越指数は,超越線とトレンドラインの 2 つの線で構成されている.超越線がトレンドラインの上にあるときは看板信号であり,その下にある場合は下向き信号である.

この戦略は,高時間枠の超トレンドの方向をフィルター条件として使用し,低時間枠の超トレンドの方向が高時間枠と一致する場合にのみ取引信号を発信する.つまり,この戦略は,両時間枠の超トレンド指標が同方向の信号を発信する場合にのみ,多かれ少なかれ,空いている.

これにより,低時間枠市場の騒音による干渉を避け,信号の信頼性を高めることができる.また,高時間枠を利用して市場構造を判断し,正しい全体的な判断を行う.

戦略的優位性

  • 高い時間枠で提供される市場構造情報を活用し,低い時間枠のノイズをフィルターし,取引意思決定の質を向上させる
  • 複数のタイムフレームの分析を組み合わせることで,取引シグナルがより信頼性が高くなります.
  • オーバートレンド指標のパーメータをカスタマイズし,買い売り戦略を最適化
  • 日付範囲の設定が内蔵され,回測の時間範囲を制限します.

リスク分析

  • 高タイムフレームの信号が遅れて,短線のチャンスを逃す
  • 高時間枠で市場構造を判断する誤差の確率
  • 超トレンド指標自体が誤った信号を発している可能性があります.
  • 検出時間範囲の制限は,重要なデータを無視し,テスト結果の正確性に影響する

解決策は

  • 高時間枠の設定を適切に調整して,信号の遅延を減らす
  • 他の指標と組み合わせた高時間枠構造判断
  • 超トレンド指標のパラメータを最適化し,信号の質を向上させる
  • テスト戦略の安定性を検証する時間範囲を徐々に拡大する

戦略最適化の方向性

この戦略は以下の点で最適化できます.

  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)