SuperTrend ダイナミック ストップ プロフィットおよび時間フィルター戦略: ボラティリティ適応型定量取引システム

supertrend ATR MSK 动态止盈 时间过滤器 价格过滤器 趋势跟踪 波动率自适应
作成日: 2025-03-26 13:12:56 最終変更日: 2025-03-26 13:12:56
コピー: 0 クリック数: 425
2
フォロー
319
フォロワー

SuperTrend ダイナミック ストップ プロフィットおよび時間フィルター戦略: ボラティリティ適応型定量取引システム SuperTrend ダイナミック ストップ プロフィットおよび時間フィルター戦略: ボラティリティ適応型定量取引システム

概要

SuperTrendダイナミックストップとタイムフィルター戦略は,変動率自適応に基づく定量取引システムであり,その核心は,ダイナミックストップの追跡ツールとしてSuperTrend指数に依存する.この戦略は,価格がSuperTrend指標ラインを突破した瞬間を識別することによって,市場トレンドを捉え,モスクワ時間 (MSK) フィルター,価格レベルフィルター,固定パーセントストップ機能を含む複数のフィルタリングメカニズムを組み合わせている.このシステムは,単独で多頭または空頭の両方を取引できる多機能モードに設計されている.

戦略原則

この戦略の核となる仕組みは以下の通りです.

  1. スーパートレンド指数の計算策略:ATR指標 ((デフォルト周期23) と倍数因子 ((デフォルト1.8) を使用して,市場変動に応じて自動的に位置を調整し,ダイナミックなサポートとレジスタンスを形成するスーパートレンドラインを計算します.

  2. 取引シグナル生成

    • 多頭入場シグナル:閉盤価格がスーパートレンド線を上方に突破したときに発動する (Dir値は正から負に変化する) そして時間と価格のフィルタリング条件を満たす.
    • 空頭入場シグナル:閉盘価格がスーパートレンド線を下回る (Dir値がマイナスから正に変化する) とフィルター条件を満たすときにトリガーされる.
  3. 取引方法の選択戦略は以下の3つの取引モデルを提供します.

    • 複数頭のみ ((Long Only):複数頭のみの取引を行い,空頭シグナルがあれば平仓する.
    • 空頭のみ ((Short Only):空頭のみの取引を行い,多頭シグナルがあれば平仓する.
    • 双方向 ((Both):多空双方向取引を行うことを許可する.
  4. 複数のフィルタリングシステム

    • モスクワ時間フィルター ((MSK,UTC+3)):特定の取引時間を設定し,その間にのみ取引を行うことを許可する.
    • 価格レベルフィルター:価格の値が設定され,価格が値より高い場合にのみ多頭を実行し,値より低い場合に空頭を実行する.
  5. ダイナミック・ストップ・メカニズム: 戦略は入場価格に基づく固定パーセントのストップを実現します (デフォルト1.5%),価格がストップレベルに達すると,戦略は自動的に平仓し,利益をロックします.ストップレベルはグラフで直観的に表示され,ユーザーは必要に応じてこの可視化機能をオンまたはオフにすることができます.

戦略的優位性

このコードを詳しく分析した結果,以下の重要な利点が明らかになりました.

  1. 波動率の自律性:スーパートレンド指標はATR計算に基づいています.市場変動状況に応じて追跡距離を自動的に調整でき,高波動市場では保護距離を増加させ,低波動市場ではより密接に価格を追跡し,異なる市場環境への戦略の適応性を向上させます.

  2. 多重リスク制御戦略は,時間フィルター,価格フィルター,ストップセットの3層のリスク管理を統合し,この多次元リスク制御メカニズムが取引の安全性を大幅に向上させました.

  3. 柔軟な取引方向: 多頭,空頭,または双方向取引の選択により,異なる市場好みや取引制限に対応できる.

  4. タイム・インテリジェンス・最適化独特のモスクワ時間フィルターは,特定の時間帯で取引を許可し,市場の低効率な時間を回避し,高効率の取引ウィンドウをターゲットに捉え,特に国際取引時間を考慮する必要があるトレーダーに適しています.

  5. ビジュアライゼーションの利点背景の色変化,スーパートレンドの線色,止まりの水平標識により,直感的な視覚的取引参照を提供し,分析の複雑さを軽減します.

  6. コミッション最適化デザイン: 戦略内置手数料を考慮して ((0.06%)),反測結果を実際の取引環境に近いものにします。

  7. 終止価格執行機構: 策略は,閉盘価格実行命令 ((process_orders_on_close=true) を採用し,滑点の影響を軽減し,反測の信頼性を向上させる.

戦略リスク

この戦略の設計は精巧ですが,以下の潜在的なリスクがあります.

  1. トレンドの逆転が遅れた:スーパートレンド指数は本質的に遅滞指数であり,市場が急激に逆転すると遅延信号が生じ,入場や出場が遅れて引き戻しのリスクが増加する. 解決策は,ATR周期と倍数因子を調整して,感度と安定性をバランスさせることである.

  2. 固定停止制限: 固定パーセントストップを使用すると,利益が早めにロックされ,強いトレンドでより多くの利益が失われる可能性があります. 市場変動の動向に応じてストップパーセントを調整するか,他の技術指標と組み合わせてストップ戦略を最適化することをお勧めします.

  3. パラメータ感度戦略のパフォーマンスは,パラメータ設定 (ATR周期,倍数因数,停止比率など) に高度に依存し,不適切なパラメータは,過度取引または信号ミスを引き起こす可能性があります.

  4. フィルタを過度に制限する厳格な時間と価格のフィルタリングは有効な取引機会を逃す可能性があります.実際の取引品種と市場の特徴に応じてフィルタリング条件を調整することをお勧めします.

  5. 市場条件に依存する: この戦略は,傾向が明らかな市場では優れているが,揺れ動いている市場では頻繁に偽信号を生成する可能性がある. 市場状態識別機構を追加することを検討し,トレンド市場でのみ戦略を有効にする.

  6. リスクの抑制の欠如: 超トレンドは動的ストップ・レファレンスとして使用できるが,コードでは明示的にストップ・条件が設定されていないため,極端な市場条件下では大きな損失に直面する可能性がある. 硬直したストップ・メカニズムを追加することを推奨する.

戦略最適化の方向性

プログラミングの分析から,私は以下の最適化方向を提案します.

  1. ダイナミックなパラメータは自律的に: 市場の状況 (変動性,取引量など) に応じて,スーパートレンドのATR周期と倍数因子を自動的に調整する関数を書くことが可能であり,戦略の適応性を向上させる.こうすることで,異なる市場段階において最適なパラメータの組み合わせを自動的に見つけることができる.

  2. 複数のタイムサイクルを確認: 複数のタイムサイクル確認機構を導入し,より大きなタイムサイクルと現在のタイムサイクルSuperTrendの方向が一致するときにのみ取引を実行し,偽信号を減らす.これは信号の質を大幅に向上させる.

  3. スマート・ストップシステム固定パーセンテージストップをATRベースのダイナミックストップまたは区切りストップに変更する (一部のポジションは低い目標で利益を得,一部のポジションはより大きな利益を求め),資金管理戦略を最適化する.

  4. 市場状態の識別傾向強度指数 (ADXのような) または波動率指数を増やす. 特定の条件を満たした市場でのみ取引を実行し,低効率な市場環境での取引を避ける.

  5. リスク管理の強化: 取引毎のリスク制限とアカウントリスク管理のロジックを追加し,単一のリスクと全体的なリスクを制御範囲で確保する.

  6. 多指標融合: 他の技術指標 (MACD,RSI,ブリン帯など) と組み合わせて,多指標共鳴時にのみ取引を実行し,信号の信頼性を向上させる.

  7. 取引量は論理に適応する:市場の流動性や波動性の動向に応じて取引規模を調整し,波動が大きいときにポジションを減らす,安定した傾向ではポジションを増やす.

  8. 回測周期の拡張: 市場サイクルや条件の異なる状況で広範な反省を行い,様々な市場環境で戦略が安定していることを確認する.

要約する

SuperTrendダイナミックストップとタイムフィルター戦略は,技術分析とリスク管理を組み合わせた総合的な量化取引システムである.それは,SuperTrend指標を通してトレンドを捉え,複数のフィルタリング機構を利用して信号の質を向上させる.戦略の主要な優点は,波動率の自律性と多層のリスク制御であり,潜在的リスクは,主に指標の遅れとパラメータの感受性から生じる.

ダイナミックパラメータ調整,多周期確認,インテリジェントストップシステムなどの推奨された最適化措置を適用することで,この戦略の適応性と収益性をさらに向上させることができます.最も重要なのは,トレーダーは,この戦略の設計原理と限界を理解し,自身のリスク好みと市場の認識を組み合わせて,パラメータを個別的に調整して,最適な取引効果を達成することです.

全体として,これは明快で論理的な取引戦略であり,高い実用価値とカスタマイズの可能性があり,取引経験のある定量投資家が使用するのに適しています.

ストラテジーソースコード
/*backtest
start: 2024-03-26 00:00:00
end: 2024-07-11 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Supertrend Fixed TP Unified with Time Filter (MSK)", overlay=true,
     default_qty_value=0.01,
     commission_type=strategy.commission.percent,
     commission_value=0.06,
     pyramiding=0,
     process_orders_on_close=true)

// Настройки индикатора
atrPeriod = input(23, "ATR Length")
factor = input.float(1.8, "Factor", step=0.1, minval=0.1)
tradeMode = input.string("Both", "Trade Mode", options=["Long Only", "Short Only", "Both"])

// Общий параметр тейк-профита
takeProfitPercent = input.float(1.5, "Take Profit (%)", minval=0.01)
showTP = input.bool(true, "▲▼ Показывать ТП") // Добавлен переключатель

// Фильтр цены
price_param = input.float(10000.0, "Цена фильтра", step=1.0)
use_price_filter = input.bool(false, "Использовать фильтр цены")

// Фильтр по времени (Московское время)
useTimeFilter = input.bool(true, "▲▼ Использовать фильтр по времени") // Переключатель фильтра времени
timeFrom = input.int(0, "Время С (часы MSK)", minval=0, maxval=23, step=1)
timeTo = input.int(23, "Время ДО (часы MSK)", minval=0, maxval=23, step=1)

// Функция проверки времени (с учетом Московского времени UTC+3)
isTimeInRange() =>
    if not useTimeFilter
        true // Фильтр отключен
    else
        // Переводим время сервера (UTC) в Московское время (UTC+3)
        mskHour = (hour(time) + 3) % 24 // Добавляем 3 часа для MSK
        if timeFrom <= timeTo
            mskHour >= timeFrom and mskHour < timeTo // До timeTo (не включая timeTo)
        else
            mskHour >= timeFrom or mskHour < timeTo // До timeTo (не включая timeTo)

// Расчет Supertrend
[supertrend, dir] = ta.supertrend(factor, atrPeriod)

// Визуализация Supertrend
plot(supertrend, "Supertrend", 
     color = dir < 0 ? color.green : color.red,
     linewidth = 2,
     style = plot.style_linebr)

bgcolor(dir < 0 ? color.new(color.green, 90) : color.new(color.red, 90))

// Сигналы входа с фильтром по времени
longEntry = (dir < 0 and dir[1] > 0) and (use_price_filter ? close > price_param : true) and isTimeInRange()
shortEntry = (dir > 0 and dir[1] < 0) and (use_price_filter ? close < price_param : true) and isTimeInRange()

// Логика стратегии
if tradeMode == "Both"
    if longEntry
        strategy.close("Short", comment="Close Short")
        strategy.entry("Long", strategy.long)
    if shortEntry
        strategy.close("Long", comment="Close Long")
        strategy.entry("Short", strategy.short)
else if tradeMode == "Long Only"
    if longEntry
        strategy.entry("Long", strategy.long)
    if shortEntry
        strategy.close("Long", comment="Close Long")
else if tradeMode == "Short Only"
    if shortEntry
        strategy.entry("Short", strategy.short)
    if longEntry
        strategy.close("Short", comment="Close Short")

// Управление тейк-профитом
var color tpColor = na
var float tpLevel = na
var label tpLabel = na

// Сброс при закрытии позиции
if strategy.position_size == 0 and strategy.position_size[1] != 0
    tpLevel := na
    tpColor := na
    label.delete(tpLabel)
    tpLabel := na

// Обновление ТП при открытии позиции
if strategy.position_size > 0
    entryPrice = strategy.opentrades.entry_price(0)
    tpLevel := entryPrice * (1 + takeProfitPercent/100)
    tpColor := color.green
    // Закрытие лонга по TP на закрытии бара
    if close >= tpLevel
        strategy.close("Long", comment="TP Long")
    // Обновление метки
    if showTP
        label.delete(tpLabel)
        tpLabel := label.new(
             bar_index, tpLevel, 
             text = str.tostring(tpLevel, "#.##"), 
             color = color.green, 
             textcolor = color.white,
             style = label.style_label_down,
             yloc = yloc.price)
    
if strategy.position_size < 0
    entryPrice = strategy.opentrades.entry_price(0)
    tpLevel := entryPrice * (1 - takeProfitPercent/100)
    tpColor := color.red
    // Закрытие шорта по TP на закрытии бара
    if close <= tpLevel
        strategy.close("Short", comment="TP Short")
    // Обновление метки
    if showTP
        label.delete(tpLabel)
        tpLabel := label.new(
             bar_index, tpLevel, 
             text = str.tostring(tpLevel, "#.##"), 
             color = color.red, 
             textcolor = color.white,
             style = label.style_label_up,
             yloc = yloc.price)

// Визуализация ТП
plot(showTP ? tpLevel : na, "Take Profit", 
     color = tpColor,
     linewidth = 1,
     style = plot.style_circles)

// Обновление позиции метки
if showTP and not na(tpLevel)
    label.set_xy(tpLabel, bar_index, tpLevel)