多層価格構造識別と公正価値ギャップ定量取引システム

CHoCH FVG Pivot Points Risk-Reward Ratio Price Structure SWING POINTS Quantitative Trading
作成日: 2025-06-03 10:50:29 最終変更日: 2025-06-03 10:50:29
コピー: 0 クリック数: 347
2
フォロー
319
フォロワー

多層価格構造識別と公正価値ギャップ定量取引システム 多層価格構造識別と公正価値ギャップ定量取引システム

概要

多層の価格構造識別と公正価値ギャップ量化取引システムは,価格行動に基づく自動取引戦略であり,この戦略は2つの重要な取引コンセプト:変化特征 (CHoCH,Change of Character) と公正価値ギャップ (FVG,Fair Value Gap) を組み合わせている.この戦略は,市場構造の変化点と不均衡領域を識別することによって,高確率の取引機会を捉え,価格が公正価値ギャップに戻ったときに入場し,正確な入場と出場の制御を実現する.この体系化されたアプローチは,トレーダーに市場を客観的に分析し,感情を排除し,明確なリスク管理ルールを持つことを可能にします.

戦略原則

量子取引システムは,以下のコア原理に基づいて動作します.

  1. 価格構造の識別: 波峰波谷 (Pivot Points) 技術を介して,市場における振動高点と振動低点を識別し,これらのポイントは市場構造の重要な構成要素である.システムは,パラメータ化された振動長さを (デフォルト5サイクル) を使用して,これらの重要なポイントを決定する.

  2. 変化特征 ((CHoCH) 検出:

    • 多頭CHoCH: 価格が前回の波動高を突破し,低下の低点を形成する
    • 空頭CHoCH:価格が上位高を形成した後,前回の変動低値を突破する システムは,CHoCHの形成の時間間隔が最小距離要求を満たすように要求し (デフォルトは10周期),無効信号をフィルターします.
  3. 公正価値のギャップ (FVG) の識別:

    • 多頭FVG:現在のの低点は前2周期の高点より高い
    • 空頭FVG:現在のの高点は前2周期の低点より低い システムは最小のFVGサイズの値 (デフォルトは2点) を設定し,意味のある価格不均衡のみを捕捉することを保証しています.
  4. 入力論理:

    • 多頭入場:多頭CHoCHが確認された後,多頭FVG領域まで価格の引き戻しを待つ
    • 空飛入場:空飛CHoCHが確認された後,空飛FVG領域へ戻るのを待つ 入場料は,FVGエリアのミドルポイントに設定され,バランスのとれた入場料を提供します.
  5. リスク管理機構:

    • ストップダストは,最近の振動低点 (多頭) または振動高点 (空頭) に設定されます.
    • リスク・リターン比率 (デフォルト2.0) または固定目標ポイントに基づくストップ
    • 選択可能なポジションの自動調整機能,口座のリスクパーセントとストップダストによるポジションサイズ計算

戦略的優位性

この戦略は,コードの詳細な分析の結果,以下の顕著な利点があることが判明しました.

  1. 構造化された市場分析: 戦略は,価格構造の変化と市場不均衡の原理に基づいて,単純な指標の交差ではなく,市場転換点を識別する上でユニークな優位性を持つようにする.

  2. 正確な入学時間:CHoCHの後にFVGが形成されるのを待つことで,戦略は有利な価格レベルで入場することができ,高殺低を追求することを避け,入場品質を向上させることができる.

  3. リスク管理に適応する戦略: 固定ポイントではなく,実際の市場構造に基づいて自動でストップポジションを調整する.この方法は,市場の実際の波動的特性に適しています.

  4. 取引要素を視覚化する戦略は,CHoCHタグ,FVGボックス,振動点,取引ラインを含む完全な可視化機能を提供し,トレーダーに市場構造と戦略の論理を直視的に理解できるようにします.

  5. 柔軟なポジション管理: ポジションの大きさをリスクパーセントで自動調整し,口座の資金を保護し,波動性に応じてリスクを自動的に調整できます.

  6. 性能最適化デザイン: コードには,古いFVGボックスをクリアするメカニズムが含まれています. 長時間稼働するとシステムの性能が低下しないようにします.

  7. 総合的なパフォーマンスモニタリング: 戦略は,戦略の状況,勝利率,利益因子などの重要な指標を含むリアルタイムパフォーマンス表を提供し,トレーダーが戦略のパフォーマンスを評価することを容易にします.

戦略リスク

この戦略は合理的に設計されていますが,いくつかの潜在的なリスクと限界があります.

  1. 偽の突破の危険性:CHoCHシグナルは偽のブレイクになり,価格が迅速に引き下がり,ストップを触発する.このリスクを緩和するために,ドーガンK線がブレイクを確認するのを待つような確認メカニズムを追加することを検討することができます.

  2. ギャップリスク: 波動性のある市場や夜間取引では,価格が止損位置を超えて飛躍し,予想以上の実際の損失を引き起こす可能性があります. 保証ストップ・オーダー (可能な場合) を使用するか,ポジションの規模を減らすことをお勧めします.

  3. パラメータ感度戦略の性能は,振動長さ,最小CHoCH距離,FVGサイズなどのパラメータの設定に大きく依存しています. 異なる市場と時間枠では異なるパラメータの組み合わせが必要であり,全面的な反射最適化が推奨されています.

  4. 市場環境への依存: この戦略は,トレンド市場ではよりよく動作し,市場を整理すると頻繁に誤信号が生じることがあります. トレンドフィルターまたは市場状態識別メカニズムを追加することを検討してください.

  5. 計算の複雑さ策略: 多数の配列と条件チェックを使用し,低配置のデバイスでは性能上の問題を引き起こす可能性があります. コードにクリーンアップメカニズムが含まれているが,長期にわたって実行するには,リソースの消費を注意する必要があります.

  6. 撤去管理が不十分:現在の戦略は,異なる市場条件下でのポジション規模の動的調整を考慮していない.継続的に不利な環境では,より大きな撤収につながる可能性がある.

戦略最適化の方向性

コード分析に基づいて,以下の最適化方向が提案されています.

  1. 複数時間枠確認:より高い時間枠の市場構造分析を導入し,主要トレンド方向のみで取引する.例えば,日線トレンドフィルターを追加し,日線トレンド方向が一致する時にのみ取引を行う.

  2. 動態参数最適化:市場の変動性に基づく自動調整のパラメータシステムを実現します.例えば,高変動期間の最小FVGサイズとCHoCH距離要求を増加させ,低変動期間のこれらのパラメータを減少させます.

  3. 入学最適化:

    • FVG領域の異なるレベルに複数のエントリーポイントを設定するなど,バッチエントリー戦略を実現する
    • 取引量突破や動力指標確認などの追加入場確認
  4. リスク管理の強化:

    • ストップトラッキング機能が実装され,取引収益に応じてストップポジションを自動的に調整する
    • 部分利益の機能を追加し,特定の利益レベルに達すると部分のポジションを平準化します.
    • 最大撤収制限を導入し,口座撤収が値に達すると,自動的にポジションサイズを小さくするか,取引を一時停止する.
  5. 市場の状況に適応:

    • 市場状態の識別 ((トレンド/収束/高波動) を追加し,異なる状態に応じて戦略パラメータを調整する
    • 市場を整理する際に取引を減らすか避ける
    • 変動が急増したときにより保守的なポジションスケールを取ります
  6. 機械学習の強化: 機械学習アルゴリズムを導入し,歴史のCHoCHとFVGのパターンを分析し,成功率が高いパターンの特性を識別し,それに応じて入場決定重点を調整する.

  7. 取引時間フィルター: 取引時間フィルターを追加し,重要なニュースリリースや市場開場/閉店時の波動期を避けて,流動性の高い取引時間に焦点を当てます.

要約する

多層価格構造の識別と公正価値のギャップを量化する取引システムは,先進的な価格行動理論を組み合わせた完全な取引ソリューションである.それは,市場構造の変化 (CHoCH) と価格不均衡領域 (FVG) を識別し,理想的な価格レベルで取引を開始し,システム化されたリスク管理方法を使用して取引資本を保護する.

この戦略の最大の強みは,落後指標に頼らず,実際の市場構造に基づく分析方法によって,市場の転換点を早期に識別できるという点にある.また,優れたビジュアル機能とパフォーマンスモニタリングシステムは,トレーダーが戦略の論理を直観的に理解し,その有効性を評価できるようにする.

偽突破やパラメータの感受性などのリスクがあるものの,提案された最適化方向,特に多時間枠確認,動的パラメータ調整,強化されたリスク管理機能によって,戦略の安定性と性能を大幅に向上させることができる.

この戦略は,体系的な取引方法を採用したい投資家にとって,伝統的な価格行動取引の精髓を吸収しながら,量化システムの客観性と規律的な優位性を利用する堅固な枠組みを提供します.この戦略は,継続的なパラメータの最適化と市場の適応性調整により,様々な市場環境で安定した取引パフォーマンスを実現する可能性があります.

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

//@version=5
strategy("ICT CHoCH & FVG Strategy - NQ1!", overlay=true, pyramiding=0, calc_on_every_tick=false, calc_on_order_fills=false, max_boxes_count=500, max_lines_count=100, max_labels_count=100)

// ============================================================================
// INPUT PARAMETERS
// ============================================================================

// Strategy Settings
riskRewardRatio = input.float(2.0, title="Risk:Reward Ratio", minval=0.5, maxval=10.0, group="Strategy Settings")
fixedTarget = input.int(40, title="Fixed Target (Ticks)", minval=5, maxval=200, group="Strategy Settings")
useRRTarget = input.bool(true, title="Use Risk:Reward Target", tooltip="If false, uses fixed target", group="Strategy Settings")
riskPercent = input.float(2.0, title="Risk % of Account", minval=0.1, maxval=10.0, group="Strategy Settings")
useAutoSize = input.bool(false, title="Auto Size Positions", tooltip="Size based on risk % and stop distance", group="Strategy Settings")

// Visual Settings
showCHoCH = input.bool(true, title="Show CHoCH Labels", group="Visual Settings")
showFVG = input.bool(true, title="Show FVG Boxes", group="Visual Settings")
showSwings = input.bool(true, title="Show Swing Points", group="Visual Settings")
showTradeLines = input.bool(true, title="Show Entry/SL/TP Lines", group="Visual Settings")

// CHoCH Detection Settings
swingLength = input.int(5, title="Swing Detection Length", minval=2, maxval=20, group="CHoCH Settings")
minCHoCHDistance = input.int(10, title="Min CHoCH Distance (bars)", minval=5, maxval=50, group="CHoCH Settings")

// FVG Settings
minFVGSize = input.float(2.0, title="Min FVG Size (ticks)", minval=0.25, maxval=10.0, group="FVG Settings")
maxFVGAge = input.int(50, title="Max FVG Age (bars)", minval=10, maxval=200, group="FVG Settings")

// ============================================================================
// VARIABLES AND ARRAYS
// ============================================================================

// Swing point detection
var float lastSwingHigh = na
var float lastSwingLow = na
var int lastSwingHighBar = na
var int lastSwingLowBar = na

// CHoCH tracking
var bool bullishCHoCH = false
var bool bearishCHoCH = false
var float chochLevel = na
var int chochBar = na
var bool waitingForFVG = false

// FVG tracking
var array<box> bullishFVGs = array.new<box>()
var array<box> bearishFVGs = array.new<box>()
var float activeFVGTop = na
var float activeFVGBottom = na
var bool lookingForEntry = false

// Trade management
var float stopLossLevel = na
var float takeProfitLevel = na
var bool inPosition = false

// ============================================================================
// HELPER FUNCTIONS
// ============================================================================

// Convert ticks to price for NQ
ticksToPrice(ticks) => ticks * 0.25

// Calculate position size based on risk
calcPositionSize(stopDistance) =>
    if useAutoSize and strategy.equity > 0
        accountValue = strategy.equity
        riskAmount = accountValue * (riskPercent / 100)
        stopDistancePrice = stopDistance * syminfo.mintick
        math.max(1, math.floor(riskAmount / stopDistancePrice))
    else
        1

// ============================================================================
// SWING POINT DETECTION
// ============================================================================

// Detect swing highs and lows
swingHigh = ta.pivothigh(high, swingLength, swingLength)
swingLow = ta.pivotlow(low, swingLength, swingLength)

// Update swing points
if not na(swingHigh)
    lastSwingHigh := swingHigh
    lastSwingHighBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingHigh, "SH", style=label.style_triangledown, color=color.red, size=size.tiny)

if not na(swingLow)
    lastSwingLow := swingLow
    lastSwingLowBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingLow, "SL", style=label.style_triangleup, color=color.green, size=size.tiny)

