← К каталогу
Исходный код · ID 4452

PowerHouse v3

indicator powerhouse v3 for tradingview.pine
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

PowerHouse v3 — индикатор для TradingView, написанный на Pine Script v6. Он определяет структурные сигналы на основе изменений рыночной структуры: CHoCH (изменение характера) и BOS (прорыв структуры), используя Swing High и Swing Low с настраиваемой длиной.

Индикатор предоставляет систему фильтрации сигналов из семи доступных проверок: импульс, тренд старшего таймфрейма, тренд младшего таймфрейма, объём, пробой, порядок потока (CVD) и трендовая лента. Все включённые фильтры должны совпадать для подтверждения сигнала. Каждый сигнал получает оценку A, B или C в зависимости от количества совпавших проверок.

Для каждого сигнала формируется торговый план с уровнем стоп-лосса и тремя целями, выраженными в множителях риска, ATR или пунктах. Индикатор отслеживает исторический процент попадания каждой цели. Также реализована адаптивная трендовая лента на основе KAMA, зона OTE, зона равновесия (50%), матрица трендов на шести таймфреймах и информационная панель.

Настройки программы

НастройкаОписание
sigMode Режим отображения структурных сигналов: CHoCH + BOS (оба типа), CHoCH only (только изменение характера) или BOS only (только прорыв структуры).
pvLen Количество баров по каждую сторону от Swing High или Swing Low для определения структурных точек. Меньшее значение — более частые сигналы, большее — более крупная структура.
oneDir Ограничивает подачу сигналов: после сигнала в одном направлении следующий сигнал возможен только при появлении сигнала в противоположном направлении.
showReady Отображает предварительные сигналы «Get Ready» — метки, указывающие приближение цены к уровню триггера при совпадении включённых фильтров.
readyK Расстояние в единицах ATR от уровня триггера, при котором отображается предварительный сигнал «Get Ready»: цена должна находиться в пределах readyK × ATR от уровня и фильтры должны совпадать.
showGrade Отображает оценку сигнала (A / B / C) рядом с меткой сигнала.
showStr Отображает линии структурных Break (CHoCH / BOS) и метки на графике.
showSw Отображает метки Swing High и Swing Low (HH / HL / LH / LL) на графике.
showTrig Отображает пунктирные линии следующих уровней триггера BUY / SELL (непрорванные Swing High и Swing Low).
fMom Включает проверку импульса: нормализованное изменение цены за momLen баров в единицах ATR должно быть не менее momK.
momLen Количество баров для расчёта импульса: изменение цены за этот период.
momK Минимальное значение импульса в единицах ATR для прохождения проверки импульса.
fHtf Включает проверку тренда старшего таймфрейма: направление определяется соотношением закрытия и EMA на закрытых барах выбранного таймфрейма htfTf.
htfTf Таймфрейм для определения тренда старшего таймфрейма, используемый в фильтре.
htfLen Период EMA для определения тренда старшего таймфрейма.
fLtf Включает проверку тренда младшего таймфрейма: направление определяется соотношением закрытия и EMA на закрытых барах выбранного таймфрейма ltfTf.
ltfTf Таймфрейм для определения тренда младшего таймфрейма, используемый в фильтре.
ltfLen Период EMA для определения тренда младшего таймфрейма.
fVol Включает проверку объёма: текущий объём должен быть не менее volK × среднего объёма за 20 баров.
volK Минимальное кратное среднего объёма (× average) для прохождения проверки объёма.
fBrk Включает проверку пробоя: сигнал подтверждается, если свечка закрывается за пределом наивысшего высокого или низкого низкого за период brkLen.
brkLen Количество баров для поиска максимального/минимального значения при проверке пробоя: цена закрытия должна выйти за пределы наивысшего высокого или низкого низкого за этот период.
fFlow Включает фильтр порядка потока (CVD): кумулятивный дельта объёма за период flowLen должна указывать в сторону сигнала. Дельта оценивается по свечкам младшего таймфрейма.
flowLen Количество баров для расчёта изменения кумулятивной дельты объёма (CVD) при проверке порядка потока.
fRib Включает фильтр трендовой ленты: сигнал блокируется, если тренд ленты явно указывает в противоположную сторону. Нейтральная (серая) лента позволяет сигналы в обе стороны, не фильтруя развороты.
fSes Включает фильтр торговой сессии: сигналы подтверждаются только в указанном временном окне sesStr в часовом поясу sesTz.
sesStr Временное окно торговой сессии в формате часов (например, 0700-1600), в течение которого разрешены сигналы при включённом фильтре fSes.
sesTz Часовой пояс для определения торговой сессии (например, America/New_York).
showRib Отображает адаптивную трендовую ленту (KAMA) с заливками на графике.
showBar Отображает цвет свечей на графике в соответствии с направлением трендовой ленты (зелёные/красные или серые).
erLen Длина адаптивного периода для расчёта адаптивной скользящей средней (KAMA) трендовой ленты.
slowLen Длинный период для расчёта адаптивной скользящей средней (KAMA) трендовой ленты.
ribBand Расстояние в единицах ATR, которое цена должна преодолеть относительно базовой линии для смены направления трендовой ленты (при согласии трендового счёта). Большее значение — меньше переключений в консолидации.
ribSm Количество баров для сглаживания трендового счёта ленты: цвет плавно переходит через нейтральный серый при боковике вместо резких смен красного и зелёного.
slType Тип расчёта стоп-лосса: «Structure» — за противоположным Swing, ограниченный min и max ATR; «ATR ×» — фиксированное кратное ATR.
slAtr Множитель ATR для расчёта стоп-лосса при выборе типа стопа «ATR ×».
minRisk Минимальное расстояние стоп-лосса в единицах ATR (при выборе типа стопа «Structure»).
maxRisk Максимальное расстояние стоп-лосса в единицах ATR (при выборе типа стопа «Structure»).
tpMode Единица измерения целей: «R multiple» (кратность риска), «ATR ×» (кратность ATR) или «Points» (в пунктах инструмента).
tp1On Включает отображение и отслеживание первой цели TP1 в торговом плане.
tp1 Расстояние до первой цели (TP1) в единицах, определяемых режимом tpMode (множитель R, ATR или пункты).
tp2On Включает отображение и отслеживание второй цели TP2 в торговом плане.
tp2 Расстояние до второй цели (TP2) в единицах, определяемых режимом tpMode.
tp3On Включает отображение и отслеживание третьей цели TP3 в торговом плане.
tp3 Расстояние до третьей цели (TP3) в единицах, определяемых режимом tpMode.
showTP Отображает торговый план (линии входа, стопа и целей с метками) для каждого сигнала.
showPct Отображает исторический процент попадания каждой цели (TP1–TP3) рядом с уровнями целей на торговом плане.
projBars Длина торгового плана в барах: горизонтальные линии стопа и целей продлеваются на указанное количество баров от сигнала.
keepSig Максимальное количество сигналов и их торговых планов, отображаемых на графике одновременно.
showOTE Отображает зону OTE (Optimal Trade Entry) текущего рывка на графике.
oteLo Нижняя граница зоны OTE как доля от длины текущего рывка (от 0 до 1).
oteHi Верхняя граница зоны OTE как доля от длины текущего рывка (от 0 до 1).
showEQ Отображает линию равновесия (50%) текущего рывка на графике.
showPD Отображает заливку премии (Premium) и дисконта (Discount) относительно текущего рывка.
showDash Отображает информационную панель с данными о тренде на разных таймфреймах, волатильности, текущем сигнале и уровнях.
dashPos Положение информационной панели на графике: верхний правый, верхний левый, нижний правый, нижний левый или средний правый.
dashSz Размер текста на информационной панели: Tiny, Small или Normal.
mtf1 Первый таймфрейм для матрицы трендов, отображаемой на информационной панели.
mtf2 Второй таймфрейм для матрицы трендов.
mtf3 Третий таймфрейм для матрицы трендов.
mtf4 Четвёртый таймфрейм для матрицы трендов.
mtf5 Пятый таймфрейм для матрицы трендов.
mtf6 Шестой таймфрейм для матрицы трендов.
mtfLen Период EMA для расчёта тренда на каждом таймфрейме матрицы (по закрытым барам).
cBull Цвет для бычьих (покупательских) элементов индикатора.
cBear Цвет для медвежьих (продажных) элементов индикатора.
cReady Цвет меток «Ready» (предварительные сигналы готовности).
cChoch Цвет для отображения линий и меток CHoCH (изменение характера).
cBos Цвет для отображения линий и меток BOS (прорыв структуры).
cTp Цвет линий и меток целей (TP1–TP3) на торговом плане.
cSl Цвет линии и метки стоп-лосса на торговом плане.
cEnt Цвет линии входа в сделку на торговом плане.
Получить полный код

