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

MTF Liquidity Stack

indicator mtf liquidity stack for tradingview.pine

Похожие материалы по тегам

indicator harmonic lab for tradingview.pineTradingView · 1 общих теговgoldlevelbreakout 1.00 @simpleforextools.mq4MQL4 / MetaTrader 4 · 1 общих теговearnwithjocker.pineTradingView · 1 общих теговindicator market trajectory mk1 for tradingview.pineTradingView · 1 общих теговgaoxing daily breakout v1.4.mq4MQL4 / MetaTrader 4 · 1 общих теговsmc+ict+indicators+scalping master.pineTradingView · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

«MTF Liquidity Stack» — это индикатор TradingView, который отображает уровни ликвидности на графике цены. Он рассчитывает точки разворота (swing high и swing low) с нескольких таймфреймов одновременно, а также отслеживает ликвидность торговых сессий (Азия, Лондон, Нью-Йорк) и предыдущего торгового дня (PDH/PDL). Когда цена проходит через уровень ликвидности, он помечается как проработанный и визуально изменяется.

Индикатор поддерживает до пяти пользовательских таймфреймов с возможностью автоматического повышения низких таймфреймов до значимых старших. Каждый уровень может быть помечен тегами и отображается линией и метками на графике. Доступна настройка цвета, стиля и толщины линий для проработанных и непроработанных уровней.

Встроенная система оповещений позволяет получать уведомления при появлении новых уровней ликвидности и при их проработке ценой. Поддерживается ежедневный сброс всех уровней и фильтрация по торговым сессиям с заданным UTC-смещением.

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

НастройкаОписание
au Включает автоматическое повышение низких таймфреймов до значимых старших при дублировании.
nl Количество последних непроработанных уровней swing high и swing low, сохраняемых для каждого активного таймфрейма.
e1 Включает или отключает первый источник ликвидности по таймфрейму TF 1.
tf1 Таймфрейм первого источника ликвидности.
e2 Включает или отключает второй источник ликвидности по таймфрейму TF 2.
tf2 Таймфрейм второго источника ликвидности.
e3 Включает или отключает третий источник ликвидности по таймфрейму TF 3.
tf3 Таймфрейм третьего источника ликвидности.
e4 Включает или отключает четвёртый источник ликвидности по таймфрейму TF 4.
tf4 Таймфрейм четвёртого источника ликвидности.
e5 Включает или отключает пятый источник ликвидности по таймфрейму TF 5.
tf5 Таймфрейм пятого источника ликвидности.
sm Режим отображения торговых сессий: Full — полные региональные сессии, AM — только утренние ликвидностные окна.
utc UTC-смещение, используемое для расчёта временных зон всех торговых сессий и ежедневных расчётов.
aOn Включает или отключает отслеживание ликвидности сессии Азии.
aNm Название региональной торговой сессии Азии, используемое в тегах.
aFull Временной диапазон региональной сессии для режима Full (полное ликвидностное окно).
aAm Временной диапазон региональной сессии для режима AM (утренний ликвидностный окно).
aCol Цвет, используемый для отображения ликвидности сессии Азии.
lOn Включает или отключает отслеживание ликвидности сессии Лондона.
lNm Название региональной торговой сессии Лондона, используемое в тегах.
lFull Временной диапазон региональной сессии Лондона для режима Full.
lAm Временной диапазон региональной сессии Лондона для режима AM.
lCol Цвет, используемый для отображения ликвидности сессии Лондона.
nOn Включает или отключает отслеживание ликвидности сессии Нью-Йорка.
nNm Название региональной торговой сессии Нью-Йорка, используемое в тегах.
nFull Временной диапазон региональной сессии Нью-Йорка для режима Full.
nAm Временной диапазон региональной сессии Нью-Йорка для режима AM.
nCol Цвет, используемый для отображения ликвидности сессии Нью-Йорка.
rst При включении очищает все уровни ликвидности (проработанные и непроработанные) в начале нового календарного дня.
pd Включает или отключает отслеживание максимума и минимума предыдущего торгового дня (PDH/PDL) как уровней ликвидности.
lsz Размер текста меток ликвидности и маркеров происхождения.
rtsz Размер текста для активных меток ликвидности на правой стороне графика.
hist Отображает или скрывает проработанные уровни ликвидности на графике.
hc Цвет, используемый для отображения непроработанных уровней swing high.
lc Цвет, используемый для отображения непроработанных уровней swing low.
sc Цвет, ширина и стиль линий для проработанных уровней ликвидности (если не переопределён цветом сессии).
sw Толщина линий, используемых для отображения уровней ликвидности на графике.
ss Стиль линий для проработанных уровней ликвидности: сплошной, пунктирный или точечный.
alNew Включает оповещение при подтверждении нового уровня ликвидности.
alMit Включает оповещение при проработке ценой активного уровня ликвидности.
alHi Разрешает отправку оповещений для уровней ликвидности High (swing high).
alLo Разрешает отправку оповещений для уровней ликвидности Low (swing low).
Получить полный код

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

