Профиль ликвидности SMC TEMA ДС/ПС
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «liquidity profile_smc_tema_dsps$.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Этот индикатор TradingView отображает на графике комплексный анализ ликвидности и рыночной структуры. Он рассчитывает объемный профиль с точкой контроля (POC), визуализируя распределение торгового объема по ценовым уровням, и отображает ограничивающую рамку профиля. Индикатор определяет направление тренда с помощью скользящих средних и стандартного отклонения, отслеживает ликвидационные сдвиги и рисует линии рыночной структуры в зависимости от текущего тренда. Дополнительно отображаются зоны поддержки и спроса, пропуски справедливой стоимости (FVG), а также линии и метки многотаймфреймных зон покупки и продажи. Встроена визуализация Heikin Ashi с наложением быстрых, средних и медленных EMA с заливкой областей между ними.
Настройки программы
| Настройка | Описание |
|---|---|
| len | Количество периодов для расчета тренда. Большая длина создает более плавный и долгосрочный сигнал |
| mult | Множитель для расчета стандартного отклонения. Большие значения создают более широкие полосы и делают индикатор менее чувствительным к шуму |
| src | Ценовые данные для расчетов. Обычно используется цена закрытия, но можно также использовать open, high, low, hl2, hlc3 или ohlc4 |
| major_sweep_thresh | Пороговое значение для определения крупных ликвидационных сдвигов. Большие значения означают, что только более значительные движения будут считаться крупными сдвигами |
| show_profile | Отображать визуализацию объемного профиля. Показывает распределение объема торгов по ценовым уровням |
| show_bounds | Отображать рамку вокруг объемного профиля для четкого определения границ |
| res | Количество баров в объемном профиле. Большие значения создают более детализированные профили |
| scale | Контролирует ширину отображения объемного профиля. Большие значения делают профиль шире |
| bullColor | Цвет для бычьих трендов и индикаторов |
| bearColor | Цвет для медвежьих трендов и индикаторов |
| pc1 | Цвет визуализации объемного профиля |
| dismiss | Отключает предупреждение при отсутствии данных об объеме |
| draw_structure | Показать Рыночную Структуру |
| line_width | Толщина линий РС |
| line_up_color | Цвет линии движения вверх |
| line_down_color | Цвет линии движения вниз |
| draw_supply | Показать Поддержку |
| draw_demand | Показать Спрос |
| supply_bg_color | Цвет фона зон поддержки |
| supply_border_color | Цвет границы зон поддержки |
| demand_bg_color | Цвет фона зон спроса |
| demand_border_color | Цвет границы зон спроса |
| drawFVG | Рисовать FVG |
| bullishGapColor | Цвет бычьего FVG |
| bearishGapColor | Цвет медвежьего FVG |
| emaslow | Период быстрой EMA |
| emaslow2 | Период средней EMA |
| emaslow3 | Период медленной EMA |
| inputTimeframe | Таймфрейм для анализа |
| showLines | Показывать линии |
| lineAt | Линия зоны покупки по |
| lineAtBull | Линия зоны продажи по |
| lineColorBuy | Цвет линий продажи |
| lineColorSell | Цвет линий покупки |
| lineWidth | Толщина линий |
| maxLines | Макс. линий |
| lineExtension | Удлинение линии (баров) |
| showLabel | Показывать метки |
| labelOffsetTicks | Смещение метки (тиков) |
| labelColorBuy | Цвет меток продажи |
| labelColorSell | Цвет меток покупки |
| labelTextColor | Цвет текста меток |
| graceBars | Период ожидания (баров) |
Поиск по коду файла
indicator("<[$/Профиль ликвидности_SMC_TEMA_ДС/ПС/$]>", shorttitle="<{PL_SMC_TEMA_ДС/ПС}>", overlay=true, max_lines_count=500, max_boxes_count=500, max_labels_count=500, max_bars_back=5000)
len = input.int(10, "Длина", minval=1, tooltip="Количество периодов для расчета тренда. Большая длина создает более плавный и долгосрочный сигнал", group="Настройки тренда")
mult = input.float(1.2, "Множитель", minval=0.1, step=0.1, tooltip="Множитель для расчета стандартного отклонения. Большие значения создают более широкие полосы и делают индикатор менее чувствительным к шуму", group="Настройки тренда")
src = input.source(close, "Источник", tooltip="Ценовые данные для расчетов. Обычно используется цена закрытия, но можно также использовать open, high, low, hl2, hlc3 или ohlc4", group="Настройки тренда")
major_sweep_thresh = input.float(30, "Порог крупного сдвига", minval=0, tooltip="Пороговое значение для определения крупных ликвидационных сдвигов. Большие значения означают, что только более значительные движения будут считаться крупными сдвигами", group="Настройки тренда")
show_profile = input.bool(true, "Показывать объемный профиль", tooltip="Отображать визуализацию объемного профиля. Показывает распределение объема торгов по ценовым уровням", group="Настройки профиля")
show_bounds = input.bool(true, "Показывать ограничивающую рамку", tooltip="Отображать рамку вокруг объемного профиля для четкого определения границ", group="Настройки профиля")
res = input.int(68, "Разрешение", minval=1, tooltip="Количество баров в объемном профиле. Большие значения создают более детализированные профили", group="Настройки профиля")
scale = input.int(13, "Масштаб", minval=1, tooltip="Контролирует ширину отображения объемного профиля. Большие значения делают профиль шире", group="Настройки профиля")
bullColor = input.color(#005082, "Цвет быков", tooltip="Цвет для бычьих трендов и индикаторов", group="Внешний вид")
bearColor = input.color(#801922, "Цвет медведей", tooltip="Цвет для медвежьих трендов и индикаторов", group="Внешний вид")
pc1 = input.color(#ffa726, "Цвет профиля", tooltip="Цвет визуализации объемного профиля", group="Внешний вид")
dismiss = input.bool(false, "Игнорировать предупреждение об отсутствии объема", "Отключает предупреждение при отсутствии данных об объеме", group="Внешний вид")
profileCalculation(start_index, end_index, res, scale) =>
top_boundaries = array.new_float(res)
bottom_boundaries = array.new_float(res)
binlen = array.new_float(res)
highs = array.new_float()
lows = array.new_float()
volumes = array.new_float()
for i = bar_index-start_index to bar_index-end_index
highs.push(high[i])
lows.push(low[i])
volumes.push(volume[i])
maxx = array.max(highs)
minn = array.min(lows)
size = array.size(highs)
poc = 0.0
if size > 0
step = (maxx - minn) / res
granularity = res
for i = 0 to granularity - 1
bin_size = 0.0
bottom = minn + (i * step)
top = minn + ((i + 1) * step)
bottom_boundaries.insert(i, bottom)
top_boundaries.insert(i, top)
for j = 0 to array.size(highs) - 1
candle_above_hbar = lows.get(j) > top
candle_below_hbar = highs.get(j) < bottom
is_candle_in_bucket = not (candle_above_hbar or candle_below_hbar)
bin_size += is_candle_in_bucket ? volumes.get(j) : 0
array.insert(binlen, i, bin_size)
boc = binlen.max()
boci = binlen.indexof(boc) > 0 ? binlen.indexof(boc) : 0
poc := math.avg(top_boundaries.get(boci), bottom_boundaries.get(boci))
[top_boundaries, bottom_boundaries, binlen, poc]
var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0 and not dismiss
color WHITE = color.new(color.white, 20)
color BLUE = color.new(#747474, 50)
string ST_1 = "⚠️ Для этого тикера нет данных об объеме, попробуйте другой тикер или\n отключите это предупреждение в настройках"
string textInput1 = ST_1
string infoBoxSizeInput = "huge"
string infoBoxYPosInput = "middle"
string infoBoxXPosInput = "center"
int heightInput = 12
int widthInput = 80
color textColorInput = WHITE
color bgColorInput = BLUE
var table watermark = table.new(infoBoxYPosInput + "_" + infoBoxXPosInput, 1, 1)
string txt = textInput1
table.cell(watermark, 0, 0, txt, widthInput, heightInput, textColorInput, text_size = infoBoxSizeInput, bgcolor = bgColorInput)
basis = ta.sma(ta.ema(src, len), len)
deviation = ta.ema(math.abs(close - basis), len * 3) * mult
upper = basis + deviation
lower = basis - deviation
length = int(len*mult)
nvol = (volume - ta.lowest(volume, length)) / (ta.highest(volume, length) - ta.lowest(volume, length)) * 100
var float trend = 0.0
if close > upper
trend := 1
if close < lower
trend := -1
peakform = high[1] > high and high[2] < high[1]
valleyform = low[1] < low and low[2] > low[1]
var aPeakLines = array.new_line() // Для максимумов (используется в нисходящем тренде)
var aValleyLines = array.new_line() // Для минимумов (используется в восходящем тренде)
var aPeakVols = array.new_float() // Соответствующие уровни объема
var aValleyVols = array.new_float() // Соответствующие уровни объема
var aPeakNVols = array.new_float() // Соответствующие нормализованные уровни объема
var aValleyNVols = array.new_float() // Соответствующие нормализованные уровни объема
if trend < 0
if peakform and high[1] < upper
l = line.new(bar_index-1, high[1], bar_index, high[1], color=color.new(bearColor, 100-nvol[1]), width = 2)
array.push(aPeakLines, l)
array.push(aPeakVols, volume[1])
array.push(aPeakNVols, nvol[1])
else if trend > 0 and low[1] > lower
if valleyform
l = line.new(bar_index-1, low[1], bar_index, low[1], color=color.new(bullColor, 100-nvol[1]), width = 2)
array.push(aValleyLines, l)
array.push(aValleyVols, volume[1])
array.push(aValleyNVols, nvol[1])
bullliq = 0.0
bearliq = 0.0
Nbullliq = 0.0
Nbearliq = 0.0
if aPeakLines.size() > 0
qt = aPeakLines.size()
for ln = qt - 1 to 0
if ln < aPeakLines.size()
currentLine = aPeakLines.get(ln)
lineLevel = currentLine.get_y1()
if high > lineLevel or upper < lineLevel
if high > lineLevel
bearliq += aPeakVols.get(ln)
Nbearliq += aPeakNVols.get(ln)
aPeakLines.remove(ln)
aPeakVols.remove(ln)
aPeakNVols.remove(ln)
else
currentLine.set_x2(bar_index)
if aPeakLines.size() > 500
aPeakLines.shift().delete()
aPeakVols.shift()
aPeakNVols.shift()
if aValleyLines.size() > 0
qt = aValleyLines.size()
for ln = qt - 1 to 0
if ln < aValleyLines.size()
currentLine = aValleyLines.get(ln)
lineLevel = currentLine.get_y1()
if low < lineLevel or lower > lineLevel
if low < lineLevel
bullliq += aValleyVols.get(ln)
Nbullliq += aValleyNVols.get(ln)
aValleyLines.remove(ln)
aValleyVols.remove(ln)
aValleyNVols.remove(ln)
else
currentLine.set_x2(bar_index)
if aValleyLines.size() > 500
aValleyLines.shift().delete()
aValleyVols.shift()
aValleyNVols.shift()
volatility = ta.atr(14)/2
timer = ta.barssince(ta.cross(trend, 0))
profile_upper = ta.highest(math.max(1, nz(timer)))
profile_lower = ta.lowest(math.max(1, nz(timer)))
end_index = bar_index
start_index = (bar_index - timer) + (end_index > (bar_index - timer) ? 1 : 0)
[top_boundaries, bottom_boundaries, binlen, poc] = profileCalculation(start_index, end_index, res, scale)
var boxes = array.new_box()
var br = array.new_box()
while boxes.size() > 0
boxes.shift().delete()
while br.size() > 0
br.shift().delete()
for i = 0 to res - 1
if show_profile and not (barstate.islast and cumVol == 0)
box_right = bar_index + 7 + scale
box_left = box_right - math.round(binlen.get(i)) / math.round(binlen.max()) * scale
box_top = array.get(top_boundaries, i)
box_bottom = array.get(bottom_boundaries, i)
gradient_color = color.from_gradient(math.sin(binlen.get(i) * math.pi / binlen.max()) * binlen.max(), 0, binlen.max(), trend > 0 ? bullColor : bearColor, pc1)
array.push(boxes, box.new(box_left, box_top, box_right, box_bottom, border_style = line.style_solid, border_color = gradient_color, border_width = 1, bgcolor = color.new(gradient_color, 10)))
if show_bounds and not (barstate.islast and cumVol == 0)
br.push(box.new(start_index, profile_upper, end_index+scale+7, profile_lower, border_style = line.style_solid, border_color = color.new(chart.fg_color, 90), border_width = 1, bgcolor = color.new(chart.fg_color, 95)))
draw_structure = input(defval = false, title = '⫸ Показать Рыночную Структуру', group = 'Панель управления')
line_width = input.int(defval = 2, title = 'Толщина линий РС', minval = 1, maxval = 5, group = 'Настройки линий')
line_up_color = input.color(defval = #00ffee, title = 'Цвет линии движения вверх', group = 'Настройки линий')
line_down_color = input.color(defval = #e91e63, title = 'Цвет линии движения вниз', group = 'Настройки линий')
var array<line> line_smc_ups = array.new_line()
var array<line> line_smc_downs = array.new_line()
get_move_up() =>
move_up = high[0] > high[1] and low[0] > low[1]
if array.size(line_smc_ups) > 0
most_recent_move = array.get(line_smc_ups, array.size(line_smc_ups) - 1)
x2 = line.get_x2(most_recent_move)
y2 = line.get_y2(most_recent_move)
if x2 == bar_index - 1
if high >= y2
line.set_x2(most_recent_move, bar_index)
line.set_y2(most_recent_move, high)
else
if move_up == true
if low[2] < low[1]
up_move = line.new(x1 = bar_index - 2, y1 = low[2], x2 = bar_index, y2 = high, color = line_up_color)
line.set_style(up_move, line.style_dashed)
line.set_width(up_move, line_width)
array.push(line_smc_ups, up_move)
else
up_move = line.new(x1 = bar_index - 1, y1 = low[1], x2 = bar_index, y2 = high, color = line_up_color)
line.set_style(up_move, line.style_dashed)
line.set_width(up_move, line_width)
array.push(line_smc_ups, up_move)
else
if move_up == true
if low[2] < low[1]
up_move = line.new(x1 = bar_index - 2, y1 = low[2], x2 = bar_index, y2 = high, color = line_up_color)
line.set_style(up_move, line.style_dashed)
line.set_width(up_move, line_width)
array.push(line_smc_ups, up_move)
else
up_move = line.new(x1 = bar_index - 1, y1 = low[1], x2 = bar_index, y2 = high, color = line_up_color)
line.set_style(up_move, line.style_dashed)
line.set_width(up_move, line_width)
array.push(line_smc_ups, up_move)
get_move_down() =>
move_down = low[0] < low[1] and high[0] < high[1]
if array.size(line_smc_downs) > 0
most_recent_move = array.get(line_smc_downs, array.size(line_smc_downs) - 1)
x2 = line.get_x2(most_recent_move)
y2 = line.get_y2(most_recent_move)
if x2 == bar_index - 1
if low <= y2
line.set_x2(most_recent_move, bar_index)
line.set_y2(most_recent_move, lПоказано первые 50% кода (символов: 18369)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.