// ============================================================================
// CHoCH DETECTION
// ============================================================================

// Check for bullish CHoCH (break above prior swing high after making lower low)
bullishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       high > lastSwingHigh and 
                       lastSwingLow < lastSwingHigh and
                       bar_index - lastSwingHighBar > minCHoCHDistance and
                       strategy.position_size == 0

// Check for bearish CHoCH (break below prior swing low after making higher high)
bearishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       low < lastSwingLow and 
                       lastSwingHigh > lastSwingLow and
                       bar_index - lastSwingLowBar > minCHoCHDistance and
                       strategy.position_size == 0

// Process CHoCH signals
if bullishCHoCHCondition and not bullishCHoCH
    bullishCHoCH := true
    bearishCHoCH := false
    chochLevel := lastSwingHigh
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


if bearishCHoCHCondition and not bearishCHoCH
    bearishCHoCH := true
    bullishCHoCH := false
    chochLevel := lastSwingLow
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


// ============================================================================
// FVG DETECTION
// ============================================================================

// Check for FVG formation (3-candle pattern)
if bar_index >= 2
    // Bullish FVG: low[0] > high[2]
    bullishFVG = low[0] > high[2] and (low[0] - high[2]) >= ticksToPrice(minFVGSize)
    
    // Bearish FVG: high[0] < low[2]  
    bearishFVG = high[0] < low[2] and (low[2] - high[0]) >= ticksToPrice(minFVGSize)
    
    // Process bullish FVG after bullish CHoCH
    if bullishFVG and bullishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[0]
        fvgBottom = high[2]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true
    
    // Process bearish FVG after bearish CHoCH
    if bearishFVG and bearishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[2]
        fvgBottom = high[0]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true

