Многоуровневая идентификация структуры цен и количественная торговая система разрыва справедливой стоимости

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
Подписчики

Многоуровневая идентификация структуры цен и количественная торговая система разрыва справедливой стоимости Многоуровневая идентификация структуры цен и количественная торговая система разрыва справедливой стоимости

Обзор

Система количественной торговли с идентификацией многоуровневой ценовой структуры и разрыва в справедливой стоимости - это автоматизированная торговая стратегия, основанная на ценовом поведении, которая сочетает в себе две ключевые торговые концепции: изменение характеристик (CHoCH, Change of Character) и разрыв в справедливой стоимости (FVG, Fair Value Gap). Эта стратегия используется для захвата высоковероятных торговых возможностей путем идентификации точек изменения структуры рынка и неравновесных зон, для получения точного контроля за входом и выходом, когда цена возвращается к разрыву в справедливой стоимости.

Стратегический принцип

Система квантовых сделок работает по следующим основным принципам:

  1. Идентификация ценовой структуры: с помощью технологий Pivot Points идентифицируют высокие и низкие колебания на рынке, которые являются ключевыми составляющими структуры рынка. Система использует параметризированную длину колебаний (по умолчанию 5 циклов) для определения этих ключевых точек.

  2. Обнаружение признаков изменения CHoCH:

    • Multiheaded CHoCH: цены пересекают предыдущие высокие колебания после формирования более низких низких
    • HALLOW CHoCH: цена пробивает предыдущие колебательные минимумы после формирования более высоких максимумов Система требует, чтобы интервал времени образования CHoCH соответствовал требованиям минимального расстояния (всего 10 циклов) для фильтрации недействительных сигналов.
  3. Идентификация пробелов в справедливой стоимости:

    • FVG с множественными головами: низкие точки текущего цикла выше, чем высокие точки двух предыдущих циклов
    • FVG: высота текущего цикла ниже низкой двух предыдущих циклов Система устанавливает минимальный порог величины FVG (по умолчанию 2 балла), чтобы гарантировать, что будет зафиксировано только значимое неравенство цены.
  4. Входная логика:

    • Многоточный вход: после подтверждения многоточного CHoCH, ждите, пока цена вернется в многоточную зону FVG
    • Вход на воздушном шаре: после подтверждения воздушного шара CHoCH, ожидание возвращения цены в зону FVG Цены на вход устанавливаются в центре зоны FVG, обеспечивая сбалансированную цену на вход.
  5. Механизм управления рисками:

    • Стоп-убыток устанавливается на ближайшее колебание низких точек (многоголовый) или колебание высоких точек (пустой)
    • Стоп-аут на основе коэффициента возврата риска (по умолчанию 2.0) или фиксированного целевого балла
    • Опциональная функция автоматической корректировки позиции, размер позиции рассчитывается на основе процента риска в счете и стоп-лаза

Стратегические преимущества

После глубокого анализа кода, эта стратегия имеет следующие значительные преимущества:

  1. Структурированный анализ рынкаСтратегия, основанная на принципе изменения ценовой структуры и рыночных дисбалансов, а не на простом скрещивании показателей, дает ей уникальное преимущество в определении рыночных поворотных точек.

  2. Точное время входаВ результате, в результате чего возникают FVG, которые формируются после CHoCH, стратегия позволяет входить в игру на выгодных уровнях цен, избегать преследования высоких и низких, повышать качество входа.

  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}}")