box для визуализации частичного (касание границы) и полного (полное перекрытие диапазона) теста имбаланса.Исходный код
В современной алгоритмической торговле концепция Smart Money Concepts (SMC) занимает лидирующие позиции. Одним из ключевых элементов этой методологии является Fair Value Gap (FVG), или имбаланс. Он возникает, когда на рынке наблюдается резкий односторонний импульс, оставляющий за собой неэффективно распределенную ликвидность. Ранее мы рассматривали другие сложные алгоритмы, например, в статье Pine Script v5: Поиск паттерна ‘Три маленьких индейца’ с циклами for, а сегодня сфокусируемся на динамическом отслеживании зон имбаланса.
Обычные индикаторы FVG просто рисуют прямоугольники на истории, засоряя график. Профессиональный подход требует отслеживания состояния зон: была ли зона протестирована частично (цена зашла внутрь имбаланса) или полностью перекрыта (mitigated). Это критически важно для построения торговых систем, так как полностью перекрытый имбаланс теряет свою силу как уровень поддержки или сопротивления.
Ниже представлен оптимизированный код индикатора на языке Pine Script v5. Он использует современные возможности языка, такие как пользовательские типы данных (type) и динамические массивы объектов для эффективного управления памятью терминала TradingView.
//@version=5
indicator("QuantFVG: Fair Value Gap with Mitigation Tracker", overlay=true, max_boxes_count=500)
// --- Inputs ---
grp_fvg = "FVG Detection Settings"
min_gap_pct = input.float(0.02, "Min Gap Size (%)", minval=0.0, step=0.01, group=grp_fvg, tooltip="Filters out small gaps. Percentage of the middle candle's close.")
grp_style = "Visual Settings"
bull_color = input.color(color.new(#26a69a, 85), "Bullish FVG Color", group=grp_style)
bear_color = input.color(color.new(#ef5350, 85), "Bearish FVG Color", group=grp_style)
part_mit_color = input.color(color.new(#ff9800, 80), "Partial Mitigation Color", group=grp_style)
full_mit_color = input.color(color.new(#9e9e9e, 90), "Full Mitigation Color", group=grp_style)
grp_mgmt = "Management Settings"
keep_mitigated = input.bool(true, "Keep Mitigated FVGs?", group=grp_mgmt, tooltip="If false, fully mitigated FVGs will be deleted from the chart.")
max_history = input.int(300, "Max History Bars", minval=50, group=grp_mgmt, tooltip="Deletes old boxes to optimize performance.")
// --- User Defined Types (UDT) ---
type FvgInstance
box fvg_box
float top
float bottom
bool is_bullish
bool is_mitigated
bool is_partially_mitigated
int start_bar
// --- Persistent Storage ---
var FvgInstance[] active_fvgs = array.new()
// --- FVG Detection Logic ---
float threshold = close[1] * (min_gap_pct / 100.0)
bool is_bull_fvg = (low[0] - high[2]) > threshold and close[1] > high[2]
bool is_bear_fvg = (low[2] - high[0]) > threshold and close[1] < low[2]
// --- Create FVG Objects ---
if is_bull_fvg
float top_val = low[0]
float bot_val = high[2]
box b = box.new(
left=bar_index - 2,
top=top_val,
right=bar_index,
bottom=bot_val,
bgcolor=bull_color,
border_color=color.new(bull_color, 30),
border_style=line.style_solid
)
array.push(active_fvgs, FvgInstance.new(b, top_val, bot_val, true, false, false, bar_index - 2))
if is_bear_fvg
float top_val = low[2]
float bot_val = high[0]
box b = box.new(
left=bar_index - 2,
top=top_val,
right=bar_index,
bottom=bot_val,
bgcolor=bear_color,
border_color=color.new(bear_color, 30),
border_style=line.style_solid
)
array.push(active_fvgs, FvgInstance.new(b, top_val, bot_val, false, false, false, bar_index - 2))
// --- Update and Mitigation Tracking ---
if array.size(active_fvgs) > 0
for i = array.size(active_fvgs) - 1 to 0 by 1
FvgInstance fvg = array.get(active_fvgs, i)
// Check if the box is too old
if (bar_index - fvg.start_bar) > max_history
box.delete(fvg.fvg_box)
array.remove(active_fvgs, i)
continue
if not fvg.is_mitigated
// Extend the box to the current bar
box.set_right(fvg.fvg_box, bar_index)
if fvg.is_bullish
// Partial mitigation: price dips below the top of the bullish FVG
if low[0] < fvg.top and not fvg.is_partially_mitigated
fvg.is_partially_mitigated := true
box.set_bgcolor(fvg.fvg_box, part_mit_color)
box.set_border_color(fvg.fvg_box, color.new(part_mit_color, 40))
// Full mitigation: price dips below or equals the bottom of the bullish FVG
if low[0] <= fvg.bottom
fvg.is_mitigated := true
if keep_mitigated
box.set_bgcolor(fvg.fvg_box, full_mit_color)
box.set_border_color(fvg.fvg_box, color.new(full_mit_color, 60))
box.set_border_style(fvg.fvg_box, line.style_dashed)
else
box.delete(fvg.fvg_box)
array.remove(active_fvgs, i)
continue
else
// Partial mitigation: price rises above the bottom of the bearish FVG
if high[0] > fvg.bottom and not fvg.is_partially_mitigated
fvg.is_partially_mitigated := true
box.set_bgcolor(fvg.fvg_box, part_mit_color)
box.set_border_color(fvg.fvg_box, color.new(part_mit_color, 40))
// Full mitigation: price rises above or equals the top of the bearish FVG
if high[0] >= fvg.top
fvg.is_mitigated := true
if keep_mitigated
box.set_bgcolor(fvg.fvg_box, full_mit_color)
box.set_border_color(fvg.fvg_box, color.new(full_mit_color, 60))
box.set_border_style(fvg.fvg_box, line.style_dashed)
else
box.delete(fvg.fvg_box)
array.remove(active_fvgs, i)
continue Разбор параметров
Для гибкой настройки индикатора под различные таймфреймы и торговые инструменты мы вынесли ключевые переменные в панель настроек:
Min Gap Size (%): Минимальный размер имбаланса в процентах от цены закрытия сигнальной свечи. Позволяет отсеивать рыночный шум на волатильных активах. Например, при анализе спредов, как в статье RSI для спреда ETH/BTC в Pine Script v5: расчет и визуализация, фильтрация шума критически важна.Keep Mitigated FVGs?: Определяет, нужно ли оставлять полностью перекрытые зоны на графике. Если отключить, отработавшие зоны будут удаляться, освобождая визуальное пространство.Max History Bars: Ограничение глубины проверки в барах. Это оптимизирует производительность скрипта и предотвращает переполнение лимитов TradingView на количество графических объектов.Visual Colors: Настройки цвета для бычьего (Bullish FVG Color), медвежьего (Bearish FVG Color), частично перекрытого (Partial Mitigation Color) и полностью протестированного имбаланса.
Как запустить
Чтобы запустить индикатор на графике TradingView, выполните следующие шаги:
1. Откройте терминал TradingView и выберите нужный вам финансовый инструмент.
2. В нижней панели откройте вкладку Pine Editor.
3. Скопируйте представленный выше код и вставьте его в редактор, полностью заменив дефолтный шаблон.
4. Нажмите кнопку Add to Chart (Добавить на график) в правом верхнем углу редактора.
5. Настройте параметры фильтрации под ваш таймфрейм через иконку шестеренки в названии индикатора.
Этот индикатор отлично подходит для генерации сигналов в автоматизированных торговых системах. Вы можете настроить отправку алертов на пробитие или перекрытие зон и связать их с торговым ботом, используя руководство по интеграции Pine Script v5 с Finandy через вебхуки.