Поиск по коду файла

indicator("PowerHouse v3", "PowerHouse v3", overlay = true,
     max_boxes_count = 500, max_lines_count = 500, max_labels_count = 500, max_bars_back = 500)

grpS = "1 · Signals"
sigMode   = input.string("CHoCH + BOS", "Signals", options = ["CHoCH + BOS", "CHoCH only", "BOS only"], group = grpS,
     tooltip = "CHoCH: the first break against the current structure (a possible reversal). BOS: a break in the direction of the structure (continuation).")
pvLen     = input.int(5, "Structure length", minval = 2, maxval = 50, group = grpS,
     tooltip = "Bars on each side of a swing high or low. Lower = faster signals, higher = bigger structure.")
oneDir    = input.bool(true, "One signal per direction until the opposite signal", group = grpS)
showReady = input.bool(true, "Get Ready pre-signals", inline = "rd", group = grpS)
readyK    = input.float(0.5, "within ATR", minval = 0.05, step = 0.05, inline = "rd", group = grpS,
     tooltip = "Price is within this many ATR of the level that would trigger a signal and the enabled filters already agree.")
showGrade = input.bool(true, "Show grade on signals", group = grpS)
showStr   = input.bool(true, "Structure lines (CHoCH / BOS)", inline = "st", group = grpS)
showSw    = input.bool(true, "Swing labels (HH / HL / LH / LL)", inline = "st", group = grpS)
showTrig  = input.bool(true, "Next BUY / SELL trigger levels", group = grpS,
     tooltip = "Dotted lines at the unbroken swing high and low: a close beyond them is the next structure break.")

