
多層の価格構造識別と公正価値ギャップ量化取引システムは,価格行動に基づく自動取引戦略であり,この戦略は2つの重要な取引コンセプト:変化特征 (CHoCH,Change of Character) と公正価値ギャップ (FVG,Fair Value Gap) を組み合わせている.この戦略は,市場構造の変化点と不均衡領域を識別することによって,高確率の取引機会を捉え,価格が公正価値ギャップに戻ったときに入場し,正確な入場と出場の制御を実現する.この体系化されたアプローチは,トレーダーに市場を客観的に分析し,感情を排除し,明確なリスク管理ルールを持つことを可能にします.
量子取引システムは,以下のコア原理に基づいて動作します.
価格構造の識別: 波峰波谷 (Pivot Points) 技術を介して,市場における振動高点と振動低点を識別し,これらのポイントは市場構造の重要な構成要素である.システムは,パラメータ化された振動長さを (デフォルト5サイクル) を使用して,これらの重要なポイントを決定する.
変化特征 ((CHoCH) 検出:
公正価値のギャップ (FVG) の識別:
入力論理:
リスク管理機構:
この戦略は,コードの詳細な分析の結果,以下の顕著な利点があることが判明しました.
構造化された市場分析: 戦略は,価格構造の変化と市場不均衡の原理に基づいて,単純な指標の交差ではなく,市場転換点を識別する上でユニークな優位性を持つようにする.
正確な入学時間:CHoCHの後にFVGが形成されるのを待つことで,戦略は有利な価格レベルで入場することができ,高殺低を追求することを避け,入場品質を向上させることができる.
リスク管理に適応する戦略: 固定ポイントではなく,実際の市場構造に基づいて自動でストップポジションを調整する.この方法は,市場の実際の波動的特性に適しています.
取引要素を視覚化する戦略は,CHoCHタグ,FVGボックス,振動点,取引ラインを含む完全な可視化機能を提供し,トレーダーに市場構造と戦略の論理を直視的に理解できるようにします.
柔軟なポジション管理: ポジションの大きさをリスクパーセントで自動調整し,口座の資金を保護し,波動性に応じてリスクを自動的に調整できます.
性能最適化デザイン: コードには,古いFVGボックスをクリアするメカニズムが含まれています. 長時間稼働するとシステムの性能が低下しないようにします.
総合的なパフォーマンスモニタリング: 戦略は,戦略の状況,勝利率,利益因子などの重要な指標を含むリアルタイムパフォーマンス表を提供し,トレーダーが戦略のパフォーマンスを評価することを容易にします.
この戦略は合理的に設計されていますが,いくつかの潜在的なリスクと限界があります.
偽の突破の危険性:CHoCHシグナルは偽のブレイクになり,価格が迅速に引き下がり,ストップを触発する.このリスクを緩和するために,ドーガンK線がブレイクを確認するのを待つような確認メカニズムを追加することを検討することができます.
ギャップリスク: 波動性のある市場や夜間取引では,価格が止損位置を超えて飛躍し,予想以上の実際の損失を引き起こす可能性があります. 保証ストップ・オーダー (可能な場合) を使用するか,ポジションの規模を減らすことをお勧めします.
パラメータ感度戦略の性能は,振動長さ,最小CHoCH距離,FVGサイズなどのパラメータの設定に大きく依存しています. 異なる市場と時間枠では異なるパラメータの組み合わせが必要であり,全面的な反射最適化が推奨されています.
市場環境への依存: この戦略は,トレンド市場ではよりよく動作し,市場を整理すると頻繁に誤信号が生じることがあります. トレンドフィルターまたは市場状態識別メカニズムを追加することを検討してください.
計算の複雑さ策略: 多数の配列と条件チェックを使用し,低配置のデバイスでは性能上の問題を引き起こす可能性があります. コードにクリーンアップメカニズムが含まれているが,長期にわたって実行するには,リソースの消費を注意する必要があります.
撤去管理が不十分:現在の戦略は,異なる市場条件下でのポジション規模の動的調整を考慮していない.継続的に不利な環境では,より大きな撤収につながる可能性がある.
コード分析に基づいて,以下の最適化方向が提案されています.
複数時間枠確認:より高い時間枠の市場構造分析を導入し,主要トレンド方向のみで取引する.例えば,日線トレンドフィルターを追加し,日線トレンド方向が一致する時にのみ取引を行う.
動態参数最適化:市場の変動性に基づく自動調整のパラメータシステムを実現します.例えば,高変動期間の最小FVGサイズとCHoCH距離要求を増加させ,低変動期間のこれらのパラメータを減少させます.
入学最適化:
リスク管理の強化:
市場の状況に適応:
機械学習の強化: 機械学習アルゴリズムを導入し,歴史のCHoCHとFVGのパターンを分析し,成功率が高いパターンの特性を識別し,それに応じて入場決定重点を調整する.
取引時間フィルター: 取引時間フィルターを追加し,重要なニュースリリースや市場開場/閉店時の波動期を避けて,流動性の高い取引時間に焦点を当てます.
多層価格構造の識別と公正価値のギャップを量化する取引システムは,先進的な価格行動理論を組み合わせた完全な取引ソリューションである.それは,市場構造の変化 (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}}")