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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.