// ============================================================================
// ENTRY LOGIC
// ============================================================================

// Long entry: price touches bullish FVG after bullish CHoCH
longCondition = lookingForEntry and bullishCHoCH and 
               not na(activeFVGTop) and not na(activeFVGBottom) and
               low <= activeFVGTop and high >= activeFVGBottom and
               strategy.position_size == 0

// Short entry: price touches bearish FVG after bearish CHoCH  
shortCondition = lookingForEntry and bearishCHoCH and  not na(activeFVGTop) and not na(activeFVGBottom) and low <= activeFVGTop and high >= activeFVGBottom and  strategy.position_size == 0

// Process long entries
if longCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingLow
    stopDistance = entryPrice - stopLoss
    
    if useRRTarget
        takeProfit := entryPrice + (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice + ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Long", strategy.long, qty=qty)
    strategy.exit("Long Exit", "Long", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bullishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    


// Process short entries
if shortCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingHigh
    stopDistance = stopLoss - entryPrice
    
    if useRRTarget
        takeProfit := entryPrice - (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice - ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Short", strategy.short, qty=qty)
    strategy.exit("Short Exit", "Short", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bearishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    

// ============================================================================
// POSITION MANAGEMENT
// ============================================================================

// Reset position state when trade is closed
if inPosition and strategy.position_size == 0
    inPosition := false
    stopLossLevel := na
    takeProfitLevel := na

// ============================================================================
// VISUAL SIGNALS
// ============================================================================

// Plot entry signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, 
          style=shape.triangleup, size=size.normal)

plotshape(shortCondition, title="Short Entry", location=location.abovebar, color=color.red, 
          style=shape.triangledown, size=size.normal)

// Plot active stop loss and take profit levels
plot(inPosition ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(inPosition ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)

// ============================================================================
// CLEANUP
// ============================================================================

// Clean up old FVG boxes (helps with performance)
if bar_index % 100 == 0
    while array.size(bullishFVGs) > 20
        box.delete(array.shift(bullishFVGs))
    while array.size(bearishFVGs) > 20
        box.delete(array.shift(bearishFVGs))

// ============================================================================
// ALERTS
// ============================================================================

// Alert conditions
alertcondition(longCondition, title="Long Entry Signal", message="ICT Strategy: Long entry at FVG - SL: {{strategy.position_avg_price}}")
alertcondition(shortCondition, title="Short Entry Signal", message="ICT Strategy: Short entry at FVG - SL: {{strategy.position_avg_price}}")