32 KiB
32 KiB
Архитектура: Система Ликвидности
Источник: TradingView Pine Script v6 - ICT Entry V2 [TS_Indie] Дата создания: 2026-02-03
1. ОБЗОР СИСТЕМЫ ЛИКВИДНОСТИ
Система ликвидности определяет уровни, где скапливаются стоп-лоссы. Пробой (sweep) этих уровней активирует торговые условия.
Источник данных: Liquidity Swings (Len=5, красные точки)
┌─────────────────────────────────────────────────────────────────────────────┐
│ ПОТОК ДАННЫХ ЛИКВИДНОСТИ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Liquidity Swings (Len=5) │
│ │ │
│ │ Ch_swh=true AND sw_high >= ph │
│ │ Ch_swl=true AND sw_low <= pl │
│ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ lid_sup[] (Supply) │ │ lid_dem[] (Demand) │ │
│ │ lid_bar_sup[] │ │ lid_bar_dem[] │ │
│ │ (Swing Highs) │ │ (Swing Lows) │ │
│ └──────────┬──────────┘ └──────────┬──────────┘ │
│ │ │ │
│ │ high >= lid_sup[0] │ low <= lid_dem[0] │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ SWEEP SUPPLY │ │ SWEEP DEMAND │ │
│ │ break_sup=true │ │ break_dem=true │ │
│ │ value_sup_lid=... │ │ value_dem_lid=... │ │
│ └──────────┬──────────┘ └──────────┬──────────┘ │
│ │ │ │
│ │ close < value_sup_lid │ close > value_dem_lid │
│ │ open < value_sup_lid │ open > value_dem_lid │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ con_sell=true │ │ con_buy=true │ │
│ └──────────┬──────────┘ └──────────┬──────────┘ │
│ │ │ │
│ │ + FVG/iFVG условия │ + FVG/iFVG условия │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ sell_signal=true │ │ buy_signal=true │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
2. СТРУКТУРЫ ДАННЫХ
2.1 Массивы уровней ликвидности
| Массив | Тип | Размер | Описание |
|---|---|---|---|
lid_sup[] |
float | ar_q (9000) | Уровни Supply (Swing Highs) |
lid_dem[] |
float | ar_q (9000) | Уровни Demand (Swing Lows) |
lid_bar_sup[] |
int (time) | ar_q | Время уровней Supply |
lid_bar_dem[] |
int (time) | ar_q | Время уровней Demand |
2.2 Массивы линий отображения
| Массив | Тип | Размер | Описание |
|---|---|---|---|
line_lid_s |
line | Lid_show | Активные линии Supply |
line_lid_d |
line | Lid_show | Активные линии Demand |
label_lid_s |
label | Lid_show | Метки Supply |
label_lid_d |
label | Lid_show | Метки Demand |
mit_lid_s |
line | Lid_ss | Фиксированные линии Supply (история) |
mit_lid_d |
line | Lid_ss | Фиксированные линии Demand (история) |
mit_lid_lbl_s |
label | Lid_ss | Метки истории Supply |
mit_lid_lbl_d |
label | Lid_ss | Метки истории Demand |
2.3 Переменные состояния
| Переменная | Тип | Описание |
|---|---|---|
break_dem |
bool | Sweep Demand произошёл на этом баре |
break_sup |
bool | Sweep Supply произошёл на этом баре |
con_buy |
bool (var) | Условие Buy активно |
con_sell |
bool (var) | Условие Sell активно |
value_dem_lid |
float (var) | Значение последнего swept Demand уровня |
value_sup_lid |
float (var) | Значение последнего swept Supply уровня |
pre_bar_Dlid_left |
int (var) | Левая временная координата swept Demand |
pre_bar_Dlid_right |
int (var) | Правая временная координата swept Demand |
pre_bar_Slid_left |
int (var) | Левая временная координата swept Supply |
pre_bar_Slid_right |
int (var) | Правая временная координата swept Supply |
3. ДОБАВЛЕНИЕ УРОВНЕЙ ЛИКВИДНОСТИ
Условия добавления (из tz.md, строки 601-604):
// Supply уровень (Swing High → lid_sup)
if Ch_swh and sw_high >= ph:
unshift_remove(lid_sup, sw_high)
unshift_remove(lid_bar_sup, time[bar_index - Bar_sw_high])
// Demand уровень (Swing Low → lid_dem)
if Ch_swl and sw_low <= pl:
unshift_remove(lid_dem, sw_low)
unshift_remove(lid_bar_dem, time[bar_index - Bar_sw_low])
Логика:
Ch_swh= новый Swing High подтверждён (из Liquidity Swings)Ch_swl= новый Swing Low подтверждёнsw_high >= ph= swing high на уровне или выше недавнего максимумаsw_low <= pl= swing low на уровне или ниже недавнего минимумаph=ta.highest(Len)- максимум за последние Len баровpl=ta.lowest(Len)- минимум за последние Len баров
Функция unshift_remove:
unshift_remove(array, new_value) =>
array.unshift(array, new_value) // Добавить в начало
array.remove(array, array.size(array)-1) // Удалить последний
4. SWEEP ЛОГИКА (ПРОБОЙ ЛИКВИДНОСТИ)
4.1 Sweep Demand (tz.md, строки 608-620)
УСЛОВИЕ: low <= array.get(lid_dem, 0)
(лоу текущего бара касается/пробивает ближайший Demand уровень)
АЛГОРИТМ:
for i = 0 to ar_q-1:
1. Сохранить значения swept уровня:
value_dem_lid := array.get(lid_dem, 0)
pre_bar_Dlid_left := array.get(lid_bar_dem, 0)
pre_bar_Dlid_right := time
2. Если show_lid включён:
- Создать фиксированную линию (история)
- Создать метку с текстом txt_lid
3. Удалить уровень из активных массивов:
value_delet_Push1(lid_dem, 0)
value_delet_Push1(lid_bar_dem, 0)
Delete_line_lbl_Push(line_lid_d, label_lid_d, 0)
4. Проверка выхода из цикла:
if low > array.get(lid_dem, 0) or na(array.get(lid_dem, 0)):
break
break_dem := true
4.2 Sweep Supply (tz.md, строки 622-634)
УСЛОВИЕ: high >= array.get(lid_sup, 0)
(хай текущего бара касается/пробивает ближайший Supply уровень)
АЛГОРИТМ:
for i = 0 to ar_q-1:
1. Сохранить значения swept уровня:
value_sup_lid := array.get(lid_sup, 0)
pre_bar_Slid_left := array.get(lid_bar_sup, 0)
pre_bar_Slid_right := time
2. Если show_lid включён:
- Создать фиксированную линию (история)
- Создать метку
3. Удалить уровень из активных массивов
4. Проверка выхода из цикла:
if high < array.get(lid_sup, 0) or na(array.get(lid_sup, 0)):
break
break_sup := true
ВАЖНО: Sweep может пробить НЕСКОЛЬКО уровней за один бар! Цикл продолжается пока текущий лоу/хай пробивает уровни.
5. АКТИВАЦИЯ ТОРГОВЫХ УСЛОВИЙ
5.1 con_buy (tz.md, строки 921-933)
АКТИВАЦИЯ:
if break_dem AND // Sweep Demand произошёл
close > value_dem_lid AND // Закрытие выше swept уровня
open > value_dem_lid AND // Открытие выше swept уровня
barstate.isconfirmed AND // Бар подтверждён
strategy.position_size == 0: // Нет открытой позиции
if B_long: // Buy разрешён
con_buy := true
// Сохранить данные для отрисовки
pre_dem_lid := value_dem_lid
pre2_bar_Dlid_left := pre_bar_Dlid_left
pre2_bar_Dlid_right := pre_bar_Dlid_right
con_sell := false // Отменить противоположное условие
ДЕАКТИВАЦИЯ:
if B_long AND barstate.isconfirmed AND
(close < value_dem_lid OR // Цена вернулась под swept уровень
(NOT con_time AND con_time[1])): // ИЛИ вышли из торговой сессии
con_buy := false
5.2 con_sell (tz.md, строки 965-977)
АКТИВАЦИЯ:
if break_sup AND // Sweep Supply произошёл
close < value_sup_lid AND // Закрытие ниже swept уровня
open < value_sup_lid AND // Открытие ниже swept уровня
barstate.isconfirmed AND
strategy.position_size == 0:
if S_short: // Sell разрешён
con_sell := true
pre_sup_lid := value_sup_lid
pre2_bar_Slid_left := pre_bar_Slid_left
pre2_bar_Slid_right := pre_bar_Slid_right
con_buy := false // Отменить противоположное условие
ДЕАКТИВАЦИЯ:
if S_short AND barstate.isconfirmed AND
(close > value_sup_lid OR // Цена вернулась над swept уровень
(NOT con_time AND con_time[1])):
con_sell := false
6. ДИАГРАММА СОСТОЯНИЙ con_buy/con_sell
┌─────────────────────────────────────────────────────────────────────────────┐
│ ЖИЗНЕННЫЙ ЦИКЛ con_buy │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────┐ │
│ │ con_buy = false │ ◀─────────────────────────────────────────────┐ │
│ └──────────┬─────────┘ │ │
│ │ │ │
│ │ break_dem = true │ │
│ │ close > value_dem_lid │ │
│ │ open > value_dem_lid │ │
│ │ position_size == 0 │ │
│ ▼ │ │
│ ┌────────────────────┐ │ │
│ │ con_buy = true │ │ │
│ │ (ожидание iFVG) │──────────────────────────────────────────────┼────│
│ └──────────┬─────────┘ │ │
│ │ │ │
│ ┌─────┴───────────────────────────────────────┐ │ │
│ │ │ │ │
│ ▼ ▼ │ │
│ close < value_dem_lid iFVG условия выполнены │ │
│ ИЛИ вышли из сессии Check_gap_buy = true │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌────────────────────┐ │ │
│ │ │ buy_signal = true │ │ │
│ │ │ con_buy := false │─────┘ │
│ │ └────────────────────┘ │
│ │ │
│ └───────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────────┘
7. ОТРИСОВКА ЛИНИЙ ЛИКВИДНОСТИ
7.1 Активные линии (tz.md, строки 636-655)
if show_lid and Turn_off:
// Demand линии
if not na(array.get(lid_dem, 0)):
for i = 0 to Lid_show-1:
line.delete(array.get(line_lid_d, i))
label.delete(array.get(label_lid_d, i))
if na(array.get(lid_dem, i)):
break
x_value = array.get(lid_bar_dem, i)
y_value = array.get(lid_dem, i)
// Активная линия: от свинга до правого края
array.set(line_lid_d, i, line.new(
x_value, y_value,
time_set, y_value, // time_set = будущее время
xloc = xloc.bar_time,
color = Lid_color,
style = get_line_style(Lid_style)))
// Метка справа
array.set(label_lid_d, i, label.new(
time_lbl, y_value,
xloc = xloc.bar_time,
text = txt_lid, // "Liq" и т.д.
color = TRANSP,
textcolor = Lid_txt_color,
style = label.style_label_center))
// Supply линии - аналогично
7.2 Фиксированные линии (при sweep)
// При sweep Demand (строки 612-615):
if show_lid and Turn_off:
x_value = array.get(lid_bar_dem, 0)
y_value = array.get(lid_dem, 0)
bar_lbl = (x_value + time) / 2 // Середина линии
// Фиксированная линия (от свинга до момента sweep)
Line_mit_unshift(mit_lid_d, line.new(
x_value, y_value,
time, y_value, // time = текущее время (момент sweep)
xloc = xloc.bar_time,
color = Lid_color,
style = get_line_style(Lid_style)))
// Метка в центре линии
label_mit_unshift(mit_lid_lbl_d, label.new(
bar_lbl, y_value,
xloc = xloc.bar_time,
text = txt_lid,
color = TRANSP,
textcolor = Lid_txt_color,
style = label.style_label_center))
8. ЖИЗНЕННЫЙ ЦИКЛ ЛИНИИ ЛИКВИДНОСТИ
┌─────────────────────────────────────────────────────────────────────────────┐
│ ЖИЗНЕННЫЙ ЦИКЛ ЛИНИИ ЛИКВИДНОСТИ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. СОЗДАНИЕ УРОВНЯ │
│ ──────────────── │
│ Когда: Ch_swh=true AND sw_high >= ph (или Ch_swl для Demand) │
│ Что: unshift_remove(lid_sup, sw_high) │
│ unshift_remove(lid_bar_sup, time) │
│ Результат: Уровень добавлен в массив │
│ │
│ 2. ОТРИСОВКА АКТИВНОЙ ЛИНИИ (каждый бар) │
│ ──────────────────────────────────────── │
│ Условие: show_lid = true │
│ Что: На каждом баре: │
│ - line.delete(старая) + label.delete(старая) │
│ - line.new(time_свинга → time_set) │
│ - label.new(справа) │
│ Результат: Линия продлевается вправо │
│ │
│ 3. SWEEP (пробой) │
│ ────────────── │
│ Условие: low <= lid_dem[0] (или high >= lid_sup[0]) │
│ Что происходит: │
│ a) Сохраняем value_dem_lid, pre_bar_Dlid_left/right │
│ b) Создаём ФИКСИРОВАННУЮ линию (mit_lid_d[]) │
│ - Левый край: время свинга │
│ - Правый край: текущее время (НЕ продлевается!) │
│ c) Удаляем из lid_dem[], lid_bar_dem[] │
│ d) Удаляем активную линию/метку │
│ e) break_dem := true │
│ f) Проверяем следующий уровень (может пробить несколько!) │
│ │
│ 4. ИСТОРИЯ │
│ ───────── │
│ Фиксированные линии хранятся в mit_lid_d[] (размер Lid_ss) │
│ При добавлении новой - самая старая удаляется │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
9. ПАРАМЕТРЫ КОНФИГУРАЦИИ
| Параметр | По умолчанию | Описание |
|---|---|---|
Len |
5 | Сила Liquidity Pivot (для определения уровней) |
Lid_show |
(настр.) | Количество отображаемых активных линий |
Lid_ss |
(настр.) | Количество линий истории |
show_lid |
true | Показывать линии ликвидности |
Lid_color |
(настр.) | Цвет линий ликвидности |
Lid_style |
(настр.) | Стиль линий |
txt_lid |
"Liq" | Текст меток |
Lid_txt_color |
(настр.) | Цвет текста меток |
10. СВЯЗЬ С ДРУГИМИ МОДУЛЯМИ
┌─────────────────────────────────────────────────────────────────────────────┐
│ │
│ ARCHITECTURE_SWINGS_BOS_MSS.md ARCHITECTURE_LIQUIDITY.md │
│ ───────────────────────────── ───────────────────────── │
│ │
│ Liquidity Swings (Len=5) ────────► lid_sup[], lid_dem[] │
│ Ch_swh, Ch_swl, sw_high, sw_low │ │
│ │ │
│ Structure Swings (Len_in=10) │ │
│ In_Dir_Big (тренд) ───────────────► up_trend, down_trend │
│ (фильтрация con_buy/sell) │
│ │ │
│ Premium/Discount ─────────────────► EQ_entry_buy/sell │
│ (фильтрация Entry) │
│ │ │
│ ▼ │
│ ARCHITECTURE_FVG.md │
│ ───────────────────── │
│ dfvg[], sfvg[] (FVG) │
│ dfvg_R2[], sfvg_R2[] (iFVG) │
│ │ │
│ ▼ │
│ ARCHITECTURE_ENTRY.md │
│ ────────────────────── │
│ buy_signal, sell_signal │
│ Entry/SL/TP расчёт │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
11. ПСЕВДОКОД ДЛЯ MQL5
// ============ СТРУКТУРЫ ДАННЫХ ============
// Массивы уровней (используем CArrayDouble и CArrayLong)
CArrayDouble m_lid_sup; // Supply levels
CArrayDouble m_lid_dem; // Demand levels
CArrayLong m_lid_bar_sup; // Supply times
CArrayLong m_lid_bar_dem; // Demand times
// Переменные состояния
bool m_break_dem = false;
bool m_break_sup = false;
bool m_con_buy = false;
bool m_con_sell = false;
double m_value_dem_lid = 0;
double m_value_sup_lid = 0;
datetime m_pre_bar_Dlid_left = 0;
datetime m_pre_bar_Dlid_right = 0;
datetime m_pre_bar_Slid_left = 0;
datetime m_pre_bar_Slid_right = 0;
// ============ ДОБАВЛЕНИЕ УРОВНЕЙ ============
void AddLiquidityLevels(bool ch_swh, bool ch_swl,
double sw_high, double sw_low,
datetime bar_sw_high, datetime bar_sw_low,
double ph, double pl)
{
// Supply level (from Swing High)
if(ch_swh && sw_high >= ph)
{
m_lid_sup.InsertSort(sw_high); // Или unshift логика
m_lid_bar_sup.InsertSort(bar_sw_high);
// Удалить последний если размер > ar_q
}
// Demand level (from Swing Low)
if(ch_swl && sw_low <= pl)
{
m_lid_dem.InsertSort(sw_low);
m_lid_bar_dem.InsertSort(bar_sw_low);
}
}
// ============ SWEEP ЛОГИКА ============
void CheckSweep(double low, double high, datetime time)
{
m_break_dem = false;
m_break_sup = false;
// Sweep Demand
if(m_lid_dem.Total() > 0 && low <= m_lid_dem[0])
{
while(m_lid_dem.Total() > 0 && low <= m_lid_dem[0])
{
m_value_dem_lid = m_lid_dem[0];
m_pre_bar_Dlid_left = m_lid_bar_dem[0];
m_pre_bar_Dlid_right = time;
// Создать фиксированную линию
CreateFixedLiquidityLine(m_pre_bar_Dlid_left, m_value_dem_lid,
time, m_value_dem_lid, true);
// Удалить из массивов
m_lid_dem.Delete(0);
m_lid_bar_dem.Delete(0);
// Удалить активную линию
DeleteActiveLiquidityLine(0, true);
}
m_break_dem = true;
}
// Sweep Supply (аналогично)
if(m_lid_sup.Total() > 0 && high >= m_lid_sup[0])
{
while(m_lid_sup.Total() > 0 && high >= m_lid_sup[0])
{
m_value_sup_lid = m_lid_sup[0];
m_pre_bar_Slid_left = m_lid_bar_sup[0];
m_pre_bar_Slid_right = time;
CreateFixedLiquidityLine(...);
m_lid_sup.Delete(0);
m_lid_bar_sup.Delete(0);
DeleteActiveLiquidityLine(0, false);
}
m_break_sup = true;
}
}
// ============ АКТИВАЦИЯ УСЛОВИЙ ============
void CheckConditions(double close, double open, bool is_confirmed,
double position_size, bool b_long, bool s_short,
bool con_time)
{
// con_buy активация
if(m_break_dem && close > m_value_dem_lid && open > m_value_dem_lid &&
is_confirmed && position_size == 0)
{
if(b_long)
{
m_con_buy = true;
// Сохранить pre_dem_lid, pre2_bar_Dlid_left/right
}
m_con_sell = false;
}
// con_buy деактивация
if(b_long && is_confirmed &&
(close < m_value_dem_lid || !con_time))
{
m_con_buy = false;
}
// con_sell (аналогично)
if(m_break_sup && close < m_value_sup_lid && open < m_value_sup_lid &&
is_confirmed && position_size == 0)
{
if(s_short)
{
m_con_sell = true;
}
m_con_buy = false;
}
if(s_short && is_confirmed &&
(close > m_value_sup_lid || !con_time))
{
m_con_sell = false;
}
}
// ============ ОТРИСОВКА ============
void DrawActiveLiquidityLines(datetime time_set)
{
if(!inp_show_lid) return;
// Demand линии
for(int i = 0; i < m_lid_dem.Total() && i < inp_lid_show; i++)
{
double level = m_lid_dem[i];
datetime time_start = m_lid_bar_dem[i];
// Обновить или создать линию
UpdateLiquidityLine(i, true, time_start, level, time_set, level);
}
// Supply линии
for(int i = 0; i < m_lid_sup.Total() && i < inp_lid_show; i++)
{
double level = m_lid_sup[i];
datetime time_start = m_lid_bar_sup[i];
UpdateLiquidityLine(i, false, time_start, level, time_set, level);
}
}
СЛЕДУЮЩИЕ ШАГИ РЕАЛИЗАЦИИ
- Модуль Liquidity Levels - массивы lid_sup/lid_dem, добавление уровней
- Модуль Sweep - логика пробоя, break_dem/break_sup
- Модуль Conditions - con_buy/con_sell, активация/деактивация
- Модуль Drawing - активные и фиксированные линии
- Интеграция - связь с Swings (входные данные) и FVG (выходные сигналы)