ATAI Volume Pressure Analyzer V 1.1 — Pure Up/Down
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «atai_volume_pressure_analyzer_v_1_0_—_pure_up_down@lifeindreamsworld_6215428748079012230.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор Pine Script v6 для TradingView, анализирующий объёмное давление путём разделения совокупного объёма на покупательский и продавческий компоненты на нижнем таймфрейме. Результаты отображаются в виде HUD-таблицы в правом нижнем углу графика с суммами, скользящими средними и сегментными дельтами за глобальный период. Поддерживается автоматический или ручной выбор нижнего таймфрейма, а также настройка цветовой темы и прозрачности элементов.
Настройки программы
| Настройка | Описание |
|---|---|
| P | Глобальный период — Длина окна в барах для расчёта скользящих средних и сегментных показателей объёма на базовом таймфрейме. |
| useCustomTf | Использовать пользовательский таймфрейм — Включает ручной выбор нижнего таймфрейма вместо автоматического определения. |
| lowerTfInput | Таймфрейм — Нижний таймфрейм для анализа объёма, используется при включённом пользовательском выборе. |
| baseColor | Основной цвет — Цвет для основных элементов HUD-таблицы и индикаторов. |
| negColor | Цвет отрицательных значений — Цвет, применяемый при отрицательной дельте в блоках таблицы. |
| useOffset_wing | Использовать смещение крыла — Смещает якоря рисования крыльев вперёд на заданное количество баров. |
| offsetBars_wing | Смещение в барах — Количество баров для горизонтального сдвига рисования крыльев вперёд. |
| offsetStdMul_wing | Множитель стандартного отклонения смещения — Множитель для оценки будущих точек якоря A при включённом смещении. |
| linkAtrToP_wing | Привязать длину ATR к периоду P — При включении нормализация углов крыльев использует ATR с длиной P; при выключении — явную длину ниже. |
| atrLenInput_wing | Длина ATR (переопределение) — Явная длина ATR для нормализации углов, используется только при отключённой привязке к P. |
| fillTrans_wing | Прозрачность заливки — Степень прозрачности заливки области крыльев (0 — непрозрачный, 100 — полностью прозрачный). |
| nearZeroDeg_wing | Порог близости к нулю (градусы) — Порог для классификации углов как нейтральных (серых) в HUD и рисовании крыльев. |
| enableOBOS_obos | Активировать модуль перекупленности/перепроданности — Включает или выключает детектирование всплесков объёма с сигналами перекупленности и перепроданности. |
| minHits_obos | Минимум подтверждений (из 7) — Минимальное количество осцилляторов в зоне перекупленности или перепроданности для формирования сигнала. |
| syncWin_obos | Окно синхронизации подтверждений — Максимальное количество предыдущих баров для сглаживания голосования осцилляторов (0–2). |
| volLen_obos | Период объёма — Длина окна для расчёта скользящей средней и стандартного отклонения объёма при обнаружении всплесков. |
| kVolRatio_obos | Порог всплеска объёма (Vol/SMA) — Коэффициент отношения текущего объёма к скользящей средней для триггера всплеска. |
| zVolThr_obos | Порог Z-Score объёма — Порог Z-Score отклонения объёма от средней для альтернативного триггера всплеска. |
| rsiLen_obos | Период RSI — Длина периода для расчёта индикатора RSI в модуле OB/OS. |
| stLen_obos | Период стохастика — Длина периода для расчёта стохастика в модуле OB/OS. |
| stSm_obos | Сглаживание стохастика — Период сглаживания линий %K и %D стохастика. |
| wprLen_obos | Период Williams %R — Длина периода для расчёта индикатора Williams %R в модуле OB/OS. |
| cciLen_obos | Период CCI — Длина периода для расчёта индикатора CCI в модуле OB/OS. |
| mfiLen_obos | Период MFI — Длина периода для расчёта индикатора Money Flow Index в модуле OB/OS. |
| demLen_obos | Период DeMarker — Длина периода для расчёта индикатора DeMarker в модуле OB/OS. |
| srsiLen_obos | Период стохастика RSI — Длина периода для расчёта стохастика RSI в модуле OB/OS. |
| useRSI_obos | Включить RSI — Включает или выключает RSI из голосования осцилляторов модуля OB/OS. |
| useSTO_obos | Включить стохастик — Включает или выключает стохастик из голосования осцилляторов модуля OB/OS. |
| useWPR_obos | Включить Williams %R — Включает или выключает Williams %R из голосования осцилляторов модуля OB/OS. |
| useCCI_obos | Включить CCI — Включает или выключает CCI из голосования осцилляторов модуля OB/OS. |
| useMFI_obos | Включить MFI — Включает или выключает MFI из голосования осцилляторов модуля OB/OS. |
| useDeM_obos | Включить DeMarker — Включает или выключает DeMarker из голосования осцилляторов модуля OB/OS. |
| useSRSI_obos | Включить стохастик RSI — Включает или выключает стохастик RSI из голосования осцилляторов модуля OB/OS. |
| label_offset_unit_obos | Единица смещения метки — Единица измерения расстояния от цены для размещения меток OB/OS (тики, проценты или ATR). |
| label_offset_val_obos | Значение смещения метки — Величина смещения метки в выбранной единице измерения. |
| label_atr_len_obos | Длина ATR для смещения метки — Период ATR, используемый для расчёта смещения при выборе единицы ATR. |
| label_size_opt_obos | Размер метки — Размер визуального отображения меток OB/OS на графике (Tiny, Small, Normal). |
| showConnectors_obos | Показать пунктирные соединители — Включает отрисовку пунктирной линии от метки OB/OS к верхней или нижней тени свечи. |
| enable_vtop | Активировать топ-3 пиков — Включает сканирование последних P баров для поиска трёх наибольших баров покупательского и продавческого объёма. |
| box_unit_vtop | Единица толщины зоны — Единица измерения вертикальной толщины зон вокруг пиковых свечей (тики, проценты или ATR). |
| box_val_vtop | Значение толщины зоны — Величина полу-толщины зоны вокруг пиковой цены в выбранной единице измерения. |
| linkAtrToP_vtop | Привязать длину ATR к периоду P — При включении для расчёта толщины зон используется ATR с длиной P; при выключении — явная длина ниже. |
| atrLenOv_vtop | Длина ATR (переопределение) — Явная длина ATR для расчёта толщины зон, используется только при отключённой привязке к P. |
| fillTrans_vtop | Прозрачность заливки зон — Степень прозрачности заливки горизонтальных зон объёма (0 — непрозрачный, 100 — полностью прозрачный). |
| showLabels_vtop | Показать ранговые метки на графике — Включает отображение меток B1/B2/B3 и S1/S2/S3 на пиковых свечах. |
Поиск по коду файла
indicator(title = "ATAI Volume Pressure Analyzer V 1.1 — Pure Up/Down", shorttitle = "ATAI.VPA", overlay = true, max_bars_back=500 )
string groupGlobal = "① Global Settings"
P = input.int(
defval = 55,
title = "Global Period (bars)",
minval = 1,
tooltip = "Lookback length for host-TF volume MAs and segment KPIs.",
group = groupGlobal
)
string groupTf = "② Timeframes"
lowerTimeframeTooltip = "The indicator scans lower timeframe data to approximate up and down volume. By default, the timeframe is chosen automatically. These inputs override this with a custom timeframe. Higher timeframes provide more historical data, but the data will be less precise."
useCustomTf = input.bool(false, "Use custom timeframe", tooltip = lowerTimeframeTooltip, group = groupTf)
lowerTfInput = input.timeframe("1", "Timeframe", group = groupTf)
string lowerTf = switch
useCustomTf => lowerTfInput
timeframe.isseconds => "1S"
timeframe.isintraday=> "1"
timeframe.isdaily => "5"
=> "60"
import TradingView/ta/10 as tvta
[upVolume, downVolume, delta] = tvta.requestUpAndDownVolume(lowerTf)
float TF_buy = math.abs(upVolume)
float TF_sell = math.abs(downVolume)
float TF_tot = TF_buy + TF_sell
float TF_delta = TF_buy - TF_sell
float TF_buy_SMA = ta.sma(TF_buy, P)
float TF_sell_SMA = ta.sma(TF_sell, P)
int iB_kpi = int(math.floor((P - 1) / 2.0))
int iC_kpi = P - 1
int len_AtoB_kpi = math.max(iB_kpi, 0)
float AtoB_buy_kpi = len_AtoB_kpi > 0 ? math.sum(TF_buy, len_AtoB_kpi) : na
float AtoB_sell_kpi = len_AtoB_kpi > 0 ? math.sum(TF_sell, len_AtoB_kpi) : na
float AtoB_delta_kpi = AtoB_buy_kpi - AtoB_sell_kpi
float sumBuy_0_iC_kpi = math.sum(TF_buy, iC_kpi + 1)
float sumBuy_0_iB_kpi = math.sum(TF_buy, iB_kpi + 1)
float sumSell_0_iC_kpi = math.sum(TF_sell, iC_kpi + 1)
float sumSell_0_iB_kpi = math.sum(TF_sell, iB_kpi + 1)
float CtoB_buy_kpi = sumBuy_0_iC_kpi - sumBuy_0_iB_kpi
float CtoB_sell_kpi = sumSell_0_iC_kpi - sumSell_0_iB_kpi
float CtoB_delta_kpi = CtoB_buy_kpi - CtoB_sell_kpi
f_fmt(float val) =>
if na(val)
"—"
else
string sign = val < 0 ? "-" : val > 0 ? "+" : ""
float av = math.abs(val)
sign + (
av >= 1e9 ? str.format("{0,number,0.##}B", av/1e9) :
av >= 1e6 ? str.format("{0,number,0.##}M", av/1e6) :
av >= 1e3 ? str.format("{0,number,0.##}K", av/1e3) :
str.format("{0,number,0}", av))
f_hostTfLabel() =>
float n = str.tonumber(timeframe.period)
not na(n) ? (str.tostring(int(n)) + "Min") :
timeframe.period == "D" ? "1D" :
timeframe.period == "W" ? "1W" :
timeframe.period == "M" ? "1M" : timeframe.period
f_blockAmounts(string title, float up, float dn, float delta) =>
title + "\n" +
"↑ " + f_fmt(up) + "\n" +
"↓ " + f_fmt(dn) + "\n" +
"Δ " + f_fmt(delta)
f_blockMAsSum(string title, float upMA, float dnMA, float total) =>
title + "\n" +
"Σ " + f_fmt(total) + "\n" +
"MA ↑ " + f_fmt(upMA) + "\n" +
"MA ↓ " + f_fmt(dnMA)
f_blockAmountsWithTotal(string title, float total, float up, float dn, float delta) =>
title + "\n" +
"Σ " + f_fmt(total) + "\n" +
"↑ " + f_fmt(up) + "\n" +
"↓ " + f_fmt(dn) + "\n" +
"Δ " + f_fmt(delta)
f_blockMAsOnly(string title, float upMA, float dnMA) =>
title + "\n" +
"MA ↑ " + f_fmt(upMA) + "\n" +
"MA ↓ " + f_fmt(dnMA)
string groupColors = "③ Colors"
baseColor = input.color(
defval = #6abaff,
title = "Primary color",
tooltip = "Unified color for all HUD/table elements.",
group = groupColors)
negColor = input.color(
defval = #ff5076,
title = "Negative color",
tooltip = "Used ONLY when a block's Δ is negative.",
group = groupColors)
panelBG = color.new(baseColor, 95)
borderCol = color.new(baseColor, 0)
textCol = baseColor
const int COLS = 4
const int ROWS = 5
var table hud = na
if na(hud)
hud := table.new(position.bottom_right, COLS, ROWS, frame_color = borderCol, border_color = borderCol, frame_width = 1, border_width = 1)
f_paintBox(int col, int row, string txt, float keyDelta) =>
color tcl = not na(keyDelta) and keyDelta < 0 ? negColor : textCol
table.cell(hud, col, row, txt, text_color = tcl, bgcolor = panelBG, text_size = size.small, text_halign = text.align_left)
if barstate.islast
table.cell(hud, 0, 0, "Vol.Analyzer", text_color=textCol, bgcolor=panelBG, text_size=size.small, text_halign=text.align_left)
table.cell(hud, 1, 0, "Length = " + str.tostring(P), text_color=textCol, bgcolor=panelBG, text_size=size.small, text_halign=text.align_left)
table.cell(hud, 2, 0, "Lower TF: " + lowerTf, text_color=textCol, bgcolor=panelBG, text_size=size.small, text_halign=text.align_left)
table.cell(hud, 3, 0, "Host TF: " + f_hostTfLabel(), text_color=textCol, bgcolor=panelBG, text_size=size.small, text_halign=text.align_left)
string hostLbl = f_hostTfLabel()
f_paintBox(0, 1, f_blockAmountsWithTotal(hostLbl, TF_tot, TF_buy, TF_sell, TF_delta), TF_delta)
f_paintBox(1, 1, f_blockMAsOnly(hostLbl + " MA", TF_buy_SMA, TF_sell_SMA), TF_delta)
f_paintBox(2, 1, f_blockAmounts("C→B", CtoB_buy_kpi, CtoB_sell_kpi, CtoB_delta_kpi), CtoB_delta_kpi)
f_paintBox(3, 1, f_blockAmounts("B→A", AtoB_buy_kpi, AtoB_sell_kpi, AtoB_delta_kpi), AtoB_delta_kpi)
for r = 2 to ROWS - 1
for c = 0 to COLS - 1
bool reserved = (r == 2 and (c == 0 or c == 1)) or (r == 1 and (c == 0 or c == 1)) or (r == 0)
if not reserved
table.cell(hud, c, r, "", text_color=textCol, bgcolor=panelBG, text_size=size.small, text_halign=text.align_left)
string groupOffset_wing = "? Wing Offset"
bool useOffset_wing = input.bool(false, "Use wing offset", tooltip = "Shift wing drawing forward by a specified number of bars.", group = groupOffset_wing)
int offsetBars_wing = input.int(3, "Offset (bars)", minval = 0, tooltip = "Number of bars to shift the wing drawing forward. Set to 0 to disable.", group = groupOffset_wing)
float offsetStdMul_wing = input.float(1, "Offset std deviation multiplier", minval = 0.0, tooltip = "Multiplier for standard deviation when estimating future A points (default Fibonacci 27.2%).", group = groupOffset_wing)
int iB_wing = int(math.floor((P - 1) / 2.0))
int iC_wing = P - 1
int x_A_wing = bar_index
int x_B_wing = bar_index - iB_wing
int x_C_wing = bar_index - iC_wing
float y_A_top_wing = high
float y_A_bot_wing = low
float y_B_top_wing = useOffset_wing ? (iB_wing > offsetBars_wing ? high[iB_wing - offsetBars_wing] : na) : high[iB_wing]
float y_B_bot_wing = useOffset_wing ? (iB_wing > offsetBars_wing ? low[iB_wing - offsetBars_wing] : na) : low[iB_wing]
float y_C_top_wing = useOffset_wing ? (iC_wing > offsetBars_wing ? high[iC_wing - offsetBars_wing] : na) : high[iC_wing]
float y_C_bot_wing = useOffset_wing ? (iC_wing > offsetBars_wing ? low[iC_wing - offsetBars_wing] : na) : low[iC_wing]
bool haveLeftWing = bar_index >= iC_wing and iC_wing > iB_wing
bool haveRightWing = bar_index >= iB_wing and iB_wing > 0
string groupNorm_wing = "④ Wing Normalization"
bool linkAtrToP_wing = input.bool(true, "Link ATR length to P", tooltip = "If ON, normalization uses ATR(P). If OFF, the explicit length below is used.", group = groupNorm_wing)
int atrLenInput_wing = input.int(55, "ATR length (override)", minval = 1, tooltip = "Used only when 'Link ATR length to P' is OFF.", group = groupNorm_wing)
int atrLen_wing = linkAtrToP_wing ? P : atrLenInput_wing
float atr_wing = ta.atr(atrLen_wing)
float atr_safe_wing = math.max(atr_wing, syminfo.mintick) // avoid division by near-zero
_slope_norm_wing(y2, y1, dxBars, atrVal) => dxBars <= 0 or atrVal <= 0 ? na : ((y2 - y1) / dxBars) / atrVal
_deg_from_slope_norm_wing(s) => na(s) ? na : math.atan(s) * 180.0 / math.pi
float dx_CB_wing = float(iC_wing - iB_wing) // bars between C and B
float slopeN_CB_top_wing = haveLeftWing ? _slope_norm_wing(y_B_top_wing, y_C_top_wing, dx_CB_wing, atr_safe_wing) : na
float slopeN_CB_bot_wing = haveLeftWing ? _slope_norm_wing(y_B_bot_wing, y_C_bot_wing, dx_CB_wing, atr_safe_wing) : na
float angDegN_CB_top_wing = _deg_from_slope_norm_wing(slopeN_CB_top_wing)
float angDegN_CB_bot_wing = _deg_from_slope_norm_wing(slopeN_CB_bot_wing)
float dx_BA_wing = float(iB_wing) // bars between B and A (A = current)
float slopeN_BA_top_wing = haveRightWing ? _slope_norm_wing(y_A_top_wing, y_B_top_wing, dx_BA_wing, atr_safe_wing) : na
float slopeN_BA_bot_wing = haveRightWing ? _slope_norm_wing(y_A_bot_wing, y_B_bot_wing, dx_BA_wing, atr_safe_wing) : na
float angDegN_BA_top_wing = _deg_from_slope_norm_wing(slopeN_BA_top_wing)
float angDegN_BA_bot_wing = _deg_from_slope_norm_wing(slopeN_BA_bot_wing)
_fmt_deg_wing(x) => na(x) ? "—" : (str.tostring(x, "#.0") + "°")
string groupColors_wing = "⑤ Wing Colors"
int fillTrans_wing = input.int(90, "Fill transparency (0-100)", minval = 0, maxval = 100,
tooltip = "Higher value = more transparent.", group = groupColors_wing)
var color runtimeLeftColor_wing = na
var color runtimeRightColor_wing = na
var color activeLeftColor_wing = na
var color activeRightColor_wing = na
int nearZeroDeg_wing = input.int(3, "Near-zero threshold (deg)", minval = 0, maxval = 30,
tooltip = "Angles with |deg| below this are neutral (gray) in both HUD and wings.", group = groupColors_wing)
_hud_angle_text_color_wing(ang) =>
na(ang) ? color.new(textCol, 60) : math.abs(ang) < nearZeroDeg_wing ? #8a8a8acc : (ang > 0 ? textCol : negColor)
_wing_color_from_fonts_wing(angTop, angBot) =>
cTop = _hud_angle_text_color_wing(angTop)
cBot = _hud_angle_text_color_wing(angBot)
cTop == cBot ? cTop : color.gray
runtimeLeftColor_wing := _wing_color_from_fonts_wing(angDegN_CB_top_wing, angDegN_CB_bot_wing)
runtimeRightColor_wing := _wing_color_from_fonts_wing(angDegN_BA_top_wing, angDegN_BA_bot_wing)
activeLeftColor_wing := runtimeLeftColor_wing
activeRightColor_wing := runtimeRightColor_wing
int x_C_draw_wing = x_C_wing + (useOffset_wing ? offsetBars_wing : 0)
int x_B_draw_wing = x_B_wing + (useOffset_wing ? offsetBars_wing : 0)
int x_A_draw_wing = x_A_wing + (useOffset_wing ? offsetBars_wing : 0)
int len_top_pred_wing = iC_wing + 1
int len_bot_pred_wing = iB_wing + 1
float meanHigh = ta.sma(high, len_top_pred_wing)
float stdHigh = ta.stdev(high, len_top_pred_wing)
float meanLow = ta.sma(low, len_bot_pred_wing)
float stdLow = ta.stdev(low, len_bot_pred_wing)
float y_A_top_pred_wing = not na(meanHigh) and not na(stdHigh) ? (meanHigh + offsetStdMul_wing * stdHigh) : na
float y_A_bot_pred_wing = not na(meanLow) and not na(stdLow) ? (meanLow - offsetStdMul_wing * stdLow) : na
float y_A_top_draw_wing = useOffset_wing ? y_A_top_pred_wing : y_A_top_wing
float y_A_bot_draw_wing = useOffset_wing ? y_A_bot_pred_wing : y_A_bot_wing
var line ln_CB_top_wing = na
var line ln_CB_bot_wing = na
var line ln_BA_top_wing = na
var line ln_BA_bot_wing = na
var linefill lf_CB_wing = na
var linefill lf_BA_wing = na
if haveLeftWing
if na(ln_CB_top_wing)
ln_CB_top_wing := line.new(
x1 = (useOffset_wing ? x_C_draw_wing : x_C_wing),
y1 = y_C_top_wing,
x2 = (useOffset_wing ? x_B_draw_wing : x_B_wing),
y2 = y_B_top_wing,
xloc = xloc.bar_index,
extend = extend.none,
width = 1,
color = activeLeftColor_wing )
else
line.set_xy1(ln_CB_top_wing, (useOffset_wing ? x_C_draw_wing : x_C_wing), y_C_top_wing)
line.set_xy2(ln_CB_top_wing, (useOffset_wing ? x_B_draw_wing : x_B_wing), y_B_top_wing)
line.set_color(ln_CB_top_wing, activeLeftColor_wing)
if na(ln_CB_bot_wing)
ln_CB_bot_wing := line.new(
x1 = (useOffset_wing ? x_C_draw_wing : x_C_wing),
y1 = y_C_bot_wing,
x2 = (useOffset_wing ? x_B_draw_wing : x_B_wing),
y2 = y_B_bot_wing,
xloc = xloc.bar_index,
extend = extend.none,
width = 1,
color = activeLeftColor_wing )
else
line.set_xy1(ln_CB_bot_wing, (useOffset_wing ? x_C_draw_wing : x_C_wing), y_C_bot_wing)
line.set_xy2(ln_CB_bot_wing, (useOffset_wing ? x_B_draw_wing : x_B_wing), y_B_bot_wing)
line.set_color(ln_CB_bot_wing, activeLeftColor_wing)
if not na(lf_CB_wing)
linefill.delete(lf_CB_wing)
lf_CB_wing := linefill.new(ln_CB_top_wing, ln_CB_bot_wing, color = color.new(activeLeftColor_wing, fillTrans_wing))
if haveRightWing
if na(ln_BA_top_wing)
ln_BA_top_wing := line.new(
x1 = (useOffset_wing ? x_B_draw_wing : x_B_wing),
y1 = y_B_top_wing,
x2 = (useOffset_wing ? x_A_draw_wing : x_A_wing),
y2 = (useOffset_wing ? y_A_top_draw_wing : y_A_top_wing),
xloc = xloc.bar_index,
extend = extend.none,
width = 1,
color = activeRightColor_wing )
else
line.set_xy1(ln_BA_top_wing, (useOffset_wing ? x_B_draw_wing : x_B_wing), y_B_top_wing)
line.set_xy2(ln_BA_top_wing, (useOffset_wing ? x_A_draw_wing : x_A_wing), (useOffset_wing ? y_A_top_draw_wing : y_A_top_wing))
line.set_color(ln_BA_top_wing, activeRightColor_wing)
if na(ln_BA_bot_wing)
ln_BA_bot_wing := line.new(
x1 = (useOffset_wing ? x_B_draw_wing : x_B_wing),
y1 = y_B_bot_wing,
x2 = (useOffset_wing ? x_A_draw_wing : x_A_wing),
y2 = (useOffset_wing ? y_A_bot_draw_wing : y_A_bot_wing),
xloc = xloc.bar_index,
extend = extend.none,
width = 1,
color = activeRightColor_wing )
else
line.set_xy1(ln_BA_bot_wing, (useOffset_wing ? x_B_draw_wing : x_B_wing), y_B_bot_wing)
line.set_xy2(ln_BA_bot_wing, (useOffset_wing ? x_A_draw_wing : x_A_wing), (useOffset_wing ? y_A_bot_draw_wing : y_A_bot_wing))
line.set_color(ln_BA_bot_wing, activeRightColor_wing)
if not na(lf_BA_wing)
linefill.delete(lf_BA_wing)
lf_BA_wing := linefill.new(ln_BA_top_wing, ln_BA_bot_wing, color = color.new(activeRightColor_wing, fillTrans_wing))
_angle_text_color_wing(angDeg) =>
na(angDeg) ? color.new(textCol, 60) :
math.abs(angDeg) < nearZeroDeg_wing ? #98999eb7 :
angDeg > 0 ? textCol : negColor
if barstate.islast and not na(hud)
table.cell(hud, 2, 2, "????C→B top = " + "\n" + "\n" + "????"+ _fmt_deg_wing(angDegN_CB_top_wing), text_color = _angle_text_color_wing(angDegN_CB_top_wing), bgcolor = panelBG, text_size = size.small, text_halign = text.align_left)
table.cell(hud, 2, 3, "????C→B bot = " + "\n" + "\n" + "????"+_fmt_deg_wing(angDegN_CB_bot_wing), text_color = _angle_text_color_wing(angDegN_CB_bot_wing), bgcolor = panelBG, text_size = size.small, text_halign = text.align_left)
table.cell(hud, 3, 2, "????B→A top = " + "\n" + "\n" + "????"+_fmt_deg_wing(angDegN_BA_top_wing), text_color = _angle_text_color_wing(angDegN_BA_top_wing), bgcolor = panelBG, text_size = size.small, text_halign = text.align_left)
table.cell(hud, 3, 3, "????B→A bot = " + "\n" + "\n" + "????"+_fmt_deg_wing(angDegN_BA_bot_wing), text_color = _angle_text_color_wing(angDegN_BA_bot_wing), bgcolor = panelBG, text_size = size.small, text_halign = text.align_left)
const int dec_ang = 1 // rounding decimals
const int outColAlpha_ang = 2 // fixed HUD column for α
const int outColBeta_ang = 3 // fixed HUD column for β
const int outRow_ang = 4 // fixed HUD row for α & β
int iB_ang = int(math.floor((P - 1) / 2.0))
int iC_ang = P - 1
int x_A_ang = bar_index
int x_B_ang = bar_index - iB_ang
int x_C_ang = bar_index - iC_ang
float y_A_top_ang = high
float y_B_top_ang = high[iB_ang]
float y_C_top_ang = high[iC_ang]
float y_A_bot_ang = low
float y_B_bot_ang = low[iB_ang]
float y_C_bot_ang = low[iC_ang]
bool ready_ang = bar_index >= iC_ang and iC_ang > iB_ang and iB_ang > 0
float atr_ang = ta.atr(P)
float atr_safe_ang = math.max(atr_ang, syminfo.mintick) // avoid div-by-near-zero
_hypot_ang(x, y) => math.sqrt(x * x + y * y)
_clamp_ang(v, lo, hi) => v < lo ? lo : v > hi ? hi : v
_angle360_from_vectors_ang(ax, ay, b_x, b_y) =>
dot = ax * b_x + ay * b_y
magA = _hypot_ang(ax, ay)
magB = _hypot_ang(b_x, b_y)
cosTh = magA == 0 or magB == 0 ? na : _clamp_ang(dot / (magA * magB), -1.0, 1.0)
base = na(cosTh) ? na : math.todegrees(math.acos(cosTh)) // unsigned [0,180]
crossZ = ax * b_y - ay * b_x
na(base) ? na : (crossZ >= 0 ? base : 360.0 - base)
_avg2_na_ok_ang(a, b) => na(a) and na(b) ? na : na(a) ? b : na(b) ? a : (a + b) / 2.0
_roundN_ang(v, n) =>
pow10 = math.pow(10.0, n)
math.round(v * pow10) / pow10
float dx_L_ang = float(x_C_ang - x_B_ang) // left wing (C←B), negative
float dx_R_ang = float(x_A_ang - x_B_ang) // right wing (B→A), positive
float dy_L_top_n_ang = (y_C_top_ang - y_B_top_ang) / atr_safe_ang
float dy_R_top_n_ang = (y_A_top_ang - y_B_top_ang) / atr_safe_ang
float dy_L_bot_n_ang = (y_C_bot_ang - y_B_bot_ang) / atr_safe_ang
float dy_R_bot_n_ang = (y_A_bot_ang - y_B_bot_ang) / atr_safe_ang
float theta_top_ang = ready_ang ? _angle360_from_vectors_ang(dx_L_ang, dy_L_top_n_ang, dx_R_ang, dy_R_top_n_ang) : na
float theta_bot_ang = ready_ang ? _angle360_from_vectors_ang(dx_L_ang, dy_L_bot_n_ang, dx_R_ang, dy_R_bot_n_ang) : na
float theta_deg_ang = _avg2_na_ok_ang(theta_top_ang, theta_bot_ang)
alpha_deg_ang = na(theta_deg_ang) ? na : 360.0 - theta_deg_ang
beta_deg_ang = theta_deg_ang
if barstate.islast and not na(hud)
string aTxt = na(alpha_deg_ang) ? "∠α (Top) = —" : ("∠α (Top) = " + "\n" + "\n" + "????" + str.tostring(_roundN_ang(alpha_deg_ang, dec_ang)) + "°")
string bTxt = na(beta_deg_ang) ? "∠β (Bottom) = —" : ("∠β (Bottom) = " + "\n"+ "\n" + "????" + str.tostring(_roundN_ang(beta_deg_ang, dec_ang)) + "°")
colAlpha = not na(alpha_deg_ang) and alpha_deg_ang > 180 ? negColor : textCol
colBeta = not na(beta_deg_ang) and beta_deg_ang < 180 ? negColor : textCol
table.cell(hud, outColAlpha_ang, outRow_ang, aTxt, text_color = colAlpha, bgcolor = panelBG, text_size = size.small, text_halign = text.align_left, tooltip = "Top arc angle at vertex B (ATR-normalized). Red if > 180°.")
table.cell(hud, outColBeta_ang, outRow_ang, bTxt, text_color = colBeta, bgcolor = panelBG, text_size = size.small, text_halign = text.align_left, tooltip = "Bottom arc angle at vertex B (ATR-normalized). Red if < 180°.")
var line ln_alpha_dash_ang = na // TOP (blue)
var line ln_beta_dash_ang = na // BOTTOM (red)
bool drawBlueTop_ang = ready_ang and not na(alpha_deg_ang) and alpha_deg_ang < 180
bool drawRedBot_ang = ready_ang and not na(beta_deg_ang) and beta_deg_ang < 180
if drawBlueTop_ang
if na(ln_alpha_dash_ang)
ln_alpha_dash_ang := line.new(x1 = x_C_ang, y1 = y_C_top_ang, x2 = x_A_ang, y2 = y_A_top_ang,
xloc = xloc.bar_index, extend = extend.none, width = 2, color = textCol, style = line.style_dashed)
else
line.set_xy1(ln_alpha_dash_ang, x_C_ang, y_C_top_ang)
line.set_xy2(ln_alpha_dash_ang, x_A_ang, y_A_top_ang)
line.set_color(ln_alpha_dash_ang, textCol)
else if not na(ln_alpha_dash_ang)
line.delete(ln_alpha_dash_ang)
ln_alpha_dash_ang := na
if drawRedBot_ang
if na(ln_beta_dash_ang)
ln_beta_dash_ang := line.new(x1 = x_C_ang, y1 = y_C_bot_ang, x2 = x_A_ang, y2 = y_A_bot_ang,
xloc = xloc.bar_index, extend = extend.none, width = 2, color = negColor, style = line.style_dashed)
else
line.set_xy1(ln_beta_dash_ang, x_C_ang, y_C_bot_ang)
line.set_xy2(ln_beta_dash_ang, x_A_ang, y_A_bot_ang)
line.set_color(ln_beta_dash_ang, negColor)
else if not na(ln_beta_dash_ang)
line.delete(ln_beta_dash_ang)
ln_beta_dash_ang := na
const string GRP_OBOS_obos = "⑰ OB/OS Spike — Module"
bool enableOBOS_obos = input.bool(true, title = "Activate OB/OS module", group = GRP_OBOS_obos,
tooltip = "Turn the OverBought/OverSold spike detection on or off.")
int minHits_obos = input.int(3, title = "Minimum hits (out of 7)", minval = 1, maxval = 7, group = GRP_OBOS_obos,
tooltip = "Minimum number of oscillator overbought/oversold hits required for confirmation.")
int syncWin_obos = input.int(1, title = "Bars for hit sync window", minval = 0, maxval = 2, group = GRP_OBOS_obos,
tooltip = "Max with up to N previous bars' hit counts (0..2) to smooth spiky votes.")
int volLen_obos = input.int(55, title = "Volume period", minval = 5, group = GRP_OBOS_obos,
tooltip = "Lookback for TF-level volume SMA/STD used in spike detection.")
float kVolRatio_obos = input.float(1.6, title = "Volume spike threshold (Vol/SMA)", step = 0.1, group = GRP_OBOS_obos,
tooltip = "Call a volume spike when Vol / SMA(Vol) ≥ threshold.")
float zVolThr_obos = input.float(1.8, title = "Z-Score volume threshold", step = 0.1, group = GRP_OBOS_obos,
tooltip = "Alternative trigger: (Vol − SMA)/STD ≥ threshold.")
int rsiLen_obos = input.int(14, title = "RSI period", minval = 2, group = GRP_OBOS_obos)
int stLen_obos = input.int(14, title = "Stochastic period", minval = 3, group = GRP_OBOS_obos)
int stSm_obos = input.int(3, title = "Stochastic smoothing", minval = 1, group = GRP_OBOS_obos)
int wprLen_obos = input.int(14, title = "Williams %R period", minval = 3, group = GRP_OBOS_obos)
int cciLen_obos = input.int(27, title = "CCI period", minval = 3, group = GRP_OBOS_obos)
int mfiLen_obos = input.int(14, title = "MFI period", minval = 3, group = GRP_OBOS_obos)
int demLen_obos = input.int(14, title = "DeMarker period", minval = 3, group = GRP_OBOS_obos)
int srsiLen_obos = input.int(14, title = "Stochastic RSI period", minval = 3, group = GRP_OBOS_obos)
bool useRSI_obos = input.bool(true, title = "Enable RSI", group = GRP_OBOS_obos)
bool useSTO_obos = input.bool(true, title = "Enable Stochastic", group = GRP_OBOS_obos)
bool useWPR_obos = input.bool(true, title = "Enable WilliaПоказано первые 50% кода (символов: 34869)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.