grpF = "2 · Filters (every enabled filter must agree)"
fMom   = input.bool(true, "Momentum", inline = "f1", group = grpF)
momLen = input.int(5, "bars", minval = 1, inline = "f1", group = grpF)
momK   = input.float(0.5, "ATR", minval = 0.0, step = 0.1, inline = "f1", group = grpF)
fHtf   = input.bool(true, "Higher-timeframe trend", inline = "f2", group = grpF)
htfTf  = input.timeframe("60", "", inline = "f2", group = grpF)
htfLen = input.int(50, "EMA", minval = 2, inline = "f2", group = grpF)
fLtf   = input.bool(false, "Lower-timeframe trend", inline = "f3", group = grpF)
ltfTf  = input.timeframe("1", "", inline = "f3", group = grpF)
ltfLen = input.int(20, "EMA", minval = 2, inline = "f3", group = grpF)
fVol   = input.bool(false, "Volume", inline = "f4", group = grpF)
volK   = input.float(1.2, "× average", minval = 0.1, step = 0.1, inline = "f4", group = grpF)
fBrk   = input.bool(false, "Breakout", inline = "f5", group = grpF,
     tooltip = "The signal candle also closes beyond the highest high (lowest low) of the lookback.")
brkLen = input.int(20, "bars", minval = 2, inline = "f5", group = grpF)
fFlow  = input.bool(false, "Order flow (CVD)", inline = "f6", group = grpF,
     tooltip = "Cumulative volume delta over the lookback points the same way. Delta is estimated from lower-timeframe candles.")
flowLen = input.int(20, "bars", minval = 2, inline = "f6", group = grpF)
fRib   = input.bool(true, "Trend ribbon", group = grpF,
     tooltip = "Blocks a signal only when the ribbon's trend score clearly points the other way. A neutral (grey) ribbon allows signals in both directions, so reversals (CHoCH) are not filtered out.")
