複数のテクニカル指標によるダイナミックストップロス先物取引戦略

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
作成日: 2025-04-02 09:41:48 最終変更日: 2025-04-02 09:41:48
コピー: 0 クリック数: 381
2
フォロー
319
フォロワー

複数のテクニカル指標によるダイナミックストップロス先物取引戦略 複数のテクニカル指標によるダイナミックストップロス先物取引戦略

戦略概要

この戦略は,複数の技術条件とより高い時間枠分析を組み合わせて,高確率の取引機会を識別する高度な先物取引システムである.この戦略は,複数の技術条件を同時に満たす必要性のある複数の技術条件の組み合わせに基づいたアプローチを採用し,取引に入る必要があります.これは,公正価値のギャップ (FVG),オーダーブロック (Order Blocks),流動性のスキャン (Liquidity Sweeps) および構造の突破 (BOS) 信号を含むいくつかの高度な技術概念を統合し,異なる時間周期の指標を利用してトレンドの方向を確認します.

戦略原則

この戦略の核心は,複数の指標が同時にシグナルを与える場合にのみ取引を確実にするために,複数の技術分析方法の組み合わせを使用することです.具体的には,戦略には以下のいくつかの重要な構成要素が含まれています.

  1. 公正価値のギャップ (FVG)- 2つのの間に有意な価格格差がある場合,市場には未埋めのスペースがある可能性を示唆する.
  2. 注文ブロック- これらは,価格が反転する重要な領域であり,通常,強い拒絶として表され,その後サポートまたはレジスタンス領域になります.
  3. 流動性スキャン- 市場が前期的な高点や低点を破った後すぐに逆転した状況を認識する.これは通常,大手機関が流動性を集めていることを示している.
  4. 構造突破 (BOS)- 価格が前期構造を突破し,より高い高点またはより低い低点を形成すると発生する.
  5. 高周期トレンド確認- 15分と60分周期のEMA (指数移動平均) を利用して,全体的なトレンド方向を確認する.

策略は,少なくとも2つの基本条件 (デビューモードでは1つ) と構造突破信号が加えられ,さらに高時間の周期の傾向と一致している場合にのみ入場信号を生成する.

リスク管理の面では,この戦略はATR (平均リアル波幅) を使用して,動的ストップポジションを設定し,ストップ距離は通常ATRの1.5倍である.この方法は,高い波動時にストップ距離を増加させ,低い波動時にストップ距離を減少させ,ストップをよりスマートにします.

