Liquidity Sweep Session ICT Killzone Times
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator_liquidity_sweep_session_ict_killzone_times_for_tradingview.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой индикатор для TradingView, написанный на Pine Script v6. Он отображает зоны активности (kill zones) основных торговых сессий — Лондона, Нью-Йорка (утро и вечер) и Азии — и отслеживает события ликвидности в виде захватов уровней с последующим возвратом цены.
Индикатор выявляет ситуации, когда цена пробивает уровень сессии или предыдущей сессии, а затем возвращается обратно. При выполнении дополнительных условий подтверждения и фильтрации по тренду на графике появляются визуальные метки с информацией о потенциальных направлениях движения.
Пользователь может выбирать активные сессии, режим подтверждения, фильтрацию по тренду и тип используемых диапазонов для поиска захватов. Поддерживаются условные оповещения TradingView, а также отображение статистики по ранее обнаруженным событиям. Индикатор рассчитан на внутридневные таймфреймы с 5-минутной привязкой.
Настройки программы
| Настройка | Описание |
|---|---|
| SignalZones | Выбирает сессии, в которых отображаются зоны и генерируются сигналы: Лондон, нью-йоркская утренняя, вечерняя или все сразу. |
| ReferenceMode | Определяет, какие диапазоны использовать для поиска захватов: текущие азиатские, предыдущей сессии или оба одновременно. |
| SignalMode | Задаёт строгость подтверждения сигнала: быстрый режим, сбалансированный или строгий с дополнительными проверками структуры. |
| TrendFilter | Фильтрует сигналы по направлению тренда: показывает все сигналы, только совпадающие с трендом или против него. |
| Alert | Включает или отключает отправку автоматических оповещений при появлении сигналов. |
Поиск по коду файла
indicator("Liquidity Sweep Session ICT Killzone Times", "Sweep Session", overlay = true, max_bars_back = 5000, max_boxes_count = 500, max_labels_count = 500, max_lines_count = 500)
import TFlab/SessionAndKillZoneLibrary_TradingFinder/1 as Sess
import TFlab/AlertSenderLibrary_TradingFinder/1 as AlertSender
SignalZones = input.string("All", "Signal Sessions", options = ["London + NY am", "London", "NY am", "NY pm", "All"], group = "Signal Settings")
ReferenceMode = input.string("Both", "Swept Range", options = ["Both", "Asia", "Previous session"], group = "Signal Settings")
SignalMode = input.string("Fast", "Confirmation", options = ["Fast", "Balanced", "Strict"], group = "Signal Settings")
TrendFilter = input.string("All", "Trend Filter", options = ["All", "Aligned", "Counter"], group = "Signal Settings")
Alert = input.string("On", "Send Alert", options = ["On", "Off"], group = "Alert")
type SweepRecord
int zone
int side
int reference
int targetTier
int outcome
float rangeRank
bool aligned
float mfeTicks
type SweepSetup
int stage = 0
int zone = 0
int reference = 0
float level = na
float farLevel = na
float midpoint = na
float extreme = na
float reclaimClose = na
float structure = na
int sweepBar = na
int reclaimBar = na
float rangeRank = na
float sweepAtr = na
int outsideCloses = 0
float postReclaimExtreme = na
type ActiveEvent
int zone
int side
int reference
int targetTier
int startTime
float entry
float target
float invalidation
float mfeTicks
float rangeRank
bool aligned
bool ShowMoreInfo = false
color ColorMoreInfo = #0c3299
bool show_AsiaSess = true
string Asia_SessTime = "2300-0600"
color Asia_color = #da6e0a
bool show_AsiaKill = true
string Asia_KillTime = "2300-0355"
bool show_LondonSess = true
string London_SessTime = "0700-1425"
color London_color = #850244
bool show_LondonKill = true
string London_KillTime = "0700-0955"
bool show_amNewyorkSess = true
string amNewyork_SessTime = "1430-1925"
color amNewyork_color = #008b85
bool show_amNewyorkKill = true
string amNewyork_KillTime = "1430-1655"
bool show_pmNewyorkSess = true
string pmNewyork_SessTime = "1930-2255"
color pmNewyork_color = #750cff
bool show_pmNewyorkKill = true
string pmNewyork_KillTime = "1930-2055"
int MinSweepTicks = 1
float MinSweepAtr = 0.02
float MaxSweepAtr = 1.5
int ReclaimBars = 3
int ConfirmBars = 3
float ConfirmBodyAtr = 0.20
int StructureBars = 8
int MaxSignalsPerZone = 3
int CooldownBars = 3
int InvalidationTicks = 2
int OutcomeMinutes = 60
int TrendEmaLength = 50
string RangeFilter = "All"
int MaxSignalLabels = 120
int MaxStoredEvents = 300
int RangeLookback = 120
int SwingPivotBars = 2
float ConfirmBodyPct = 0.50
float ConfirmClosePct = 0.70
float BreakoutBodyAtr = 0.60
int MaxOutsideCloses = 1
float MaxEntryProgress = 0.55
float MaxEntryDistanceAtr = 1.50
float MinRewardRisk = 1.00
int TrendSlopeBars = 5
float CounterTrendBodyMult = 1.35
[SessTimeA, KillTimeA, OpenA, HighA, LowA, CloseA, LowTouchAlertA, HighTouchAlertA] = Sess.SessionDetector("Asia", Asia_SessTime, Asia_KillTime, show_AsiaSess, show_AsiaKill, "Kill Zone", ShowMoreInfo, Asia_color, ColorMoreInfo)
[SessTimeL, KillTimeL, OpenL, HighL, LowL, CloseL, LowTouchAlertL, HighTouchAlertL] = Sess.SessionDetector("London", London_SessTime, London_KillTime, show_LondonSess, show_LondonKill, "Kill Zone", ShowMoreInfo, London_color, ColorMoreInfo)
[SessTimeNYa, KillTimeNYa, OpenNYa, HighNYa, LowNYa, CloseNYa, LowTouchAlertNYa, HighTouchAlertNYa] = Sess.SessionDetector("NY am", amNewyork_SessTime, amNewyork_KillTime, show_amNewyorkSess, show_amNewyorkKill, "Kill Zone", ShowMoreInfo, amNewyork_color, ColorMoreInfo)
[SessTimeNYp, KillTimeNYp, OpenNYp, HighNYp, LowNYp, CloseNYp, LowTouchAlertNYp, HighTouchAlertNYp] = Sess.SessionDetector("NY pm", pmNewyork_SessTime, pmNewyork_KillTime, show_pmNewyorkSess, show_pmNewyorkKill, "Kill Zone", ShowMoreInfo, pmNewyork_color, ColorMoreInfo)
f_pct(int numerator, int denominator) =>
denominator > 0 ? 100.0 * numerator / denominator : na
f_fmt_pct(float value) =>
na(value) ? "—" : str.tostring(value, "#.0") + "%"
f_range_matches(float rank) =>
RangeFilter == "All" or (not na(rank) and (RangeFilter == "Low (0–25)" and rank <= 25 or RangeFilter == "Normal (25–75)" and rank > 25 and rank < 75 or RangeFilter == "High (75–100)" and rank >= 75))
f_trend_matches(bool aligned) =>
TrendFilter == "All" or (TrendFilter == "Aligned" and aligned) or (TrendFilter == "Counter" and not aligned)
f_bull_displacement(float atrValue, float bodyAtrRequirement) =>
float candleRange = high - low
float body = close - open
candleRange > 0 and body > 0 and body >= bodyAtrRequirement * atrValue and body / candleRange >= ConfirmBodyPct and (close - low) / candleRange >= ConfirmClosePct
f_bear_displacement(float atrValue, float bodyAtrRequirement) =>
float candleRange = high - low
float body = open - close
candleRange > 0 and body > 0 and body >= bodyAtrRequirement * atrValue and body / candleRange >= ConfirmBodyPct and (high - close) / candleRange >= ConfirmClosePct
f_strong_breakdown(float level, float atrValue) =>
close < level and close < open and open - close >= BreakoutBodyAtr * atrValue
f_strong_breakout(float level, float atrValue) =>
close > level and close > open and close - open >= BreakoutBodyAtr * atrValue
var array<SweepRecord> Records = array.new<SweepRecord>()
var array<ActiveEvent> Active = array.new<ActiveEvent>()
var array<float> AsiaRanges = array.new<float>()
var array<label> SignalLabels = array.new<label>()
var array<box> SignalBoxes = array.new<box>()
f_stats(int wantedZone, int wantedSide, int wantedReference, int wantedTier) =>
int sampleN = 0
int targetN = 0
int failureN = 0
int timeoutN = 0
array<float> mfeValues = array.new<float>()
for rec in Records
if rec.zone == wantedZone and rec.side == wantedSide and rec.reference == wantedReference and rec.targetTier == wantedTier and f_range_matches(rec.rangeRank) and f_trend_matches(rec.aligned)
sampleN += 1
targetN += rec.outcome == 1 ? 1 : 0
failureN += rec.outcome == -1 ? 1 : 0
timeoutN += rec.outcome == 0 ? 1 : 0
array.push(mfeValues, rec.mfeTicks)
float medianMfe = sampleN > 0 ? array.median(mfeValues) : na
[sampleN, targetN, failureN, timeoutN, medianMfe]
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)
float TfSeconds = timeframe.in_seconds(timeframe.period)
if not chart.is_standard or not timeframe.isintraday or na(TfSeconds) or TfSeconds > 300.0 or 300.0 % TfSeconds != 0.0
runtime.error("Use a standard time-based intraday chart aligned to 5-minute boundaries (for example 1m or 5m).")
bool InAsia = not na(time(timeframe.period, Asia_SessTime, "Etc/UTC"))
bool InLondon = not na(time(timeframe.period, London_SessTime, "Etc/UTC"))
bool InNYam = not na(time(timeframe.period, amNewyork_SessTime, "Etc/UTC"))
bool InLondonKill = not na(time(timeframe.period, London_KillTime, "Etc/UTC"))
bool InNYamKill = not na(time(timeframe.period, amNewyork_KillTime, "Etc/UTC"))
bool InNYpmKill = not na(time(timeframe.period, pmNewyork_KillTime, "Etc/UTC"))
bool AsiaStarts = InAsia and (bar_index == 0 or not InAsia[1])
bool AsiaEnds = not InAsia and bar_index > 0 and InAsia[1]
bool LondonStarts = InLondon and (bar_index == 0 or not InLondon[1])
bool LondonEnds = not InLondon and bar_index > 0 and InLondon[1]
bool NYamStarts = InNYam and (bar_index == 0 or not InNYam[1])
bool NYamEnds = not InNYam and bar_index > 0 and InNYam[1]
float TrendEma = ta.ema(close, TrendEmaLength)
float Atr = ta.atr(14)
float PriorHigh = ta.highest(high, StructureBars)[1]
float PriorLow = ta.lowest(low, StructureBars)[1]
float PivotHigh = ta.pivothigh(high, SwingPivotBars, SwingPivotBars)
float PivotLow = ta.pivotlow(low, SwingPivotBars, SwingPivotBars)
var float LastSwingHigh = na
var float LastSwingLow = na
var int LastSwingHighBar = na
var int LastSwingLowBar = na
var float AsiaHigh = na
var float AsiaLow = na
var float AsiaRank = na
var bool AsiaReady = false
var float LondonHigh = na
var float LondonLow = na
var bool LondonReady = false
var float NYamHigh = na
var float NYamLow = na
var bool NYamReady = false
var SweepSetup BuySetup = SweepSetup.new()
var SweepSetup SellSetup = SweepSetup.new()
var int PreviousZone = 0
var int SignalsInZone = 0
var int LastSignalBar = na
bool BuySignal = false
bool SellSignal = false
string SignalMessage = ""
if barstate.isconfirmed
if not na(PivotHigh)
LastSwingHigh := PivotHigh
LastSwingHighBar := bar_index - SwingPivotBars
if not na(PivotLow)
LastSwingLow := PivotLow
LastSwingLowBar := bar_index - SwingPivotBars
if AsiaStarts
AsiaHigh := high
AsiaLow := low
AsiaRank := na
AsiaReady := false
else if InAsia and not na(AsiaHigh)
AsiaHigh := math.max(AsiaHigh, high)
AsiaLow := math.min(AsiaLow, low)
if array.size(Active) > 0
for i = array.size(Active) - 1 to 0
ActiveEvent ev = array.get(Active, i)
if time_close > ev.startTime
int deadline = ev.startTime + OutcomeMinutes * 60000
int outcome = 99
if time_close <= deadline
bool stopped = ev.side == 1 ? low <= ev.invalidation : high >= ev.invalidation
bool targeted = ev.side == 1 ? high >= ev.target : low <= ev.target
if stopped
outcome := -1
else
float favorable = ev.side == 1 ? high - ev.entry : ev.entry - low
ev.mfeTicks := math.max(ev.mfeTicks, math.max(0.0, favorable / syminfo.mintick))
outcome := targeted ? 1 : time_close >= deadline ? 0 : 99
else
outcome := 0
if outcome != 99
array.push(Records, SweepRecord.new(ev.zone, ev.side, ev.reference, ev.targetTier, outcome, ev.rangeRank, ev.aligned, ev.mfeTicks))
if array.size(Records) > MaxStoredEvents
array.shift(Records)
array.remove(Active, i)
if AsiaEnds and not na(AsiaHigh) and not na(AsiaLow) and AsiaHigh > AsiaLow
float currentRange = AsiaHigh - AsiaLow
int priorN = array.size(AsiaRanges)
int atOrBelow = 0
for pastRange in AsiaRanges
atOrBelow += pastRange <= currentRange ? 1 : 0
AsiaRank := priorN >= 10 ? 100.0 * atOrBelow / priorN : na
array.push(AsiaRanges, currentRange)
if array.size(AsiaRanges) > RangeLookback
array.shift(AsiaRanges)
AsiaReady := true
if LondonStarts
LondonHigh := high
LondonLow := low
LondonReady := false
else if InLondon and not na(LondonHigh)
LondonHigh := math.max(LondonHigh, high)
LondonLow := math.min(LondonLow, low)
if LondonEnds and not na(LondonHigh) and not na(LondonLow) and LondonHigh > LondonLow
LondonReady := true
if NYamStarts
NYamHigh := high
NYamLow := low
NYamReady := false
else if InNYam and not na(NYamHigh)
NYamHigh := math.max(NYamHigh, high)
NYamLow := math.min(NYamLow, low)
if NYamEnds and not na(NYamHigh) and not na(NYamLow) and NYamHigh > NYamLow
NYamReady := true
bool useLondon = SignalZones == "London + NY am" or SignalZones == "London" or SignalZones == "All"
bool useNYam = SignalZones == "London + NY am" or SignalZones == "NY am" or SignalZones == "All"
bool useNYpm = SignalZones == "NY pm" or SignalZones == "All"
int activeZone = useLondon and InLondonKill ? 1 : useNYam and InNYamKill ? 2 : useNYpm and InNYpmKill ? 3 : 0
if activeZone != PreviousZone
BuySetup := SweepSetup.new()
SellSetup := SweepSetup.new()
SignalsInZone := 0
PreviousZone := activeZone
bool slotAvailable = activeZone > 0 and SignalsInZone < MaxSignalsPerZone and (na(LastSignalBar) or bar_index - LastSignalBar > CooldownBars)
if activeZone > 0
bool buyResetThisBar = false
bool sellResetThisBar = false
if BuySetup.stage == 1
BuySetup.extreme := math.min(BuySetup.extreme, low)
if close < BuySetup.level
BuySetup.outsideCloses += 1
bool buySweepExpired = bar_index - BuySetup.sweepBar > ReclaimBars
bool buySweepTooDeep = BuySetup.level - BuySetup.extreme > MaxSweepAtr * BuySetup.sweepAtr
bool buyAcceptedBelow = BuySetup.outsideCloses > MaxOutsideCloses or f_strong_breakdown(BuySetup.level, BuySetup.sweepAtr)
if buySweepExpired or buySweepTooDeep or buyAcceptedBelow
BuySetup := SweepSetup.new()
buyResetThisBar := true
else if close > BuySetup.level
BuySetup.stage := 2
BuySetup.reclaimBar := bar_index
BuySetup.reclaimClose := close
BuySetup.postReclaimExtreme := high
if SellSetup.stage == 1
SellSetup.extreme := math.max(SellSetup.extreme, high)
if close > SellSetup.level
SellSetup.outsideCloses += 1
bool sellSweepExpired = bar_index - SellSetup.sweepBar > ReclaimBars
bool sellSweepTooDeep = SellSetup.extreme - SellSetup.level > MaxSweepAtr * SellSetup.sweepAtr
bool sellAcceptedAbove = SellSetup.outsideCloses > MaxOutsideCloses or f_strong_breakout(SellSetup.level, SellSetup.sweepAtr)
if sellSweepExpired or sellSweepTooDeep or sellAcceptedAbove
SellSetup := SweepSetup.new()
sellResetThisBar := true
else if close < SellSetup.level
SellSetup.stage := 2
SellSetup.reclaimBar := bar_index
SellSetup.reclaimClose := close
SellSetup.postReclaimExtreme := low
if BuySetup.stage == 2
BuySetup.postReclaimExtreme := na(BuySetup.postReclaimExtreme) ? high : math.max(BuySetup.postReclaimExtreme, high)
bool buyConfirmExpired = bar_index - BuySetup.reclaimBar > ConfirmBars
bool buyReclaimFailed = close <= BuySetup.level or low <= BuySetup.extreme - InvalidationTicks * syminfo.mintick
if buyConfirmExpired or buyReclaimFailed
BuySetup := SweepSetup.new()
buyResetThisBar := true
if SellSetup.stage == 2
SellSetup.posПоказано первые 50% кода (символов: 22809)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.