indicator("MTF Liquidity Stack", overlay=true, max_lines_count=500, max_labels_count=500)

var string t1 ="Automatically promotes enabled sources at or below the chart timeframe to a meaningful higher timeframe. Explicit higher-timeframe sources take priority if duplicates occur."
var string t2 ="Number of recent unmitigated swing highs and lows kept for each active timeframe."
var string t3 ="Enable or disable this timeframe liquidity source."
var string t4 ="Full tracks complete regional sessions. AM switches Asia, London and New York together to their AM liquidity windows."
var string t5 ="UTC offset used for all sessions and daily calculations. Session times are defined from UTC+0 and shifted automatically."
var string t6 ="Session window in UTC+0. The active Full or AM window is selected automatically by Session Mode."
var string t7 ="Clears all swept and unswept liquidity levels when a new calendar day begins."
var string t8 ="Tracks the previous day's high and low as liquidity levels."
var string t9 ="Text size used for liquidity origin markers and mitigated level labels."
var string t10="Text size used only for active right-side liquidity tags."
var string t11="Keep previous mitigated liquidity visible. Off keeps only the newest mitigated level."
var string t12="Color used for unmitigated swing-high liquidity."
var string t13="Color used for unmitigated swing-low liquidity."
var string t14="Color, width and style used for mitigated liquidity unless a session color overrides it."
var string t15="Alert when a brand-new liquidity price is confirmed. Additional tags merging into the same price do not trigger another New alert."
var string t16="Alert when price trades through an active liquidity level and the level becomes mitigated."
var string t17="Choose whether High or Low liquidity is allowed to trigger alerts."

gM="1. Timeframes"
gS="2. Sessions"
gR="3. Daily Levels"
gV="4. Style"
gA="5. Alerts"

au=input.bool(true,"Auto",inline="mtf",group=gM,tooltip=t1)
nl=input.int(5,"Levels",1,20,inline="mtf",group=gM,tooltip=t2)

e1=input.bool(true,"TF 1",inline="tf1",group=gM,tooltip=t3)
tf1=input.timeframe("60","",inline="tf1",group=gM)
e2=input.bool(true,"TF 2",inline="tf2",group=gM,tooltip=t3)
tf2=input.timeframe("240","",inline="tf2",group=gM)
e3=input.bool(true,"TF 3",inline="tf3",group=gM,tooltip=t3)
tf3=input.timeframe("D","",inline="tf3",group=gM)
e4=input.bool(false,"TF 4",inline="tf4",group=gM,tooltip=t3)
tf4=input.timeframe("W","",inline="tf4",group=gM)
e5=input.bool(false,"TF 5",inline="tf5",group=gM,tooltip=t3)
tf5=input.timeframe("M","",inline="tf5",group=gM)

sm=input.string("Full","Mode",["Full","AM"],inline="sess",group=gS,tooltip=t4)
utc=input.string("UTC+0","UTC",["UTC-12","UTC-11","UTC-10","UTC-9","UTC-8","UTC-7","UTC-6","UTC-5","UTC-4","UTC-3","UTC-2","UTC-1","UTC+0","UTC+1","UTC+2","UTC+3","UTC+4","UTC+5","UTC+6","UTC+7","UTC+8","UTC+9","UTC+10","UTC+11","UTC+12","UTC+13","UTC+14"],inline="sess",group=gS,tooltip=t5)

