Стратегия торговли импульсным трендом с несколькими таймфреймами

ATR EMA VWAP CHoCH BOS CVD
Дата создания: 2025-05-15 15:53:29 Последнее изменение: 2025-05-15 15:53:29
Копировать: 1 Количество просмотров: 354
2
Подписаться
319
Подписчики

Стратегия торговли импульсным трендом с несколькими таймфреймами Стратегия торговли импульсным трендом с несколькими таймфреймами

Обзор

Многовременная динамическая торговая стратегия - это комплексная торговая система, которая обеспечивает трейдерам мощный инструмент, помогающий улавливать рыночные тенденции и минимизировать ложные сигналы, путем интеграции многовременного анализа трендов, динамических сигналов, подтверждения объема сделки и концепции интеллектуальных средств. Уникальный “AI” компонент стратегии анализирует тенденции на протяжении нескольких временных периодов, обеспечивает четкую и управляемую диаграмму, что позволяет легко использовать ее как новичкам, так и опытным трейдерам.

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

Стратегия представляет собой последовательную систему торгов, созданную путем объединения нескольких компонентов:

  1. Анализ тенденций в нескольких временных периодахСтратегия использует три временных цикла (часовой, часовой, дневный) для оценки трендов, используя индексные скользящие средние (EMA) и средние цены, взвешенные по объему сделки (VWAP). Тренд считается пессимистичным, когда цена выше EMA и VWAP; считается пассивным, когда цена ниже; в противном случае нейтральным. Сигнал генерируется только в том случае, если выбранная пользователем более высокая временная тенденция совпадает с направлением торговли (например, сигнал покупки требует более высокой временной тенденции). Это уменьшает шум и гарантирует, что торговля следует более широкому рынку.

  2. Мощный фильтр: измерение процентной разницы цен между последовательными столбцами и их корректировка на фоне колебаний в пределах среднего истинного диапазона[ATR]) для сравнения. Это гарантирует, что сделки будут проводиться только в период значительного движения цены, фильтруя низкую динамику.

  3. Фильтр загрузки (по выбору): проверка того, превышает ли текущий объем сделок долгосрочную среднюю величину и показывает положительные изменения в краткосрочном объеме сделок. Это подтверждает сильную активность рынка и снижает риск ложных прорывов.

  4. Прорыв фильтра (по выбору)Требуйте, чтобы цена пробивала (покупала) или пробивала (продавала) последние высокие/низкие точки, чтобы гарантировать, что сигнал соответствует изменениям в структуре рынка.

  5. Концепция интеллектуального капитала (CHoCH/BOS)

    • Изменение структурных характеристик ((CHoCH): обнаружение потенциального обратного хода, когда цена пересекает ближайшую осевую высоту ((продажа) или ближайшую осевую низкую высоту ((покупка) в виде понижения или понижения.
    • Структурный прорыв (BOS): подтверждение продолжения тренда, когда цена с сильной энергией прорывает ближайшее нижнее положение (BOS) или прорывает ближайшее высокое положение (BOS). Эти сигналы изображены как горизонтальные линии с этикетками, чтобы сделать ключевые уровни легко видимыми.
  6. Тенденционная панель AIТенденционный рейтинг, который сочетает в себе направление, динамику и волатильность тренда в разных временных рамках (ATR). Показатель выше 0,5 означает “вверх” и ниже 0,5 - “вниз”, в противном случае он является “нейтральным”. Показатель динамики показывает силу тренда (процент), уверенность в ИИ (на основе консистенции тренда) и накопленную разницу в трафике (CVD).

  7. Динамическая линия трендаПоддержка и сопротивление в зависимости от определенных пользователем периодов времени (краткий период тренда, длинный период тренда). Эти линии адаптируются к рыночным условиям и окрашиваются в соответствии с интенсивностью тренда.

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

Существуют следующие значительные преимущества многоциклической динамической стратегии торговли:

  1. Снижение ложных сигналовСтратегия минимизирует торговлю на рынках с волатильностью или низким уровнем доверия, требуя последовательности трендов, динамики, объема сделок и фильтров прорыва.

  2. Адаптация к рынкуДвижимые понижения, основанные на ATR, могут быть скорректированы в зависимости от динамики волатильности, чтобы гарантировать, что сигнал остается релевантным на трендовых рынках и в промежуточных.

  3. Упрощение принятия решений: AI-приборная панель объединяет сложные многовременные данные в удобные для пользователя таблицы, устраняя необходимость в ручном анализе.

  4. Использование интеллектуального капитала:CHoCH и BOS сигналы поймать структуры ценового действия модели, чтобы дать трейдерам преимущество в распознавании обратного и продолжение.

  5. Визуальная ясностьСтратегия: помогает трейдерам лучше понять поведение цены, позволяя четко видеть структуру рынка, отмечая ключевые уровни, сигналы и трендовые линии.

  6. Встроенное управление рискамиВ частности, в некоторых странах, например, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае.

  7. ПредупреждениеС помощью сигнала “приготовься”, трейдер может быть предупрежден до того, как настройка будет полностью разработана, что позволяет больше времени для подготовки и планирования.

Стратегический риск

Несмотря на все преимущества, существуют некоторые потенциальные риски:

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

  2. Задержка сигнала: Использование многочисленных фильтров может привести к тому, что сигнал будет несколько задерживаться по отношению к ценовому движению, иногда пропуская идеальные точки входа. Решение заключается в корректировке параметров, более чувствительных к скорости рынка, таких как длина осей и динамические отклонения.

  3. Ошибочное определение тенденцийВ условиях высокой волатильности или отсутствия направления оценка тенденций может быть неточной. Решение заключается в сокращении торгов или введении более строгих требований к фильтрации в этих условиях.

  4. Недостатки в управлении финансами: фиксированные стопы и остановочные точки могут не подходить для всех рыночных условий. Решение состоит в том, чтобы скорректировать их на значения, основанные на ATR, чтобы они соответствовали текущей волатильности.

  5. Компьютерная интенсивностьСложность стратегии может привести к проблемам с производительностью на некоторых платформах, особенно при анализе большого количества исторических данных. Решение - ограничить диапазон времени отсчета или упростить несущественные вычисления.

  6. Зависимость от данных: Стратегия зависит от точных многовременных данных, которые могут не быть доступны во всех торговых средах. Решение заключается в реализации надежных альтернативных вариантов, таких как расчет локальных значений, показанных в коде.

  7. Предпочтение высоколиквидным рынкамСтратегия может привести к большему количеству ошибочных сигналов на рынках с низкой ликвидностью. Решение заключается в том, чтобы сосредоточиться на основных валютных парах, широко распространенных акциях и основных криптовалютах.

Направление оптимизации стратегии

Эта стратегия может быть оптимизирована в следующих направлениях:

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

  2. Интеграция машинного обученияПрименение алгоритмов машинного обучения для выявления оптимальных комбинаций параметров или прогнозирования эффективности стратегии в определенных рыночных условиях. Это может быть достигнуто путем анализа данных об исторической эффективности, что еще больше усиливает “AI” аспекты стратегии.

  3. Индекс рыночных настроенийДобавление внешних данных о настроениях рынка, таких как индекс VIX или анализ настроений в социальных сетях, предоставляет более широкий контекст для принятия торговых решений. Это может помочь стратегии избежать торговли в экстремальных рыночных условиях.

  4. Фильтр времениДобавление фильтров, основанных на временных моделях колебаний рынка, чтобы избежать торговли во время известных низких колебаний (например, в середине азиатской сессии). Это может уменьшить количество низкокачественных сигналов.

  5. Корреляционный анализДобавление проверки взаимосвязи между активами, чтобы убедиться, что сделка соответствует движению соответствующего рынка (например, при торговле EUR / USD учитывайте индекс доллара). Это может обеспечить дополнительное подтверждение сигнала.

  6. Оптимизация управления капиталом: реализация динамического уровня остановки/потери, основанного на волатильности, и добавление правил управления капиталом, таких как изменение размеров позиций по мере роста счета. Это повысит долгосрочную прибыль после корректировки риска.

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

  8. Данные не относятсяПовышенные стратегии для более элегантной обработки перерывов или пропущенных значений данных, чтобы обеспечить их надежность в неблагоприятных условиях.

Подвести итог

Многоциклическая динамическая стратегия торговли предлагает полную торговую систему, объединяющую традиционный технический анализ, концепцию умных денег и уникальный AI-направленный анализ тенденций. Ее сила заключается в многоуровневом механизме фильтрации и подтверждения, гарантирующем генерацию торговых сигналов только при высокой вероятности.

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

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

Несмотря на некоторые риски и ограничения, эта уже мощная система может быть еще больше усилена с помощью рекомендаций по оптимизации. Разумно применять принципы управления рисками и корректировать параметры в соответствии с конкретными торговыми целями и рисковой толерантностью, эта стратегия может стать ценным инструментом в инструментарии любого трейдера.

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

Исходный код стратегии
/*backtest
start: 2024-05-15 00:00:00
end: 2025-05-13 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("PowerHouse SwiftEdge AI v2.10 Strategy", overlay=true, calc_on_every_tick=true)

// Inputs med fleksible indstillinger
length = input.int(5, "Pivot Length", minval=1, maxval=20, step=1, tooltip="Number of bars to identify pivot highs and lows.")
momentum_threshold_base = input.float(0.01, "Base Momentum Threshold (%)", minval=0.001, maxval=1.0, step=0.001, tooltip="Base percentage change for signals.")
tp_points = input.int(10, "Take Profit (points)", minval=5, maxval=500, step=5)
sl_points = input.int(10, "Stop Loss (points)", minval=5, maxval=500, step=5)
min_signal_distance = input.int(5, "Min Signal Distance (bars)", minval=1, maxval=50, step=1)
tp_box_height = input.float(0.5, "TP Box Height % (Optional)", minval=0.1, maxval=2.0, step=0.1)
pre_momentum_factor_base = input.float(0.5, "Base Pre-Momentum Factor", minval=0.1, maxval=1.0, step=0.1, tooltip="Base factor for Get Ready signals.")
shortTrendPeriod = input.int(30, title="Short Trend Period", minval=10, maxval=100)
longTrendPeriod = input.int(100, title="Long Trend Period", minval=50, maxval=200)

// Brugerdefinerede filtre
use_momentum_filter = input.bool(true, "Use Momentum Filter", group="Signal Filters", tooltip="Require price change to exceed momentum threshold.")
use_trend_filter = input.bool(true, "Use Higher Timeframe Trend Filter", group="Signal Filters", tooltip="Require alignment with the selected higher timeframe trend.")
higher_tf_choice = input.string("60", "Higher Timeframe", options=["60", "240", "D"], group="Signal Filters", tooltip="Choose the timeframe for the higher timeframe filter.")
use_lower_tf_filter = input.bool(true, "Use Lower Timeframe Filter", group="Signal Filters", tooltip="Prevent signals against the selected lower timeframe trend.")
lower_tf_choice = input.string("60", "Lower Timeframe", options=["60", "240", "D"], group="Signal Filters", tooltip="Choose the timeframe for the lower timeframe filter.")
use_volume_filter = input.bool(false, "Use Volume Filter", group="Signal Filters", tooltip="Require volume above average (optional).")
use_breakout_filter = input.bool(false, "Use Breakout Filter", group="Signal Filters", tooltip="Require price to break previous high/low (optional).")
show_get_ready = input.bool(true, "Show Get Ready Signals", group="Signal Filters", tooltip="Enable or disable Get Ready signals.")
restrict_repeated_signals = input.bool(false, "Restrict Repeated Signals", group="Signal Filters", tooltip="Prevent multiple signals in the same trend direction until trend changes.")
restrict_trend_tf_choice = input.string("60", "Restrict Trend Timeframe", options=["60", "240", "D"], group="Signal Filters", tooltip="Choose the timeframe to check trend for restricting repeated signals.")
enable_ai_analysis = input.bool(true, "Enable AI Market Analysis", group="AI Market Analysis", tooltip="Show AI predictions for future trends across timeframes.")
ai_table_position = input.string("Bottom Center", "AI Market Analysis Table Position", options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"], group="AI Market Analysis", tooltip="Choose the position of the AI Market Analysis table.")

// Ekstra inputs til valgfrie filtre
volumeLongPeriod = input.int(50, "Long Volume Period", minval=10, maxval=100, group="Volume Filter Settings")
volumeShortPeriod = input.int(5, "Short Volume Period", minval=1, maxval=20, group="Volume Filter Settings")
breakoutPeriod = input.int(5, "Breakout Period", minval=1, maxval=50, group="Breakout Filter Settings")

// Funktion til at konvertere streng til position
f_getTablePosition(position_string) =>
    switch position_string
        "Top Left" => position.top_left
        "Top Center" => position.top_center
        "Top Right" => position.top_right
        "Middle Left" => position.middle_left
        "Middle Center" => position.middle_center
        "Middle Right" => position.middle_right
        "Bottom Left" => position.bottom_left
        "Bottom Center" => position.bottom_center
        "Bottom Right" => position.bottom_right
        => position.middle_right  // Standard fallback

// AI-drevet adaptiv signaljustering med ATR
atr_raw = ta.atr(14)
atr = na(atr_raw) and bar_index > 0 ? (high - low) : atr_raw
volatility_factor = atr / close
momentum_threshold = momentum_threshold_base * (1 + volatility_factor * 2)
pre_momentum_factor = pre_momentum_factor_base * (1 - volatility_factor * 0.5)
pre_momentum_threshold = momentum_threshold * pre_momentum_factor

// Raw CVD-beregning
var float raw_cvd = 0.0
delta_volume = close > close[1] ? volume : close < close[1] ? -volume : 0
raw_cvd := raw_cvd + delta_volume

// Volatility Context baseret på absolut CVD
cvd_level = math.abs(raw_cvd) < 10000 ? "Low" : math.abs(raw_cvd) < 50000 ? "Medium" : "High"
cvd_color = raw_cvd > 0 ? color.lime : raw_cvd < 0 ? color.red : color.yellow

// Beregn prisændring (momentum)
price_change = ((close - close[1]) / close[1]) * 100

// Find højder og lavpunkter
pivot_high = ta.pivothigh(high, length, length)
pivot_low = ta.pivotlow(low, length, length)

// Variabler til at gemme seneste højder og lavpunkter
var float last_high = na
var float last_low = na
if not na(pivot_high)
    last_high := pivot_high
if not na(pivot_low)
    last_low := pivot_low

// Variabler til signalstyring
var float choch_sell_level = na
var float choch_buy_level = na
var float bos_sell_level = na
var float bos_buy_level = na
var float tp_sell_level = na
var float tp_buy_level = na
var int last_signal_bar = -min_signal_distance - 1
var string last_signal = "Neutral"
var int last_trend = 0  // Sporer den sidste trendretning for restrict_repeated_signals

// Multi-tidsramme trendanalyse med robust fallback
// Beregn EMA og VWAP for hver tidsramme
ema60_raw = request.security(syminfo.tickerid, "60", ta.ema(close, 20), lookahead=barmerge.lookahead_on)
vwap60_raw = request.security(syminfo.tickerid, "60", ta.vwap(hlc3), lookahead=barmerge.lookahead_on)
ema240_raw = request.security(syminfo.tickerid, "240", ta.ema(close, 20), lookahead=barmerge.lookahead_on)
vwap240_raw = request.security(syminfo.tickerid, "240", ta.vwap(hlc3), lookahead=barmerge.lookahead_on)
emaD_raw = request.security(syminfo.tickerid, "D", ta.ema(close, 20), lookahead=barmerge.lookahead_on)
vwapD_raw = request.security(syminfo.tickerid, "D", ta.vwap(hlc3), lookahead=barmerge.lookahead_on)

// Lokale EMA og VWAP som fallback
local_ema = ta.ema(close, 20)
local_vwap = ta.vwap(hlc3)

// Fallback for manglende data
ema60 = na(ema60_raw) ? local_ema : ema60_raw
vwap60 = na(vwap60_raw) ? local_vwap : vwap60_raw
ema240 = na(ema240_raw) ? local_ema : ema240_raw
vwap240 = na(vwap240_raw) ? local_vwap : vwap240_raw
emaD = na(emaD_raw) ? local_ema : emaD_raw
vwapD = na(vwapD_raw) ? local_vwap : vwapD_raw

// Trendbestemmelse (1 = op, -1 = ned, 0 = neutral)
trend60 = close > ema60 and close > vwap60 ? 1 : close < ema60 and close < vwap60 ? -1 : 0
trend240 = close > ema240 and close > vwap240 ? 1 : close < ema240 and close < vwap240 ? -1 : 0
trendD = close > emaD and close > vwapD ? 1 : close < emaD and close < vwapD ? -1 : 0

// AI-Trend Strength (-100 til +100)
trend_strength_raw = trend60 + trend240 + trendD
trend_strength = (trend_strength_raw / 3) * 100

// AI Confidence (simuleret succesrate)
var float ai_confidence = 50.0
if trend_strength_raw == 3 or trend_strength_raw == -3
    ai_confidence := 90.0
else if trend_strength_raw >= 2 or trend_strength_raw <= -2
    ai_confidence := 75.0
else
    ai_confidence := 60.0

// Filterbetingelser
// Dynamisk valg af higher timeframe trend (til signalfiltrering)
var int higher_tf_trend = 0
switch higher_tf_choice
    "60" => higher_tf_trend := trend60
    "240" => higher_tf_trend := trend240
    "D" => higher_tf_trend := trendD

bullish_trend_ok = higher_tf_trend == 1
bearish_trend_ok = higher_tf_trend == -1

// Dynamisk valg af lower timeframe trend (til signalfiltrering)
var int lower_tf_trend = 0
switch lower_tf_choice
    "60" => lower_tf_trend := trend60
    "240" => lower_tf_trend := trend240
    "D" => lower_tf_trend := trendD

lower_tf_bullish = lower_tf_trend == 1
lower_tf_bearish = lower_tf_trend == -1
lower_tf_not_neutral = lower_tf_trend != 0

// Dynamisk valg af trend-tidsramme til restrict_repeated_signals
var int restrict_tf_trend = 0
switch restrict_trend_tf_choice
    "60" => restrict_tf_trend := trend60
    "240" => restrict_tf_trend := trend240
    "D" => restrict_tf_trend := trendD

volAvg50 = ta.sma(volume, volumeLongPeriod)
volShort = ta.sma(volume, volumeShortPeriod)
volCondition = volume > volAvg50 and ta.change(volShort) > 0
highestBreakout = ta.highest(high, breakoutPeriod)
lowestBreakout = ta.lowest(low, breakoutPeriod)

// CHoCH og BOS definitioner
choch_sell = ta.crossunder(low, last_high) and close < open
choch_buy = ta.crossover(high, last_low) and close > open
bos_sell = ta.crossunder(low, last_low[1]) and low < last_low[1] and close < open
bos_buy = ta.crossover(high, last_high[1]) and high > last_high[1] and close > open

// Signalbetingelser med valgbare filtre
early_sell_signal = use_momentum_filter ? price_change < -momentum_threshold : true
early_buy_signal = use_momentum_filter ? price_change > momentum_threshold : true
sell_trend_ok = use_trend_filter ? bearish_trend_ok : true
buy_trend_ok = use_trend_filter ? bullish_trend_ok : true
sell_lower_tf_ok = use_lower_tf_filter ? (not lower_tf_bullish and lower_tf_not_neutral) : true
buy_lower_tf_ok = use_lower_tf_filter ? (not lower_tf_bearish and lower_tf_not_neutral) : true
sell_volume_ok = use_volume_filter ? volCondition : true
buy_volume_ok = use_volume_filter ? volCondition : true
sell_breakout_ok = use_breakout_filter ? close < lowestBreakout[1] : true
buy_breakout_ok = use_breakout_filter ? close > highestBreakout[1] : true

// Logik for at begrænse gentagne signaler baseret på restrict_tf_trend
sell_allowed = not restrict_repeated_signals or (last_signal != "Sell" or (last_signal == "Sell" and restrict_tf_trend != last_trend and restrict_tf_trend != -1))
buy_allowed = not restrict_repeated_signals or (last_signal != "Buy" or (last_signal == "Buy" and restrict_tf_trend != last_trend and restrict_tf_trend != 1))

sell_condition = early_sell_signal and (bar_index - last_signal_bar >= min_signal_distance) and sell_trend_ok and sell_lower_tf_ok and sell_volume_ok and sell_breakout_ok and sell_allowed
buy_condition = early_buy_signal and (bar_index - last_signal_bar >= min_signal_distance) and buy_trend_ok and buy_lower_tf_ok and buy_volume_ok and buy_breakout_ok and buy_allowed

get_ready_sell = use_momentum_filter ? (price_change < -pre_momentum_threshold and price_change > -momentum_threshold) : true and (bar_index - last_signal_bar >= min_signal_distance) and sell_trend_ok and sell_lower_tf_ok and sell_volume_ok and sell_breakout_ok
get_ready_buy = use_momentum_filter ? (price_change > pre_momentum_threshold and price_change < momentum_threshold) : true and (bar_index - last_signal_bar >= min_signal_distance) and buy_trend_ok and buy_lower_tf_ok and buy_volume_ok and buy_breakout_ok

// Strategy logic
if buy_condition
    strategy.entry("Long", strategy.long)
    strategy.exit("TP/SL Long", "Long", limit=close + tp_points, stop=close - sl_points)
    label.new(bar_index, low, "Buy", color=color.green, style=label.style_label_up, textcolor=color.white)
    tp_buy_level := high + tp_points
    last_signal := "Buy"
    last_signal_bar := bar_index
    last_trend := restrict_tf_trend

if sell_condition
    strategy.entry("Short", strategy.short)
    strategy.exit("TP/SL Short", "Short", limit=close - tp_points, stop=close + sl_points)
    label.new(bar_index, high, "Sell", color=color.red, style=label.style_label_down, textcolor=color.white)
    tp_sell_level := low - tp_points
    last_signal := "Sell"
    last_signal_bar := bar_index
    last_trend := restrict_tf_trend

// Plot Get Ready signals
if show_get_ready and get_ready_sell
    label.new(bar_index, high, "Get Ready SELL", color=color.orange, style=label.style_label_down, textcolor=color.black, size=size.small)

if show_get_ready and get_ready_buy
    label.new(bar_index, low, "Get Ready BUY", color=color.yellow, style=label.style_label_up, textcolor=color.black, size=size.small)

// Plot CHoCH og BOS som fulde linjer med AI-agtige farver
var line choch_sell_line = na
var line choch_buy_line = na
var line bos_sell_line = na
var line bos_buy_line = na



// Trendlinjer med bufferkontrol og AI-laser-look
var line sup = na
var line res = na

if barstate.islast
    float lowest_y2 = 60000
    int lowest_x2 = 0
    float highest_y2 = 0
    int highest_x2 = 0
    
    // Begræns lookback til max 2000 bars for at undgå bufferfejl
    int maxShortBars = math.min(math.min(shortTrendPeriod, bar_index), 2000)
    for i = 1 to maxShortBars
        if low[i] < lowest_y2
            lowest_y2 := low[i]
            lowest_x2 := i
        if high[i] > highest_y2
            highest_y2 := high[i]
            highest_x2 := i
            
    float lowest_y1 = 60000
    int lowest_x1 = 0
    float highest_y1 = 0
    int highest_x1 = 0
    
    // Begræns lookback til max 2000 bars for at undgå bufferfejl
    int maxLongBars = math.min(math.min(longTrendPeriod, bar_index), 2000)
    for j = shortTrendPeriod + 1 to maxLongBars
        if low[j] < lowest_y1
            lowest_y1 := low[j]
            lowest_x1 := j
        if high[j] > highest_y1
            highest_y1 := high[j]
            highest_x1 := j
            
    int trendStrength = trend_strength_raw

// Plot niveauer
plot(choch_sell_level, title="Last High at CHoCH", color=color.aqua, style=plot.style_circles, linewidth=1, trackprice=false)
plot(choch_buy_level, title="Last Low at CHoCH", color=color.lime, style=plot.style_circles, linewidth=1, trackprice=false)
plot(bos_sell_level, title="Last Low at BOS", color=color.fuchsia, style=plot.style_circles, linewidth=1, trackprice=false)
plot(bos_buy_level, title="Last High at BOS", color=color.teal, style=plot.style_circles, linewidth=1, trackprice=false)
plot(tp_sell_level, title="TP Sell", color=color.red, style=plot.style_circles, linewidth=1, trackprice=false)
plot(tp_buy_level, title="TP Buy", color=color.green, style=plot.style_circles, linewidth=1, trackprice=false)
plot(last_high, title="Last High", color=color.red, style=plot.style_histogram, linewidth=1, trackprice=true)
plot(last_low, title="Last Low", color=color.green, style=plot.style_histogram, linewidth=1, trackprice=true)

// AI Markedsanalyse - Beregn data uanset betingelse
momentum_1h = request.security(syminfo.tickerid, "60", close - close[3], lookahead=barmerge.lookahead_on)
momentum_4h = request.security(syminfo.tickerid, "240", close - close[3], lookahead=barmerge.lookahead_on)
momentum_d = request.security(syminfo.tickerid, "D", close - close[3], lookahead=barmerge.lookahead_on)

// Beregn ATR og SMA(ATR) for hver tidsramme
atr_1h = request.security(syminfo.tickerid, "60", ta.atr(14), lookahead=barmerge.lookahead_on)
atr_4h = request.security(syminfo.tickerid, "240", ta.atr(14), lookahead=barmerge.lookahead_on)
atr_d = request.security(syminfo.tickerid, "D", ta.atr(14), lookahead=barmerge.lookahead_on)
sma_atr_1h = request.security(syminfo.tickerid, "60", ta.sma(ta.atr(14), 20), lookahead=barmerge.lookahead_on)
sma_atr_4h = request.security(syminfo.tickerid, "240", ta.sma(ta.atr(14), 20), lookahead=barmerge.lookahead_on)
sma_atr_d = request.security(syminfo.tickerid, "D", ta.sma(ta.atr(14), 20), lookahead=barmerge.lookahead_on)

// Lokale ATR og SMA(ATR) som fallback
local_atr = ta.atr(14)
local_sma_atr = ta.sma(ta.atr(14), 20)

// Fallback for manglende data
volatility_1h = na(atr_1h) ? local_atr : atr_1h
volatility_4h = na(atr_4h) ? local_atr : atr_4h
volatility_d = na(atr_d) ? local_atr : atr_d
volatility_avg_1h = na(sma_atr_1h) ? local_sma_atr : sma_atr_1h
volatility_avg_4h = na(sma_atr_4h) ? local_sma_atr : sma_atr_4h
volatility_avg_d = na(sma_atr_d) ? local_sma_atr : sma_atr_d
momentum_1h := na(momentum_1h) ? 0 : momentum_1h
momentum_4h := na(momentum_4h) ? 0 : momentum_4h
momentum_d := na(momentum_d) ? 0 : momentum_d

// Analyse baseret på trend, momentum og volatilitet
score_1h = trend60 + (momentum_1h > 0 ? 0.5 : momentum_1h < 0 ? -0.5 : 0) + (volatility_1h > volatility_avg_1h ? 0.5 : 0)
score_4h = trend240 + (momentum_4h > 0 ? 0.5 : momentum_4h < 0 ? -0.5 : 0) + (volatility_4h > volatility_avg_4h ? 0.5 : 0)
score_d = trendD + (momentum_d > 0 ? 0.5 : momentum_d < 0 ? -0.5 : 0) + (volatility_d > volatility_avg_d ? 0.5 : 0)

// Forudsigelser
pred_1h = score_1h > 0.5 ? "Up" : score_1h < -0.5 ? "Down" : "Neutral"
pred_4h = score_4h > 0.5 ? "Up" : score_4h < -0.5 ? "Down" : "Neutral"
pred_d = score_d > 0.5 ? "Up" : score_d < -0.5 ? "Down" : "Neutral"

// Futuristisk AI-Trend Dashboard
var table trendTable = table.new(position.top_right, columns=2, rows=6, bgcolor=color.new(color.black, 50), border_width=2, border_color=color.new(color.teal, 20))
table.cell(trendTable, 0, 0, "AI-Trend Matrix v2.10", text_color=color.new(color.aqua, 0), bgcolor=color.new(color.navy, 60))
table.cell(trendTable, 1, 0, "", bgcolor=color.new(color.navy, 60))
table.merge_cells(trendTable, 0, 0, 1, 0)
table.cell(trendTable, 0, 1, "Trend Strength", text_color=color.white)
table.cell(trendTable, 1, 1, str.tostring(math.round(trend_strength)), text_color=trend_strength > 0 ? color.rgb(0, math.min(255, trend_strength * 2.55), 0) : color.rgb(math.min(255, math.abs(trend_strength) * 2.55), 0, 0))
table.cell(trendTable, 0, 2, "AI Confidence", text_color=color.white)
table.cell(trendTable, 1, 2, str.tostring(ai_confidence) + "%", text_color=color.teal)
table.cell(trendTable, 0, 3, "AI Calibration", text_color=color.white)
table.cell(trendTable, 1, 3, "CVD: " + str.tostring(math.round(raw_cvd)) + " (" + cvd_level + ")", text_color=cvd_color)
table.cell(trendTable, 0, 4, "1H", text_color=color.white)
table.cell(trendTable, 1, 4, trend60 == 1 ? "Up" : trend60 == -1 ? "Down" : "Neutral", text_color=trend60 == 1 ? color.lime : trend60 == -1 ? color.fuchsia : color.yellow)
table.cell(trendTable, 0, 5, "4H", text_color=color.white)
table.cell(trendTable, 1, 5, trend240 == 1 ? "Up" : trend240 == -1 ? "Down" : "Neutral", text_color=trend240 == 1 ? color.lime : trend240 == -1 ? color.fuchsia : color.yellow)

// Tabel for AI Markedsanalyse
if enable_ai_analysis
    var table ai_table = table.new(f_getTablePosition(ai_table_position), columns=4, rows=2, bgcolor=color.new(color.black, 50), border_width=2, border_color=color.new(color.teal, 20))
    table.cell(ai_table, 0, 0, "AI Market Analysis", text_color=color.new(color.aqua, 0), bgcolor=color.new(color.navy, 60))
    table.cell(ai_table, 1, 0, "1H", text_color=color.white)
    table.cell(ai_table, 2, 0, "4H", text_color=color.white)
    table.cell(ai_table, 3, 0, "1D", text_color=color.white)
    table.cell(ai_table, 0, 1, "Prediction", text_color=color.white)
    table.cell(ai_table, 1, 1, pred_1h, text_color=pred_1h == "Up" ? color.lime : pred_1h == "Down" ? color.fuchsia : color.yellow)
    table.cell(ai_table, 2, 1, pred_4h, text_color=pred_4h == "Up" ? color.lime : pred_4h == "Down" ? color.fuchsia : color.yellow)
    table.cell(ai_table, 3, 1, pred_d, text_color=pred_d == "Up" ? color.lime : pred_d == "Down" ? color.fuchsia : color.yellow)

// Debug alerts for null data
if na(ema60) or na(vwap60)
    alert("Warning: 60-minute timeframe data is null!", alert.freq_once_per_bar)
if na(ema240) or na(vwap240)
    alert("Warning: 240-minute timeframe data is null!", alert.freq_once_per_bar)
if na(emaD) or na(vwapD)
    alert("Warning: Daily timeframe data is null!", alert.freq_once_per_bar)