Liquidity Stress Exhaustion
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator liquidity stress exhaustion for tradingview.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Liquidity Stress Exhaustion — это индикатор для TradingView, написанный на Pine Script v6. Он отображается поверх графика цены и предназначен для визуального анализа состояния рынка. Индикатор рассчитывает собственный показатель стресса ликвидности на основе волатильности и объёма, а также строит статистическую регрессионную модель по последним барам. Результаты выводятся в виде линий канала, меток и информационной панели.
Индикатор формирует сигналы о возможном истощении продавцов или покупателей, используя комбинацию показателя стресса, направления тренда и фильтров (ADX, адаптивное сглаживание, порог корреляции). При появлении сигнала на графике отображаются уровни входа, стоп-лосса и трёх целей, рассчитанные на основе ATR и заданных множителей риска. Также предусмотрены условия для оповещений TradingView с настраиваемыми действиями.
Пользователь может настраивать множество параметров: длины периодов, пороги, фильтры, цвета и расположение панели. Индикатор не является торговым советником и не выполняет автоматических сделок; он лишь предоставляет визуальную информацию и условия для оповещений.
Настройки программы
| Настройка | Описание |
|---|---|
| IN_LEN_TREND | Длина периода для определения тренда. |
| IN_LEN_STATS | Количество баров для расчёта статистики показателя стресса. |
| IN_THRESH_SIGMA | Пороговое значение Z-оценки для определения высокого стресса. |
| IN_USE_DYN_LEN | Включает динамическую длину регрессии на основе последних пивотов. |
| IN_FIX_LEN | Фиксированная длина регрессии, если динамический режим выключен. |
| IN_PIV_LEFT | Количество баров слева для определения пивота. |
| IN_PIV_RIGHT | Количество баров справа для определения пивота. |
| IN_MAX_LOOKBACK | Максимальное количество баров для расчёта регрессии. |
| IN_DEV_IN | Множитель стандартного отклонения для внутренних границ канала. |
| IN_DEV_OUT | Множитель стандартного отклонения для внешних границ канала. |
| IN_USE_R_FILT | Включает фильтрацию сигналов при слабой корреляции. |
| IN_R_THRESH | Пороговое значение коэффициента корреляции Пирсона для фильтрации слабых сигналов. |
| i_useAdxFilter | Включает фильтр ADX для сигналов. |
| i_adxThresh | Пороговое значение ADX для фильтрации сигналов. |
| i_adxLen | Длина периода для расчёта ADX. |
| i_adaptFilterType | Тип адаптивного фильтра: нет, фильтр Калмана или LLAMA. |
| i_adaptFilterLen | Длина периода для адаптивного фильтра. |
| i_lockSignal | Блокирует новые сигналы и фиксирует текущий. |
| i_atrMult | Множитель ATR для расчёта уровня стоп-лосса. |
| i_atrLen | Длина периода для расчёта ATR. |
| i_tp1R | Множитель риска для первой цели. |
| i_tp2R | Множитель риска для второй цели. |
| i_tp3R | Множитель риска для третьей цели. |
| IN_SHOW_METRICS | Показывать метку с метриками на графике. |
| IN_WIDTH_HIGH | Порог ширины канала в процентах для высокой волатильности. |
| IN_WIDTH_LOW | Порог ширины канала в процентах для низкой волатильности. |
| IN_EXT_MODE | Режим продления линий канала: нет, влево, вправо или в обе стороны. |
| i_dashPos | Положение информационной панели на графике. |
| i_actionSellerExh | Строка действия для оповещения при истощении продавцов. |
| i_actionBuyerExh | Строка действия для оповещения при истощении покупателей. |
| i_actionTp1 | Строка действия для оповещения при достижении первой цели. |
| i_actionTp2 | Строка действия для оповещения при достижении второй цели. |
| i_actionTp3 | Строка действия для оповещения при достижении третьей цели. |
| i_actionSlHit | Строка действия для оповещения при достижении стоп-лосса. |
| IN_C_BULL | Цвет для бычьего сигнала или истощения продавцов. |
| IN_C_BEAR | Цвет для медвежьего сигнала или истощения покупателей. |
| IN_C_NEUT | Цвет для нейтрального состояния или слабой корреляции. |
| IN_C_TXT | Цвет текста на метках. |
| IN_C_BG | Цвет фона меток на графике. |
| C_DASH_HDR | Цвет заголовка информационной панели. |
| C_DASH_BG | Цвет фона информационной панели. |
| C_DASH_TXT | Цвет текста в информационной панели. |
| C_SL | Цвет линии стоп-лосса. |
| C_ENTRY | Цвет линии уровня входа. |
| C_TP1 | Цвет линии первой цели. |
| C_TP2 | Цвет линии второй цели. |
| C_TP3 | Цвет линии третьей цели. |
| C_RISK_FILL | Цвет заливки зоны риска. |
| C_REWARD_FILL | Цвет заливки зоны потенциальной прибыли. |
Поиск по коду файла
indicator("Liquidity Stress Exhaustion", overlay = true, max_lines_count = 100, max_labels_count = 500, max_bars_back = 5000)
var string GRP_CORE = "⚙️ Core Settings"
int IN_LEN_TREND = input.int(50, "Trend Length", minval=10, group=GRP_CORE)
int IN_LEN_STATS = input.int(20, "Stats Lookback", minval=5, group=GRP_CORE)
float IN_THRESH_SIGMA = input.float(2.0, "Stress Threshold (σ)", step=0.1, group=GRP_CORE)
bool IN_USE_DYN_LEN = input.bool(false, "Dynamic Pivot Mode", group=GRP_CORE, tooltip="Adjusts regression length based on recent pivots.")
int IN_FIX_LEN = input.int(50, "Fixed Length", minval=5, group=GRP_CORE)
int IN_PIV_LEFT = input.int(20, "Pivot Left", minval=2, group=GRP_CORE)
int IN_PIV_RIGHT = input.int(20, "Pivot Right", minval=1, group=GRP_CORE)
int IN_MAX_LOOKBACK = input.int(300, "Max Lookback Cap", minval=50, group=GRP_CORE)
float IN_DEV_IN = input.float(1.0, "Inner Deviation", step=0.1, group=GRP_CORE)
float IN_DEV_OUT = input.float(2.0, "Outer Deviation", step=0.1, group=GRP_CORE)
var string GRP_FILT = "🕯️ Filters"
bool IN_USE_R_FILT = input.bool(true, "Filter Weak Correlations", group=GRP_FILT)
float IN_R_THRESH = input.float(0.5, "Pearson R Threshold", step=0.05, group=GRP_FILT)
bool i_useAdxFilter = input.bool(false, "📈 Use ADX Filter", group=GRP_FILT)
float i_adxThresh = input.float(20.0, "ADX Threshold", group=GRP_FILT, minval=0, step=0.5)
int i_adxLen = input.int(14, "ADX Length", group=GRP_FILT, minval=1)
string i_adaptFilterType = input.string("None", "🧠 Adaptive Filter", options=["None", "Kalman Filter", "LLAMA"], group=GRP_FILT)
int i_adaptFilterLen = input.int(20, "Adaptive Filter Length", group=GRP_FILT, minval=1)
var string GRP_TRADE = "📐 Trade Tools"
bool i_lockSignal = input.bool(false, "🔒 Lock Signal", group=GRP_TRADE, tooltip="Freeze current signal · block new ones")
float i_atrMult = input.float(1.5, "ATR SL Multiplier", minval=0.1, step=0.1, group=GRP_TRADE)
int i_atrLen = input.int(14, "ATR Length", minval=1, group=GRP_TRADE)
float i_tp1R = input.float(1.0, "TP1 (R Multiple)", minval=0.1, step=0.1, group=GRP_TRADE)
float i_tp2R = input.float(2.0, "TP2 (R Multiple)", minval=0.1, step=0.1, group=GRP_TRADE)
float i_tp3R = input.float(3.0, "TP3 (R Multiple)", minval=0.1, step=0.1, group=GRP_TRADE)
var string GRP_VIS = "🎨 Visuals"
bool IN_SHOW_METRICS = input.bool(true, "Show Metrics Label", group=GRP_VIS)
float IN_WIDTH_HIGH = input.float(3.0, "High Volatility Width %", minval=0.1, step=0.1, group=GRP_VIS)
float IN_WIDTH_LOW = input.float(1.0, "Low Volatility Width %", minval=0.1, step=0.1, group=GRP_VIS)
string IN_EXT_MODE = input.string("None", "Line Extension", options=["None", "Left", "Right", "Both"], group=GRP_VIS)
var string GRP_DASH = "📊 Dashboard"
string i_dashPos = input.string("Top Right", "Dashboard Position", options=["Top Right", "Top Left", "Bottom Right", "Bottom Left"], group=GRP_DASH)
var string GRP_WH = "🔔 Alerts"
string i_actionSellerExh = input.string("seller_exhaustion", "Seller Exhaustion Action", group=GRP_WH)
string i_actionBuyerExh = input.string("buyer_exhaustion", "Buyer Exhaustion Action", group=GRP_WH)
string i_actionTp1 = input.string("tp1_hit", "TP1 Hit Action", group=GRP_WH)
string i_actionTp2 = input.string("tp2_hit", "TP2 Hit Action", group=GRP_WH)
string i_actionTp3 = input.string("tp3_hit", "TP3 Hit Action", group=GRP_WH)
string i_actionSlHit = input.string("sl_hit", "SL Hit Action", group=GRP_WH)
var string GRP_STYLE = "🌈 Colors"
color IN_C_BULL = input.color(#00e5ff, "Bullish / Seller Exhaustion", group=GRP_STYLE)
color IN_C_BEAR = input.color(#ff2ee6, "Bearish / Buyer Exhaustion", group=GRP_STYLE)
color IN_C_NEUT = input.color(#7a7fa3, "Neutral / Weak Correlation", group=GRP_STYLE)
color IN_C_TXT = input.color(#FFFFFF, "Text Color", group=GRP_STYLE)
color IN_C_BG = input.color(#131722, "Label Background", group=GRP_STYLE)
color C_DASH_HDR = input.color(color.new(#3a2a6d, 55), "Dashboard Header", group=GRP_STYLE)
color C_DASH_BG = input.color(color.new(#0a0f1a, 10), "Dashboard Background", group=GRP_STYLE)
color C_DASH_TXT = input.color(#ffffff, "Dashboard Text", group=GRP_STYLE)
color C_SL = input.color(#ef5350, "SL Line", group=GRP_STYLE)
color C_ENTRY = input.color(#2196f3, "Entry Line", group=GRP_STYLE)
color C_TP1 = input.color(color.new(#26a69a, 40), "TP1 Line", group=GRP_STYLE)
color C_TP2 = input.color(color.new(#26a69a, 20), "TP2 Line", group=GRP_STYLE)
color C_TP3 = input.color(color.new(#26a69a, 0), "TP3 Line", group=GRP_STYLE)
color C_RISK_FILL = input.color(color.new(#ef5350, 80), "Risk Zone Fill", group=GRP_STYLE)
color C_REWARD_FILL = input.color(color.new(#26a69a, 85), "Reward Zone Fill", group=GRP_STYLE)
type StressEngine
float raw_illiquidity
float z_score
bool is_high_stress
type RegMetrics
float startPrice
float endPrice
float stdDev
float pearsonR
bool isValid
int length
type ChannelDrawings
line mid
line topOut
line botOut
line topIn
line botIn
linefill fill
label stats
type TradeLevels
line slLine
line entryLine
line tp1Line
line tp2Line
line tp3Line
label slLbl
label entryLbl
label tp1Lbl
label tp2Lbl
label tp3Lbl
linefill riskFill
linefill rewardFill
method update(StressEngine self, int len, float threshold) =>
float vol_safe = (na(volume) or volume == 0) ? 1.0 : volume
float impact = ta.tr(true) / vol_safe
self.raw_illiquidity := math.log(impact + 1)
float mean = ta.sma(self.raw_illiquidity, len)
float std = ta.stdev(self.raw_illiquidity, len)
self.z_score := (std == 0 or na(std)) ? 0.0 : (self.raw_illiquidity - mean) / std
self.is_high_stress := (self.z_score > threshold)
get_ext_mode(string s) =>
switch s
"Left" => extend.left
"Right" => extend.right
"Both" => extend.both
=> extend.none
f_pivotHigh(float src, int leftLen, int rightLen) =>
float pivVal = src[rightLen]
bool isPivot = true
if bar_index >= leftLen + rightLen
for i = 0 to leftLen + rightLen
if i != leftLen and src[i] > pivVal
isPivot := false
break
else
isPivot := false
isPivot ? pivVal : na
f_pivotLow(float src, int leftLen, int rightLen) =>
float pivVal = src[rightLen]
bool isPivot = true
if bar_index >= leftLen + rightLen
for i = 0 to leftLen + rightLen
if i != leftLen and src[i] < pivVal
isPivot := false
break
else
isPivot := false
isPivot ? pivVal : na
f_kalman(float src, int len) =>
var float _est = na
var float _err = 1.0
float _q = 1.0 / len
float _r = 1.0
_est := na(_est) ? src : _est
float _predErr = _err + _q
float _gain = _predErr / (_predErr + _r)
_est := _est + _gain * (src - _est)
_err := (1 - _gain) * _predErr
_est
f_llama(float src, int len) =>
float _mean = ta.sma(src, len)
float _slope = (src - src[len]) / len
_mean + _slope * (len / 2)
calc_regression_metrics(int length) =>
if length < 2
RegMetrics.new(na, na, na, na, false, length)
else
int actual_len = 0
for i = 0 to length - 1
if not na(hlc3[i])
actual_len := i + 1
else
break
if actual_len < 2
RegMetrics.new(na, na, na, na, false, 0)
else
float n = float(actual_len)
float n_minus = n - 1.0
float sum_x = (n * n_minus) / 2.0
float sum_x2 = (n * n_minus * (2.0 * n - 1.0)) / 6.0
float sum_y = 0.0
float sum_xy = 0.0
float sum_y2 = 0.0
for i = 0 to actual_len - 1
float val = hlc3[i]
float x_val = n_minus - float(i)
if not na(val)
sum_y += val
sum_xy += x_val * val
sum_y2 += val * val
float denom = n * sum_x2 - sum_x * sum_x
float slope = denom != 0 ? (n * sum_xy - sum_x * sum_y) / denom : 0.0
float inter = (sum_y - slope * sum_x) / n
float var_val = (sum_y2 - (sum_y * sum_y) / n) / n
float std_dev = math.sqrt(math.max(0.0, var_val))
float r_num = n * sum_xy - sum_x * sum_y
float r_den_y = n * sum_y2 - sum_y * sum_y
float r_den = math.sqrt(math.max(0.0, denom * r_den_y))
float r_coef = r_den != 0 ? r_num / r_den : 0.0
float y_start = inter
float y_end = inter + slope * n_minus
RegMetrics.new(y_start, y_end, std_dev, r_coef, true, actual_len)
var StressEngine stress_eng = StressEngine.new(0.0, 0.0, false)
stress_eng.update(IN_LEN_STATS, IN_THRESH_SIGMA)
float _adaptedClose = i_adaptFilterType == "Kalman Filter" ? f_kalman(close, i_adaptFilterLen) : i_adaptFilterType == "LLAMA" ? f_llama(close, i_adaptFilterLen) : close
float trend_ema = ta.ema(_adaptedClose, IN_LEN_TREND)
bool is_downtrend = _adaptedClose < trend_ema
bool is_uptrend = _adaptedClose > trend_ema
[_diPlus, _diMinus, _adxVal] = ta.dmi(i_adxLen, i_adxLen)
bool _adxPass = not i_useAdxFilter or _adxVal >= i_adxThresh
StressEngine stressPrev = na(stress_eng[1]) ? StressEngine.new(0.0, 0.0, false) : stress_eng[1]
bool _rawSellerExhaustion = stressPrev.is_high_stress and is_downtrend[1] and (close[1] < open[1])
bool _rawBuyerExhaustion = stressPrev.is_high_stress and is_uptrend[1] and (close[1] > open[1])
bool seller_exhaustion = _rawSellerExhaustion and _adxPass[1]
bool buyer_exhaustion = _rawBuyerExhaustion and _adxPass[1]
float _atr = ta.atr(i_atrLen)
var float slPriceLong = na
var float entryPriceLong = na
var float tp1PriceLong = na
var float tp2PriceLong = na
var float tp3PriceLong = na
var float slPriceShort = na
var float entryPriceShort = na
var float tp1PriceShort = na
var float tp2PriceShort = na
var float tp3PriceShort = na
bool _locked = i_lockSignal and barstate.islast
bool _commit = barstate.isconfirmed
if seller_exhaustion and not _locked and _commit
entryPriceLong := close
slPriceLong := entryPriceLong - _atr * i_atrMult
float _rLong = entryPriceLong - slPriceLong
tp1PriceLong := entryPriceLong + _rLong * i_tp1R
tp2PriceLong := entryPriceLong + _rLong * i_tp2R
tp3PriceLong := entryPriceLong + _rLong * i_tp3R
if buyer_exhaustion and not _locked and _commit
entryPriceShort := close
slPriceShort := entryPriceShort + _atr * i_atrMult
float _rShort = slPriceShort - entryPriceShort
tp1PriceShort := entryPriceShort - _rShort * i_tp1R
tp2PriceShort := entryPriceShort - _rShort * i_tp2R
tp3PriceShort := entryPriceShort - _rShort * i_tp3R
bool _slHitLong = not na(slPriceLong) and low <= slPriceLong
bool _slHitShort = not na(slPriceShort) and high >= slPriceShort
bool tp1HitLong = not na(tp1PriceLong) and high >= tp1PriceLong
bool tp2HitLong = not na(tp2PriceLong) and high >= tp2PriceLong
bool tp3HitLong = not na(tp3PriceLong) and high >= tp3PriceLong
bool tp1HitShort = not na(tp1PriceShort) and low <= tp1PriceShort
bool tp2HitShort = not na(tp2PriceShort) and low <= tp2PriceShort
bool tp3HitShort = not na(tp3PriceShort) and low <= tp3PriceShort
var string activeDir = na
var float activeSl = na
var float activeEn = na
var float activeTp1 = na
if seller_exhaustion and not _locked and _commit
activeDir := "long"
activeSl := slPriceLong
activeEn := entryPriceLong
activeTp1 := tp1PriceLong
if buyer_exhaustion and not _locked and _commit
activeDir := "short"
activeSl := slPriceShort
activeEn := entryPriceShort
activeTp1 := tp1PriceShort
bool _positionClosed = (activeDir == "long" and (_slHitLong or tp3HitLong)) or (activeDir == "short" and (_slHitShort or tp3HitShort))
if _positionClosed
activeDir := na
activeSl := na
activeEn := na
activeTp1 := na
var int piv_idx = na
float ph = f_pivotHigh(high, IN_PIV_LEFT, IN_PIV_RIGHT)
float pl = f_pivotLow(low, IN_PIV_LEFT, IN_PIV_RIGHT)
if not na(ph) or not na(pl)
piv_idx := bar_index[IN_PIV_RIGHT]
if seller_exhaustion and _commit
label.new(bar_index, low, text="SE", style=label.style_label_up, color=IN_C_BULL, textcolor=IN_C_TXT, size=size.normal, yloc=yloc.belowbar)
if buyer_exhaustion and _commit
label.new(bar_index, high, text="BE", style=label.style_label_down, color=IN_C_BEAR, textcolor=IN_C_TXT, size=size.normal, yloc=yloc.abovebar)
var table wm = table.new(position.bottom_right, 1, 1)
if barstate.isfirst
table.cell(wm, 0, 0, "Telegram @SimpleForexTools", text_color = color.new(color.gray, 70), text_size = size.large)
string _sellerInner = str.format(
'"action":"{0}","ticker":"{1}","tf":"{2}","direction":"long","entry":"{3}","sl":"{4}","tp1":"{5}","tp2":"{6}","tp3":"{7}","zscore":"{8}"',
i_actionSellerExh, syminfo.tickerid, timeframe.period,
str.tostring(entryPriceLong, format.mintick),
str.tostring(slPriceLong, format.mintick),
str.tostring(tp1PriceLong, format.mintick),
str.tostring(tp2PriceLong, format.mintick),
str.tostring(tp3PriceLong, format.mintick),
str.tostring(stress_eng.z_score, "#.##"))
string sellerPayload = "{" + _sellerInner + "}"
string _buyerInner = str.format(
'"action":"{0}","ticker":"{1}","tf":"{2}","direction":"short","entry":"{Показано первые 50% кода (символов: 22409)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.