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

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 и перейдите к оплате.

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