aOn=input.bool(true,"",inline="as",group=gS)
aNm=input.string("Asia","",inline="as",group=gS)
aFull=input.session("2200-0700","Full",inline="as",group=gS,tooltip=t6,active=sm=="Full")
aAm=input.session("0000-0400","AM",inline="as",group=gS,tooltip=t6,active=sm=="AM")
aCol=input.color(#55ff96,"",inline="as",group=gS)

lOn=input.bool(true,"",inline="lo",group=gS)
lNm=input.string("London","",inline="lo",group=gS)
lFull=input.session("0700-1530","Full",inline="lo",group=gS,tooltip=t6,active=sm=="Full")
lAm=input.session("0600-0900","AM",inline="lo",group=gS,tooltip=t6,active=sm=="AM")
lCol=input.color(#ff4040,"",inline="lo",group=gS)

nOn=input.bool(true,"",inline="ny",group=gS)
nNm=input.string("New York","",inline="ny",group=gS)
nFull=input.session("1330-2000","Full",inline="ny",group=gS,tooltip=t6,active=sm=="Full")
nAm=input.session("1330-1500","AM",inline="ny",group=gS,tooltip=t6,active=sm=="AM")
nCol=input.color(#4d9dff,"",inline="ny",group=gS)

rst=input.bool(false,"Daily Reset",inline="day",group=gR,tooltip=t7)
pd=input.bool(true,"PDH / PDL",inline="day",group=gR,tooltip=t8)

lsz=input.string("Tiny","Labels",["Tiny","Small","Normal"],inline="view",group=gV,tooltip=t9)
rtsz=input.string("Tiny","Live Tags",["Tiny","Small","Normal"],inline="view",group=gV,tooltip=t10)
hist=input.bool(true,"History",group=gV,tooltip=t11)
hc=input.color(#ff4040,"High",inline="p",group=gV,tooltip=t12)
lc=input.color(#55ff96,"Low",inline="p",group=gV,tooltip=t13)
sc=input.color(#6d6d6d,"Sweep",inline="s",group=gV,tooltip=t14)
sw=input.int(1,"",1,4,inline="s",group=gV,tooltip=t14)
ss=input.string("Solid","",["Solid","Dashed","Dotted"],inline="s",group=gV,tooltip=t14)

alNew=input.bool(false,"New",inline="al",group=gA,tooltip=t15)
alMit=input.bool(true,"Mitigated",inline="al",group=gA,tooltip=t16)
alHi=input.bool(true,"High",inline="side",group=gA,tooltip=t17)
alLo=input.bool(true,"Low",inline="side",group=gA,tooltip=t17)

const int MAX_SWEEPS=220
const int MAX_SCAN=5000
const int WICK_CACHE=8

type Level
    float p
    bool hi
    int x
    int born
    string tags
    bool swept
    int sx
    label mark
    label rt
    line ln
    label txt

type Sess
    float h
    float l
    int hx
    int lx

type Track
    int op
    float h
    float l
    int hx
    int lx
    array<int> ops
    array<int> hxs
    array<int> lxs

var array<Level> live=array.new<Level>()
var array<Level> done=array.new<Level>()
var array<string> aQ=array.new_string()
var array<bool> aSig=array.from(false,false,false,false)
var int day0=na

var array<Sess> ses=array.from(
 Sess.new(na,na,na,na),
 Sess.new(na,na,na,na),
 Sess.new(na,na,na,na))

var array<Track> tr=array.from(
 Track.new(na,na,na,na,na,array.new_int(),array.new_int(),array.new_int()),
 Track.new(na,na,na,na,na,array.new_int(),array.new_int(),array.new_int()),
 Track.new(na,na,na,na,na,array.new_int(),array.new_int(),array.new_int()),
 Track.new(na,na,na,na,na,array.new_int(),array.new_int(),array.new_int()),
 Track.new(na,na,na,na,na,array.new_int(),array.new_int(),array.new_int()))

var array<string> sNames=array.from(aNm,lNm,nNm)
var array<color> sCols=array.from(aCol,lCol,nCol)
var array<string> tfs=array.from(tf1,tf2,tf3,tf4,tf5)
var array<bool> src=array.from(e1,e2,e3,e4,e5)

var array<string> useTf=array.new_string(5,"")
var array<bool> useSrc=array.new_bool(5,false)
var array<bool> movedTf=array.new_bool(5,false)

var string aSess=na
var string lSess=na
var string nSess=na

max_bars_back(time,MAX_SCAN)
max_bars_back(high,MAX_SCAN)
max_bars_back(low,MAX_SCAN)

lblSize()=>lsz=="Small"?size.small:lsz=="Normal"?size.normal:size.tiny
rtSize()=>rtsz=="Small"?size.small:rtsz=="Normal"?size.normal:size.tiny
lnStyle()=>ss=="Dashed"?line.style_dashed:ss=="Dotted"?line.style_dotted:line.style_solid

tfSec(string tf)=>timeframe.in_seconds(tf)

nextHTF()=>
    cs=timeframe.in_seconds()
    d=timeframe.in_seconds("D")
    w=timeframe.in_seconds("W")
    m=timeframe.in_seconds("M")
    out="12M"
    if cs<=60
        out:="5"
    else if cs<=5*60
        out:="15"
    else if cs<=15*60
        out:="60"
    else if cs<=30*60
        out:="120"
    else if cs<=45*60
        out:="180"
    else if cs<=60*60
        out:="240"
    else if cs<=90*60
        out:="360"
    else if cs<=120*60
        out:="480"
    else if cs<=180*60
        out:="720"
    else if cs<=240*60
        out:="D"
    else if cs<=480*60
        out:="D"
    else if cs<=720*60
        out:="2D"
    else if cs<=3*d
        out:="W"
    else if cs<=6*d
        out:="2W"
    else if cs<=2*w
        out:="M"
    else if cs<=m
        out:="3M"
    else if cs<=3*m
        out:="12M"
    else if cs<=6*m
        out:="12M"
    out

autoTF(string tf)=>au and tfSec(tf)<=timeframe.in_seconds()?nextHTF():tf
sameTF(string a,string b)=>tfSec(a)==tfSec(b)

hasTF(array<string> a,string tf)=>
    hit=false
    if a.size()>0
        for i=0 to a.size()-1
            if sameTF(a.get(i),tf)
                hit:=true
                break
    hit

resolveSources()=>
    used=array.new_string()
    cs=timeframe.in_seconds()

    for i=0 to tfs.size()-1
        base=tfs.get(i)
        on=src.get(i)
        rt=autoTF(base)
        mv=au and on and tfSec(base)<=cs
        useTf.set(i,rt)
        movedTf.set(i,mv)
        useSrc.set(i,false)

    if not au
        for i=0 to src.size()-1
            useSrc.set(i,src.get(i))
    else

        for i=0 to src.size()-1
            if src.get(i) and not movedTf.get(i)
                rt=useTf.get(i)
                if not hasTF(used,rt)
                    useSrc.set(i,true)
                    used.push(rt)

        for i=0 to src.size()-1
            if src.get(i) and movedTf.get(i)
                rt=useTf.get(i)
                valid=tfSec(rt)>cs
                if valid and not hasTF(used,rt)
                    useSrc.set(i,true)
                    used.push(rt)

    for i=0 to useSrc.size()-1
        if not useSrc.get(i)
            useTf.set(i,timeframe.period)
    0

tfText(string tf)=>
    out=tf
    n=str.tonumber(tf)
    if tf=="M" or tf=="1M"
        out:="1M"
    else if tf=="W" or tf=="1W"
        out:="1W"
    else if tf=="D" or tf=="1D"
        out:="1D"
    else if not na(n)
        m=int(n)
        if m<60
            out:=str.tostring(m)+"m"
        else if m<1440 and m%60==0
            out:=str.tostring(int(m/60))+"h"
        else if m>=10080 and m%10080==0
            out:=str.tostring(int(m/10080))+"W"
        else if m>=1440 and m%1440==0
            out:=str.tostring(int(m/1440))+"D"
        else
            out:=str.tostring(m)+"m"
    out

utcMin(string z)=>
    s=str.replace_all(z,"UTC","")
    s:=str.replace_all(s,"+","")
    h=str.tonumber(s)
    int(math.round(nz(h,0.0)*60.0))

pad(int v)=>(v<10?"0":"")+str.tostring(v)

shiftSession(string s,int off)=>
    a=str.substring(s,0,4)
    b=str.substring(s,5,9)
    ah=int(nz(str.tonumber(str.substring(a,0,2)),0))
    am=int(nz(str.tonumber(str.substring(a,2,4)),0))
    bh=int(nz(str.tonumber(str.substring(b,0,2)),0))
    bm=int(nz(str.tonumber(str.substring(b,2,4)),0))
    x=(ah*60+am+off)%1440
    y=(bh*60+bm+off)%1440
    x:=x<0?x+1440:x
    y:=y<0?y+1440:y
    pad(int(math.floor(x/60)))+pad(x%60)+"-"+pad(int(math.floor(y/60)))+pad(y%60)

dayKey(int t)=>year(t,utc)*10000+month(t,utc)*100+dayofmonth(t,utc)

hasTag(string tags,string tag)=>str.contains("|"+tags+"|","|"+tag+"|")
addTag(string tags,string tag)=>hasTag(tags,tag)?tags:str.length(tags)==0?tag:tags+"|"+tag

delTag(string tags,string tag)=>
    s=str.replace_all("|"+tags+"|","|"+tag+"|","|")
    str.length(s)<=2?"":str.substring(s,1,str.length(s)-1)

tagText(string tags)=>str.replace_all(tags,"|","+")

alertMsg(string ev,Level x)=>
    side=x.hi?"HIGH":"LOW"
    ev+" | "+syminfo.ticker+" | "+side+" | "+tagText(x.tags)+" | "+str.tostring(x.p,format.mintick)+" | TF "+timeframe.period

pushAlert(string ev,Level x)=>
    eventOn=ev=="NEW"?alNew:alMit
    sideOn=x.hi?alHi:alLo
    if eventOn and sideOn
        aQ.push(alertMsg(ev,x))
        id=ev=="NEW"?(x.hi?0:1):(x.hi?2:3)
        aSig.set(id,true)
    0

sendAlerts()=>
    if barstate.isconfirmed and aQ.size()>0
        msg=aQ.get(0)
        if aQ.size()>1
            for i=1 to aQ.size()-1
                msg+="\n"+aQ.get(i)
        alert(msg,alert.freq_once_per_bar_close)
    0

lvlColor(Level x)=>
    c=x.swept?sc:x.hi?hc:lc
    for i=0 to sNames.size()-1
        if hasTag(x.tags,sNames.get(i))
            c:=sCols.get(i)
    c

markText(Level x)=>
    s=tagText(x.tags)
    x.hi?s+"\n⊙\n ":" \n⊙\n"+s

anchorSlow(float p,bool hi,int op,int cl)=>
    out=op
    if not na(p) and not na(op) and not na(cl)
        lim=math.min(bar_index,MAX_SCAN-1)
        i=0
        while i<=lim
            bt=time[i]
            if bt<op
                break
            if bt>=op and bt<cl
                bp=hi?high[i]:low[i]
                if math.abs(bp-p)<=syminfo.mintick*0.5
                    out:=bt
                    break
            i+=1
    out

method archive(Track x)=>
    if not na(x.op)
        x.ops.unshift(x.op)
        x.hxs.unshift(x.hx)
        x.lxs.unshift(x.lx)
        if x.ops.size()>WICK_CACHE
            x.ops.pop()
            x.hxs.pop()
            x.lxs.pop()
    0

method trackWick(Track x,int op)=>
    if not na(op)
        if na(x.op)
            x.op:=op
   

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

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

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

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

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

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

Стоимость полного кода
1 868,50₽ ≈ $22.84