fSes   = input.bool(false, "Session window", inline = "f8", group = grpF)
sesStr = input.session("0700-1600", "", inline = "f8", group = grpF)
sesTz  = input.string("America/New_York", "Session timezone", group = grpF)

grpR = "3 · Trend ribbon"
showRib = input.bool(true, "Ribbon", inline = "rb", group = grpR)
showBar = input.bool(true, "Candle colours", inline = "rb", group = grpR)
erLen   = input.int(10, "Adaptive length", minval = 2, inline = "kl", group = grpR)
slowLen = input.int(30, "slow", minval = 3, inline = "kl", group = grpR)
ribBand = input.float(0.6, "Flip band (ATR)", minval = 0.0, step = 0.1, group = grpR,
     tooltip = "The ribbon only changes direction when price closes this many ATR beyond the baseline and the trend score agrees. Higher = fewer flips in consolidation.")
ribSm   = input.int(10, "Colour smoothing (bars)", minval = 1, maxval = 50, group = grpR,
     tooltip = "The colour follows a smoothed trend score: it fades through neutral grey when the market goes sideways instead of jumping between red and green.")

grpT = "4 · Trade plan"
slType  = input.string("Structure", "Stop", options = ["Structure", "ATR ×"], inline = "sl", group = grpT,
     tooltip = "Structure: beyond the opposite swing, kept between the min and max ATR distance. ATR ×: a fixed ATR multiple.")
slAtr   = input.float(1.5, "", minval = 0.1, step = 0.1, inline = "sl", group = grpT)
minRisk = input.float(0.5, "Stop distance (ATR): min", minval = 0.1, step = 0.1, inline = "rk", group = grpT)
maxRisk = input.float(3.0, "max", minval = 0.2, step = 0.1, inline = "rk", group = grpT)
tpMode  = input.string("R multiple", "Targets in", options = ["R multiple", "ATR ×", "Points"], group = grpT)
tp1On   = input.bool(true, "TP1", inline = "t1", group = grpT)
tp1     = input.float(1.0, "", minval = 0.01, step = 0.25, inline = "t1", group = grpT)
tp2On   = input.bool(true, "TP2", inline = "t1", group = grpT)
tp2     = input.float(2.0, "", minval = 0.01, step = 0.25, inline = "t1", group = grpT)
tp3On   = input.bool(true, "TP3", inline = "t1", group = grpT)
tp3     = input.float(3.0, "", minval = 0.01, step = 0.25, inline = "t1", group = grpT)
showTP  = input.bool(true, "Show trade plan", inline = "sp", group = grpT)
showPct = input.bool(false, "Hit rate on targets", inline = "sp", group = grpT)
projBars = input.int(20, "Plan length (bars)", minval = 5, maxval = 200, group = grpT)
keepSig = input.int(5, "Signals kept on chart", minval = 1, maxval = 50, group = grpT)

grpI = "5 · ICT"
showOTE = input.bool(true, "OTE zone of the current leg", inline = "ot", group = grpI)
oteLo   = input.float(0.62, "", minval = 0.0, maxval = 1.0, step = 0.01, inline = "ot", group = grpI)
oteHi   = input.float(0.79, "to", minval = 0.0, maxval = 1.0, step = 0.01, inline = "ot", group = grpI)
showEQ  = input.bool(true, "Equilibrium (50%)", inline = "eq", group = grpI)
showPD  = input.bool(true, "Premium / discount shading", inline = "eq", group = grpI)

grpD = "6 · Dashboard"
showDash = input.bool(true, "Dashboard", inline = "db", group = grpD)
dashPos  = input.string("Top right", "", options = ["Top right", "Top left", "Bottom right", "Bottom left", "Middle right"], inline = "db", group = grpD)
dashSz   = input.string("Small", "Text size", options = ["Tiny", "Small", "Normal"], group = grpD)
mtf1 = input.timeframe("5", "Matrix", inline = "m1", group = grpD)
mtf2 = input.timeframe("15", "", inline = "m1", group = grpD)
mtf3 = input.timeframe("60", "", inline = "m1", group = grpD)
mtf4 = input.timeframe("240", "", inline = "m2", group = grpD)
mtf5 = input.timeframe("D", "", inline = "m2", group = grpD)
mtf6 = input.timeframe("W", "", inline = "m2", group = grpD)
mtfLen = input.int(50, "Matrix EMA", minval = 2, group = grpD)