利回り終了の際には,戦略は,分期利回り方法を採用し,リスク等価 ((1R) の利回りに達したときに50%のポジションを利回りし,残りのポジションのストップを本金ポジションに移動させ,無リスクの取引の機会を創出する.また,時間ベースの退出メカニズムがあり,指定された時間 ((デフォルト30分) の間に取引が有利な方向に移動しなかった場合,自動的に閉鎖されます.

さらに,この戦略には,アカウントの収益が既定の目標 (<3000ドル) に達したときに,または尾行ストップを誘発したときに,すべてのポジションを自動的に退出するアカウント管理機能が含まれています (<2500ドルを超えるアカウントの収益が追跡開始).

戦略的優位性

このコードの詳細を分析した結果,以下のような明らかな利点が挙げられます.

  1. 多重認証システム- 複数の技術条件を同時に満たすことで,偽信号の減少と取引の質の向上を可能にします.
  2. スマートリスク管理- ATRベースのダイナミックストップを使用し,固定ポイントまたはパーセンテージストップよりも市場の変動に適応します.
  3. 高時間周期のトレンドフィルター- トレンドの方向を利用し,トレンドの方向のみで取引し,逆向きの取引を避ける.
  4. 分割された収益戦略- 利潤の分割と,本金ポジションへの停止の移動により,利潤の部分的なロックが保証され,残りのポジションにリスクのない機会が提供されます.
  5. タイムベース退出メカニズム- 無効取引から自動で退出し,資金が長期間,無動力取引に閉じ込められることを避ける.
  6. 全体のアカウント管理- 利潤目標と尾行停止を設定し,全体的な口座利潤を保護し,健全な資金管理を実現する.
  7. 適応性が高い- 多数のパラメータにより高度な柔軟性を提供し,異なる市場状況と取引スタイルに合わせて調整できます.
  8. 専門技術指標の統合- 多くの高度な技術分析の概念を組み合わせて,通常は専門的なトレーダーだけが使用します.

戦略リスク

この戦略の設計は精巧ですが,いくつかの潜在的リスクがあります.

  1. パラメータ最適化のリスク- 戦略は複数のパラメータ設定に依存し,過度な最適化が過度なフィットにつながると,将来の市場条件で不良なパフォーマンスを発揮します. 解決策は,十分な長さのテストサイクルを使用し,前向きなテストを行うことです.
  2. 市場環境への依存- この戦略は,トレンド市場ではうまく機能するかもしれませんが,区間振動市場ではより多くの偽信号を生成する可能性があります. 解決策は,市場環境フィルターを追加し,振動市場として認識されたときに取引頻度を調整するか,完全に取引を停止することです.
  3. 実行する スライドポイントのリスク- 波動性が高い期間に,入場・出場価格が予想より大きく異なる可能性があり,戦略のパフォーマンスに影響する. 解決策は,リターンで実際の滑り点を模倣し,実際の取引で市場価格の代わりに制限価格の請求書を使用することです.
  4. 技術的な障害のリスク- 自動取引システムは技術障害やネットワークの障害に直面する可能性があります. 解決策は,バックアップシステムと手動介入の仕組みを構築することです.
  5. 複雑性管理- 戦略の複雑さは,問題を診断したり,特定の取引が失敗した理由を理解するのが困難になる可能性があります. 解決策は,詳細な取引記録を維持し,定期的に戦略のパフォーマンスを分析することです.
  6. 市場流動性のリスク- 特定の市場条件では,重要なニュースリリースの前後に流動性が急速に低下し,より大きな滑落やポジションの退出ができない可能性があります. 解決策は,重要な経済データ発表の時期に取引を避けるか,またはこれらの時期にポジションの規模を減らすことです.

戦略最適化の方向性

コード分析から,いくつかの潜在的な最適化方向が示されています.

  1. トレンド認識の強化- 現在の戦略は,トレンドを特定するために単純なEMA交差を使用し,トレンドの強さを確認するためにADX (平均方向指数) のような他のトレンド指標を追加することを考慮することができます. 強いトレンドの市場は通常より良い取引機会を提供します.
  2. 市場の状況に適応- 市場状態の識別メカニズムを追加し,異なる市場環境 (トレンド,区間,高波動,低波動) で戦略パラメータを自動的に調整します. これにより,戦略は,異なる市場条件に適応してより柔軟になります.
  3. 入学タイミングを最適化- RSIやランダムな指標のような動量指標を追加することを検討し,トレンドの方向に入るときに,過剰な買い過ぎや売り過ぎの入場を避けるようにしてください.
  4. 収益戦略の改善- 現時点の固定1R利益は,保守的すぎたり,過激すぎたりする可能性があるため,変動性やサポート/レジスタンスレベルに基づいて利益目標の動的調整を考慮し,変動性が大きい場合,より遠い目標を設定する.
  5. リスク管理の詳細化- 動的なポジションサイズ調整メカニズムを導入し,近年の戦略的パフォーマンスと市場の変動に応じてリスクフローチャーを自動的に調整し,戦略が良好なパフォーマンスを示すとリスクを増やし,不良なパフォーマンスを示すとリスクを下げます.
  6. 日時フィルターを追加する- 期貨市場には異なる時間帯で異なる特性があり,時間フィルターを追加することで,流動性の低いまたは方向性のない時間帯を回避できます.
  7. 市場情緒指標を統合する- VIXなどの市場情緒指標を追加し,極端な情緒で戦略パラメータを調整するか,取引を一時停止する.
  8. コード効率を最適化する- 現在のコードには,実行効率に影響を及ぼす可能性があるいくつかのループがあります.特に,より小さな時間枠で. これらのループを最適化すると,戦略の応答速度が向上します.

要約する

これは,高度な技術分析の概念を融合し,リスク管理と資金管理の機能を完備した,精巧に設計された多指標期貨取引戦略である.それは,複数の条件を同時に満たし,高時間周期のトレンドを確認することを要求することによって,偽信号を軽減し,ATRベースのダイナミックな止損と分期利益戦略を使用してリスクリターンを最適化します.

この戦略の主要な優点は,多層の確認システムとスマートなリスク管理により,低リスクを維持しながら,高確率の取引機会を捉えることができることです.しかしながら,戦略の複雑さは,パラメータの最適化と市場の適応性の課題をもたらし,継続的な監視と定期的な調整によって有効性を維持する必要があります.

この戦略は,特に市場状況への適応力を強化し,リスク管理システムを改善することで,推奨された最適化措置を実行することにより,異なる市場環境で安定したパフォーマンスを維持する可能性を秘めています.全体的に,これは経験豊富なトレーダーが使用するのに適した高度な戦略であり,適切な監視と調整により,取引システムにおける強力なツールになる可能性があります.

ストラテジーソースコード
/*backtest
start: 2024-04-02 00:00:00
end: 2025-04-01 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)

// ==========================================
// Parameters
// ==========================================

// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650

// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)

// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")

// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")

// ==========================================
// Indicators & Calculations
// ==========================================

// ATR Calculation
atr = ta.atr(atrLength)

// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)

// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50

// ==========================================
// Entry Conditions
// ==========================================

// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false

for i = 1 to fvgLength
    if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
        bullishFVG := true
    if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
        bearishFVG := true

// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false

for i = 1 to fvgLength
    if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
        inverseBullishFVG := true
    if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
        inverseBearishFVG := true

// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false

for i = 1 to obLength
    if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
        bullishOrderBlock := true
    if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
        bearishOrderBlock := true

// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false

lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)

if low[1] < lowestLow[2] and close > open
    bullishSweep := true
if high[1] > highestHigh[2] and close < open
    bearishSweep := true

// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false

prevHigh = high[2]
prevLow = low[2]

if high > prevHigh and low[1] < low[2]
    bullishBOS := true
if low < prevLow and high[1] > high[2]
    bearishBOS := true

// Simpler version for debug mode
if debugMode
    bullishBOS := close > open and close > close[1]
    bearishBOS := close < open and close < close[1]

// ==========================================
// Signal Generation
// ==========================================

// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)

bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)

// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)

// Debug mode override for testing
if debugMode
    longSignal := longSignal or (bullishBOS and htf1_bullish)
    shortSignal := shortSignal or (bearishBOS and htf1_bearish)

// ==========================================
// Risk Management
// ==========================================

// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier

// Default fixed values for testing
if debugMode
    longStopDistance := close * 0.01  // 1% stop
    shortStopDistance := close * 0.01  // 1% stop

// Calculate position size based on risk
nqPointValue = 20  // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))

// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)

// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize

// ==========================================
// Strategy Execution
// ==========================================

// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false

longEnteredThisBar := false
shortEnteredThisBar := false

// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
    strategy.close_all()
    strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEnteredThisBar := true
    entryTime := time

if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
    strategy.close_all()
    strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEnteredThisBar := true
    entryTime := time

// Take profit and stop loss orders
if strategy.position_size > 0
    stopPrice = strategy.position_avg_price - longStopDistance
    takeProfitPrice1 = strategy.position_avg_price + longStopDistance
    strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if high >= takeProfitPrice1
        strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)

if strategy.position_size < 0
    stopPrice = strategy.position_avg_price + shortStopDistance
    takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
    strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if low <= takeProfitPrice1
        strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)

// Time-based exit
if strategy.position_size != 0
    currentTime = time
    if (currentTime - entryTime) >= timeoutPeriod * 60000  // Convert minutes to milliseconds
        strategy.close_all(comment="Time Exit")

// ==========================================
// Trailing Stop for Account Management
// ==========================================

// Update equity curve
equityCurve := strategy.equity

// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
    strategy.close_all(comment="Profit Goal")

if strategy.equity >= accountSize + trailingThreshold
    trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
    if strategy.equity <= trailingStop
        strategy.close_all(comment="Trailing Stop")

// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
    strategy.close_all(comment="Stop Trailing")

// ==========================================
// Plotting
// ==========================================

// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)

// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")