Breaker Blocks
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator breaker blocks for tradingview.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Breaker Blocks — это индикатор-оверлей для TradingView, который визуализирует на графике так называемые «блоки прорыва» — прямоугольные зоны, появляющиеся при пробое ценой ранее определённых пивотных уровней. Индикатор автоматически находит локальные максимумы и минимумы с помощью функций ta.pivothigh и ta.pivotlow, а затем отслеживает, произошло ли закрытие цены за пределами этих пивотов.
При подтверждении прорыва индикатор рисует на графике коробки (box), промежуточные линии (line) и текстовые метки (label), цвет которых настраивается отдельно для бычьих и медвежьих сигналов. Каждому блоку присваивается ранг на основе нескольких нормализованных показателей: процентного ранга спреда, объёма, глубины ликвидационного пробоя и дисперсии.
Индикатор предоставляет широкие возможности настройки: фильтр направления отображения (бычий, медвежий или оба), ограничение максимального количества видимых блоков, автоматическое удаление перекрывающихся зон, отображение ранговой оценки и выбор шрифта и размера текста. Также предусмотрено скрытие бренд-метки в углу графика.
Внутренние расчёты основаны на стандартных технических функциях Pine Script: ta.percentrank для ранжирования объёма и спреда, ta.atr для определения волатильности, а также ta.pivothigh и ta.pivotlow для обнаружения пивотов. Индикатор поддерживает пользовательские оповещения, срабатывающие при появлении нового блока прорыва.
Настройки программы
| Настройка | Описание |
|---|---|
| general_font | Выбор семейства шрифта для текста на графике: Default или Monospace. |
| general_text | Размер глобального текста на графике: Tiny, Small, Normal, Large, Huge или Auto. |
| general_brand_show | Логический переключатель. При включении отображается бренд-метка в правом нижнем углу графика. |
| bb_bias | Фильтр направления отображения блоков: Neutral — оба направления, Bullish — только бычьи, Bearish — только медвежьи. |
| bb_show_max | Максимальное количество блоков прорыва, одновременно отображаемых на графике. |
| bb_len | Период поиска пивотных точек (количество баров назад для определения локальных максимумов и минимумов). |
| bb_bull_css | Цвет границы и заливки бычьих блоков прорыва. |
| bb_bull_inv_css | Цвет инвертированной заливки бычьих блоков (область справа от блока). |
| bb_bear_css | Цвет границы и заливки медвежьих блоков прорыва. |
| bb_bear_inv_css | Цвет инвертированной заливки медвежьих блоков (область справа от блока). |
| bb_overlap_remove | Логический переключатель. При включении автоматически удаляются блоки, визуально перекрывающие друг друга. |
| bb_show_rank | Логический переключатель. При включении отображается ранговая оценка каждого блока (Prime, Premium, Standard, Basic, Weak) и цвет заливки адаптируется к оценке. |
Поиск по коду файла
indicator(title = "Breaker Blocks", shorttitle = "Breaker Blocks", overlay = true, max_lines_count = 500, max_labels_count = 500, max_boxes_count = 500)
colors_teal = color.teal
colors_red = color.red
colors_white = color.white
colors_black = color.black
colors_gray = color.gray
general_font = input.string("Monospace", "Text ", options = ["Default", "Monospace"], inline = "1.0", group = "General")
general_text = input.string("Tiny", "", options = ["Tiny", "Small", "Normal", "Large", "Huge", "Auto"], inline = "1.0", group = "General", tooltip = "Customize global text size and style")
general_brand_show = input.bool(false, "Hide Brand", group = "General")
bb_bias = input.string("Neutral", "Bias ", options=["Neutral", "Bullish", "Bearish"], group = "Settings")
bb_show_max = input.int(3, "Max Blocks ", inline = "1.0", group = "Settings")
bb_len = input.int(5, "Pivot Lookback ", inline = "2.0", group = "Settings")
bb_bull_css = input.color(color.new(colors_gray, 80), "Bullish ", inline = "3.0", group = "Settings")
bb_bull_inv_css = input.color(color.new(colors_teal, 60), "", inline = "3.0", group = "Settings")
bb_bear_css = input.color(color.new(colors_gray, 80), "Bearish ", inline = "4.0", group = "Settings")
bb_bear_inv_css = input.color(color.new(colors_red, 60), "", inline = "4.0", group = "Settings")
bb_overlap_remove = input.bool(false, "Remove Overlaps", group = "Settings")
bb_show_rank = input.bool(false, "Show Rank", group = "Settings")
type UDT_Pivot
int idx
float p
bool broken
type UDT_Breaker
int idx
float top
float bottom
bool is_bull
bool mitigated
box bx
box bx_inv
line mid_ln
float score
string rank_name
type UDT_Store
array<UDT_Breaker> bull_breakers
array<UDT_Breaker> bear_breakers
method text_size(string size) =>
switch size
"Tiny" => size.tiny
"Small" => size.small
"Normal" => size.normal
"Large" => size.large
"Huge" => size.huge
"Auto" => size.auto
method font_style(string font) =>
switch font
'Default' => font.family_default
'Monospace' => font.family_monospace
method notransp(color css) =>
color.rgb(color.r(css), color.g(css), color.b(css))
overlaps(float top1, float bottom1, float top2, float bottom2) =>
hi1 = math.max(top1, bottom1)
lo1 = math.min(top1, bottom1)
hi2 = math.max(top2, bottom2)
lo2 = math.min(top2, bottom2)
math.max(lo1, lo2) <= math.min(hi1, hi2)
method get_rank_name(float score) =>
score >= 80 ? "Prime" :
score >= 60 ? "Premium" :
score >= 40 ? "Standard" :
score >= 20 ? "Basic" :
"Weak"
method get_dynamic_color(color base_css, float score) =>
float base_t = color.t(base_css)
float offset = 30 - (score / 100) * 60
float final_t = math.max(0, math.min(100, base_t + offset))
color.rgb(color.r(base_css), color.g(base_css), color.b(base_css), final_t)
var UDT_Store store = UDT_Store.new(
array.new<UDT_Breaker>(),
array.new<UDT_Breaker>()
)
method remove_breaker(UDT_Breaker brk) =>
brk.bx.delete()
brk.bx_inv.delete()
if not na(brk.mid_ln)
brk.mid_ln.delete()
method clean_old_breakers(array<UDT_Breaker> arr, int max_size) =>
while arr.size() > max_size
brk = arr.pop()
brk.remove_breaker()
method check_mitigation(UDT_Store s) =>
if s.bull_breakers.size() > 0
for i = s.bull_breakers.size() - 1 to 0
brk = s.bull_breakers.get(i)
if close < brk.bottom
brk.remove_breaker()
s.bull_breakers.remove(i)
if s.bear_breakers.size() > 0
for i = s.bear_breakers.size() - 1 to 0
brk = s.bear_breakers.get(i)
if close > brk.top
brk.remove_breaker()
s.bear_breakers.remove(i)
var ph_arr = array.new<UDT_Pivot>()
var pl_arr = array.new<UDT_Pivot>()
int MAX_LOOKBACK = 500
float spread = high - low
float vol_pct = ta.percentrank(volume, 200)
float spread_pct = ta.percentrank(spread, 200)
float atr = ta.atr(100)
max_bars_back(spread_pct, 1000)
max_bars_back(vol_pct, 1000)
max_bars_back(atr, 1000)
ph = ta.pivothigh(high, bb_len, bb_len)
pl = ta.pivotlow(low, bb_len, bb_len)
if not na(ph)
ph_arr.unshift(UDT_Pivot.new(bar_index[bb_len], ph, false))
if ph_arr.size() > 10
ph_arr.pop()
if not na(pl)
pl_arr.unshift(UDT_Pivot.new(bar_index[bb_len], pl, false))
if pl_arr.size() > 10
pl_arr.pop()
store.check_mitigation()
if (bb_bias == "Neutral" or bb_bias == "Bullish") and ph_arr.size() > 0 and pl_arr.size() > 0
for i = 0 to ph_arr.size() - 1
H = ph_arr.get(i)
bars_h = bar_index - H.idx
if not H.broken and close > H.p and bars_h > 0 and bars_h < MAX_LOOKBACK
H.broken := true
float ll_val = low
int ll_idx = bar_index
for j = 0 to bars_h
if low[j] < ll_val
ll_val := low[j]
ll_idx := bar_index[j]
UDT_Pivot L = na
for j = 0 to pl_arr.size() - 1
if pl_arr.get(j).idx < H.idx
L := pl_arr.get(j)
break
if not na(L) and ll_val < L.p
float ob_top = na
float ob_btm = na
int ob_idx = na
int max_lookback_ob = int(math.min(bars_h + 20, bar_index))
for j = bars_h to max_lookback_ob
if close[j] > open[j]
ob_top := high[j]
ob_btm := low[j]
ob_idx := bar_index[j]
break
if not na(ob_top)
float ob_score = spread_pct[bar_index - ob_idx]
float vol_score = vol_pct[bar_index - ob_idx]
float sweep_depth = L.p - ll_val
float sweep_score = math.min(100,Показано первые 50% кода (символов: 8940)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.