
Система количественной торговли с идентификацией многоуровневой ценовой структуры и разрыва в справедливой стоимости - это автоматизированная торговая стратегия, основанная на ценовом поведении, которая сочетает в себе две ключевые торговые концепции: изменение характеристик (CHoCH, Change of Character) и разрыв в справедливой стоимости (FVG, Fair Value Gap). Эта стратегия используется для захвата высоковероятных торговых возможностей путем идентификации точек изменения структуры рынка и неравновесных зон, для получения точного контроля за входом и выходом, когда цена возвращается к разрыву в справедливой стоимости.
Система квантовых сделок работает по следующим основным принципам:
Идентификация ценовой структуры: с помощью технологий Pivot Points идентифицируют высокие и низкие колебания на рынке, которые являются ключевыми составляющими структуры рынка. Система использует параметризированную длину колебаний (по умолчанию 5 циклов) для определения этих ключевых точек.
Обнаружение признаков изменения CHoCH:
Идентификация пробелов в справедливой стоимости:
Входная логика:
Механизм управления рисками:
После глубокого анализа кода, эта стратегия имеет следующие значительные преимущества:
Структурированный анализ рынкаСтратегия, основанная на принципе изменения ценовой структуры и рыночных дисбалансов, а не на простом скрещивании показателей, дает ей уникальное преимущество в определении рыночных поворотных точек.
Точное время входаВ результате, в результате чего возникают FVG, которые формируются после CHoCH, стратегия позволяет входить в игру на выгодных уровнях цен, избегать преследования высоких и низких, повышать качество входа.
Приспособность к управлению рискамиСтратегия: автоматическая коррекция стоп-позиции в соответствии с фактической структурой рынка, а не с использованием фиксированного количества баллов. Этот метод больше соответствует фактическим колебаниям рынка.
Визуализация элементов сделки: Стратегия предоставляет полную визуализацию, включая теги 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}}")