grpC = "7 · Colours"
cBull  = input.color(#089981, "Buy", inline = "c1", group = grpC)
cBear  = input.color(#f23645, "Sell", inline = "c1", group = grpC)
cReady = input.color(#f5a623, "Get Ready", inline = "c1", group = grpC)
cChoch = input.color(#5b9cf6, "CHoCH", inline = "c2", group = grpC)
cBos   = input.color(#9598a1, "BOS", inline = "c2", group = grpC)
cTp    = input.color(#26a69a, "Targets", inline = "c3", group = grpC)
cSl    = input.color(#ef5350, "Stop", inline = "c3", group = grpC)
cEnt   = input.color(#b2b5be, "Entry", inline = "c3", group = grpC)

atr   = ta.atr(14)
tfSec = timeframe.in_seconds()

autoLtf = tfSec <= 900 ? "1" : tfSec <= 3600 ? "5" : tfSec <= 14400 ? "15" : tfSec <= 86400 ? "60" : "240"
[lV, lC, lO] = request.security_lower_tf(syminfo.tickerid, autoLtf, [volume, close, open])
float bV = 0.0
float sV = 0.0
if array.size(lV) > 0
    for i = 0 to array.size(lV) - 1
        v = nz(array.get(lV, i))
        if array.get(lC, i) >= array.get(lO, i)
            bV += v
        else
            sV += v
else
    r0 = high - low
    bV := r0 > 0 ? nz(volume) * (close - low) / r0 : nz(volume) * 0.5
    sV := nz(volume) - bV
cvd = ta.cum(bV - sV)

path  = math.sum(math.abs(nz(ta.change(close))), erLen)
effic = path > 0 ? math.abs(close - close[erLen]) / path : 0.0
scK   = math.pow(effic * (2.0 / 3 - 2.0 / (slowLen + 1)) + 2.0 / (slowLen + 1), 2)
var float kama = na
kama := na(kama) ? close : kama + scK * (close - kama)

kSlope = atr > 0 ? (kama - kama[5]) / atr : 0.0
rawSc  = atr > 0 ? math.max(-1.0, math.min(1.0, 0.6 * kSlope + 0.4 * (close - kama) / (2 * atr))) : 0.0
tScore = ta.ema(rawSc, ribSm)

var int ribDir = 0
if close > kama + ribBand * atr and tScore > 0.25
    ribDir := 1
else if close < kama - ribBand * atr and tScore < -0.25
    ribDir := -1

cNeu   = #787b86
ribCol = tScore >= 0 ? color.from_gradient(tScore, 0.0, 0.6, cNeu, cBull) : color.from_gradient(tScore, -0.6, 0.0, cBear, cNeu)
conv   = math.min(1.0, math.abs(tScore) / 0.6)
side   = ribDir == 0 ? 1 : ribDir
w      = 0.4 + conv
edge1  = kama - side * 0.35 * atr * w
edge2  = kama - side * 0.8 * atr * w
flipR  = ribDir != ribDir[1]
pK  = plot(showRib and not flipR ? kama : na, "Ribbon", color.new(ribCol, 5), 2, plot.style_linebr)
pE1 = plot(showRib and not flipR ? edge1 : na, "Ribbon inner edge", color.new(ribCol, 100), 1, plot.style_linebr)
pE2 = plot(showRib and not flipR ? edge2 : na, "Ribbon outer edge", color.new(ribCol, 70), 1, plot.style_linebr)
fill(pK, pE1, color.new(ribCol, int(78 - conv * 30)), "Ribbon core")
fill(pE1, pE2, color.new(ribCol, int(90 - conv * 18)), "Ribbon glow")
barcolor(showBar ? ribCol : na)

momN = atr > 0 ? (close - close[momLen]) / atr : 0.0
[hC, hE] = request.security(syminfo.tickerid, htfTf, [close[1], ta.ema(close, htfLen)[1]], lookahead = barmerge.lookahead_on)
htfDir = hC > hE ? 1 : hC < hE ? -1 : 0
[lCl, lEm] = request.security(syminfo.tickerid, ltfTf, [close, ta.ema(close, ltfLen)])
ltfDir = lCl > lEm ? 1 : lCl < lEm ? -1 : 0
volR   = ta.sma(nz(volume), 20) > 0 ? nz(volume) / ta.sma(nz(volume), 20) : 0.0
brkUp  = close > ta.highest(high, brkLen)[1]
brkDn  = close < ta.lowest(low, brkLen)[1]
cvdDir = cvd - cvd[flowLen] > 0 ? 1 : cvd - cvd[flowLen] < 0 ? -1 : 0
inSes  = not na(time(timeframe.period, sesStr, sesTz))
atrPct = ta.percentrank(atr, 100)

NAMES = array.from("Momentum", "Higher-timeframe trend", "Lower-timeframe trend", "Volume", "Breakout", "Order flow (CVD)", "Trend ribbon")
ENAB  = array.from(fMom, fHtf, fLtf, fVol, fBrk, fFlow, fRib)

checks(int d) =>
    array.from(momN * d >= momK, htfDir == d, ltfDir == d, volR >= volK, d == 1 ? brkUp : brkDn, cvdDir == d, tScore * d > -0.2)

passAll(int d, bool forReady) =>
    ag = checks(d)
    bool ok = true
    for i = 0 to 6
        if ENAB.get(i) and not ag.get(i) and not (forReady and (i == 0 or i == 4))
            ok := false
    ok and (not fSes or inSes)

grade(int d) =>
    ag = checks(d)
    int n = 0
    for i = 0 to 6
        n += ag.get(i) ? 1 : 0
    n >= 5 ? "A" : n >= 3 ? "B" : "C"

checkList(int d) =>
    ag = checks(d)
    string s = ""
    for i = 0 to 6
        s += "\n" + (ag.get(i) ? "✓ " : "– ") + NAMES.get(i) + (ENAB.get(i) ? "" : " (off)")
    s

sizeOf(string s) =>
    s == "Small" ? size.small : s == "Normal" ? size.normal : size.tiny

posOf(string s) =>
    s == "Top left" ? position.top_left : s == "Bottom right" ? position.bottom_right :
     s == "Bottom left" ? position.bottom_left : s == "Middle right" ? position.middle_right : position.top_right
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)

ph = ta.pivothigh(high, pvLen, pvLen)
pl = ta.pivotlow(low, pvLen, pvLen)
var float pH = na
var int   pHb = na
var bool  pHx = true      // already broken
var bool  pHr = false     // Get Ready shown
var float pL = na
var int   pLb = na
var bool  pLx = true
var bool  pLr = false
var int   msDir = 0
var swQ = array.new_label()
if not na(ph)
    if showSw
        swQ.push(label.new(bar_index - pvLen, ph, na(pH) ? "H" : ph > pH ? "HH" : "LH", style = label.style_label_down, color = color(na),
             textcolor = color.new(#9598a1, 10), size = size.tiny))
    pH  := ph
    pHb := bar_index - pvLen
    pHx := false
    pHr := false
if not na(pl)
    if showSw
        swQ.push(label.new(bar_index - pvLen, pl, na(pL) ? "L" : pl < pL ? "LL" : "HL", style = label.style_label_up, color = color(na),
             textcolor = color.new(#9598a1, 10), size = size.tiny))
    pL  := pl
    pLb := bar_index - pvLen
    pLx := false
    pLr := false

while swQ.size() > 40
    label.delete(swQ.shift())

type Sig
    int   dir
    int   b0
    string grade
    float entry
    float sl
    float risk
    array<float> tp
    array<bool>  hit
    bool  stopped
    bool  closed
    array<line>  tLn
    array<label> tLb
    array<box>   bx
    line  eLn
    line  sLn
    label sLb
    label mark

var sigs   = array.new<Sig>()
var strQ   = array.new_line()
var strL   = array.new_label()
var rdyQ   = array.new_label()
var int lastDir = 0

var int nDone = 0
var int nStop1 = 0
var hitN  = array.new_int(3, 0)
var int nA = 0
var hitA  = array.new_int(3, 0)
TPON = array.from(tp1On, tp2On, tp3On)
TPV  = array.from(tp1, tp2, tp3)

hitPct(int k) =>
    nDone > 0 ? hitN.get(k) * 100.0 / nDone : float(na)

tpText(Sig S, int k) =>
    p = hitPct(k)
    (S.hit.get(k) ? "✓ " : "") + "TP" + str.tostring(k + 1) + "  " + str.tostring(S.tp.get(k), format.mintick) +
     (showPct and nDone >= 20 and not na(p) ? "  ·  " + str.tostring(p, "#") + "%" : "")

method kill(Sig S) =>
    for b in S.bx
        box.delete(b)
    for l in S.tLn
        line.delete(l)
    for l in S.tLb
        label.delete(l)
    line.delete(S.eLn)
    line.delete(S.sLn)
    label.delete(S.sLb)
    true

method repaint(Sig S, bool active) =>
    fade = active ? 0 : 45
    x2 = active ? math.max(S.b0 + projBars, bar_index + 3) : math.max(S.b0 + 3, bar_index)
    if not na(S.eLn)
        line.set_x2(S.eLn, x2)
        line.set_color(S.eLn, color.new(cEnt, 30 + fade))
    if not na(S.sLn)
        line.set_x2(S.sLn, x2)
        line.set_color(S.sLn, color.new(cSl, (S.stopped ? 0 : 20) + fade))
        label.set_x(S.sLb, x2)
        label.set_text(S.sLb, (S.stopped ? "✕ " : "") + "SL  " + str.tostring(S.sl, format.mintick))
        label.set_textcolor(S.sLb, color.new(cSl, fade))
    for b in S.bx
        box.set_right(b, x2)
    if S.bx.size() > 0
        box.set_bgcolor(S.bx.get(0), color.new(cSl, 86 + fade / 4))
    if S.bx.size() > 1
        for j = 1 to S.bx.size() - 1
            box.set_bgcolor(S.bx.get(j), color.new(cTp, 84 + j * 3 + fade / 4))

    int nxt = -1
    for k = 0 to 2
        if nxt < 0 and TPON.get(k) and not S.hit.get(k)
            nxt := k
    for k = 0 to math.max(0, S.tLn.size() - 1)
        ln = S.tLn.size() > 0 ? S.tLn.get(k) : line(na)
        if not na(ln)
            isNext = active and not S.stopped and k == nxt
            line.set_x2(ln, x2)
            line.set_color(ln, color.new(cTp, (S.hit.get(k) or isNext ? 0 : 40) + fade))
            line.set_width(ln, S.hit.get(k) or isNext ? 2 : 1)
            line.set_style(ln, S.hit.get(k) or isNext ? line.style_solid : line.style_dashed)
            lb = S.tLb.get(k)
            label.set_x(lb, x2)
            label.set_text(lb, tpText(S, k))
            label.set_textcolor(lb, color.new(cTp, (S.hit.get(k) ? 0 : 15) + fade))
    true

bool evBuy = false
bool evSell = false
bool evRdyB = false
bool evRdyS = false
bool evTP1 = false
bool evTP2 = false
bool evTP3 = false
bool evSL = false

if barstate.isconfirmed

    if sigs.size() > 0
        S = sigs.last()
        if not S.closed and bar_index > S.b0
            if S.dir == 1 ? low <= S.sl : high >= S.sl
                S.stopped := true
                S.closed := true
                evSL := true
            else
                for k = 0 to 2
                    if TPON.get(k) and not S.hit.get(k) and (S.dir == 1 ? high >= S.tp.get(k) : low <= S.tp.get(k))
                        S.hit.set(k, true)
                        evTP1 := evTP1 or k == 0
                        evTP2 := evTP2 or k == 1
                        evTP3 := evTP3 or k == 2
                bool all = true
                for k = 0 to 2
                    if TPON.get(k) and not S.hit.get(k)
                        a

Показано первые 50% кода (символов: 24079)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 407,90₽ ≈ $29.43