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

MELONA OB, OPFX ZONA PREMIUM

indicator melona ob, opfx zona premium for tradingview.pine
Вы автор или правообладатель?

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

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

О программе

Это индикатор для TradingView на Pine Script v5, отображаемый поверх ценового графика. Он объединяет несколько модулей технического анализа: обнаружение и визуализацию односвечных блоков давления (Order Blocks), зоны поддержки и сопротивления на основе свинг-пивотов, скользящие средние с угловым анализом тренда, Hull-MA в различных вариациях, а также систему OPFX-зон с уровнями стоп-лосса и тейк-профита. Индикатор предоставляет визуальные сигналы, рисует графические объекты на графике и поддерживает условные оповещения TradingView.

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

НастройкаОписание
showPressure Показывать блоки давления одиночной свечи — Включает или выключает отображение односвечных блоков давления на графике
mitigationStyle Метод смягчения — Способ определения, когда блок давления считается нарушенным: по цене закрытия или по тени
showLast Показать последние X блоков — Количество недавно сформированных блоков давления, отображаемых на графике
volatilityFilter Фильтр волатильности — Отфильтровывает блоки давления, показывая только те, у которых ATR выше среднего значения
bullishScobColor Цвет бычьего блока давления — Цвет для отображения бычьих блоков давления
bearishScobColor Цвет медвежьего блока давления — Цвет для отображения медвежьих блоков давления
lengthx Длина скользящей средней — Период для расчёта скользящей средней
x Угол тренда — Порог угла для определения направления тренда
srcx Источник — Исходное значение для расчёта скользящей средней
matype Тип скользящей средней — Тип скользящей средней: EMA или SMA
lookbackw Период угла — Количество баров для расчёта угла тренда
atrPeriodx Период ATR для угла — Период ATR, используемый при расчёте угла
Trend_detector Чувствительность детектора тренда — Чувствительность определения смены тренда
ANGLE_TABLE Таблица углов — Параметр таблицы углов
AVG_angleBars Средний угол за бары — Количество баров для усреднения угла
showcandle Цвет свечей — Включает или выключает окраску свечей
candleoption Режим окраски свечей — Режим окраски свечей: по тренду или по градиенту RSI
nbuysell Сигналы покупки/продажи — Включает или выключает отображение сигналов покупки и продажи
nsensitivity Чувствительность сигнала — Множитель чувствительности для генерации сигналов
LongTrendAverage Облако тренда — Отображает облако тренда на основе Hull-MA
TrendFollower Следование тренду — Включает индикатор трассировки тренда
ShowComulus Облако Комулуса — Отображает облако Комулуса
CirrusCloud Облако Цирруса — Отображает облако Цирруса
levels Показывать уровни TP/SL — Включает отображение уровней стоп-лосса и тейк-профита (недоступно в данной редакции)
lvlLines Показывать линии уровней — Отображает линии уровней TP/SL на графике
linesStyle Стиль линий уровней — Стиль линий уровней TP/SL: сплошной, пунктирный или точечный
lvlDistance Расстояние уровней — Смещение линий уровней от точки входа
lvlDecimals Десятичные знаки уровней — Количество десятичных знаков для отображения цен уровней
atrRisk Риск в процентах — Процент риска для расчёта стоп-лосса через ATR
atrLen Период ATR для риска — Период ATR для расчёта уровней риска
showsr Показывать зоны поддержки и сопротивления — Включает отображение зон поддержки и сопротивления
swing_length Чувствительность свинга — Чувствительность обнаружения свинг-пивотов для зон
box_width Ширина зоны — Ширина зон поддержки и сопротивления
box_extend_option Продление зоны — Направление продления зон: вправо или в обе стороны
res Таймфрейм — Таймфрейм для получения данных зон поддержки и сопротивления
demand_color Цвет спроса — Цвет для зон спроса (поддержки)
supply_color Цвет предложения — Цвет для зон предложения (сопротивления)
sidewaysThreshold Порог бокового движения ADX — Значение ADX, ниже которого рынок считается боковым
maxDisplayedLines Максимальное количество линий — Максимальное число отображаемых линий блоков
enableTrendColoring Цвет линий по тренду — Окрашивает линии блоков в зависимости от направления тренда
useCandleBody Использовать тело свечи — Использует тело свечи вместо теней для расчётов
lineThickness Толщина линий — Толщина линий блоков
lineStyleOption Стиль линий — Стиль линий блоков
extendSupportResistance Продление линий — Продлевает линии поддержки и сопротивления вправо
srcqq Источник Hull — Источник для расчёта Hull-MA
modeSwitchhh Вариация Hull — Вариант Hull-MA: HMA, THMA или EHMA
lengthhh Длина Hull — Период Hull-MA
lengthMulttt Множитель длины Hull — Множитель для просмотра Hull на более высоких таймфреймах
useHtf Показать Hull с таймфрейма — Отображает Hull-MA с указанного более высокого таймфрейма
htf Таймфрейм Hull — Таймфрейм для Hull-MA
switchColorrr Цвет Hull по тренду — Окрашивает Hull-MA в зависимости от направления тренда
candleColll Окраска свечей по Hull — Окрашивает свечи в зависимости от тренда Hull-MA
visualSwitchhh Показать Hull как полосу — Отображает Hull-MA в виде залитой полосы
thicknesSwitchhh Толщина линии Hull — Толщина линий Hull-MA
transpSwitchhh Прозрачность полосы Hull — Прозрачность заливки полосы Hull-MA
a_buy Чувствительность покупки — Множитель чувствительности для сигнала покупки
c_buy Период ATR покупки — Период ATR для сигнала покупки (0 = отключено)
a_sell Чувствительность продажи — Множитель чувствительности для сигнала продажи
c_sell Период ATR продажи — Период ATR для сигнала продажи (0 = отключено)
showTrailBuy Показать линию трейла покупки — Отображает линию трейла для покупки
showTrailSell Показать линию трейла продажи — Отображает линию трейла для продажи
showZones Показывать зоны долголетия — Включает отображение OPFX-зон долголетия
len_z Длина долголетия — Период для определения долголетия пивотов
atrLength Длина ATR — Период ATR для расчёта TP/SL
slMultiplier Множитель стоп-лосса — Множитель ATR для расчёта стоп-лосса
tpMultiplier1 Множитель первого тейк-профита — Множитель ATR для первого уровня тейк-профита
tpMultiplier2 Множитель второго тейк-профита — Множитель ATR для второго уровня тейк-профита
showLevels Показывать уровни TP/SL — Включает отображение уровней стоп-лосса и тейк-профита
showLabels Показывать ценовые метки — Отображает ценовые метки на уровнях TP/SL
projectionBars Ширина бокса в барах — Ширина бокса TP/SL в барах
swingLen Длина свинга — Длина свинга для обнаружения пивотов в зонах
maxZones Максимум зон — Максимальное количество отображаемых зон
maxZoneHeightATR Максимальная высота зоны — Максимальная высота зоны в кратных ATR
minZoneHeightATR Минимальная высота зоны — Минимальная высота зоны в кратных ATR
forceZoneHeightATR Принудительная высота зоны — Принудительная высота зоны в кратных ATR
minZoneDistance Минимальное расстояние между зонами — Минимальное расстояние между новыми зонами в барах
invalidationMethod Метод аннулирования зоны — Способ аннулирования зоны: по цене закрытия или по максимуму/минимуму
showHistoric Показывать исторические зоны — Отображает ранее аннулированные зоны
activeLookback Просмотр активных зон — Количество баров назад для отображения активных зон
historicBars Просмотр исторических зон — Количество баров назад для отображения исторических зон
showActiveLabels Показывать информацию об активных зонах — Отображает метки с информацией об активных зонах
showHistoricLabels Показывать информацию об исторических зонах — Отображает метки с информацией об исторических зонах
labelSize Размер метки — Размер меток зон
activeSupplyCol Цвет активного предложения — Цвет для активных зон предложения
activeDemandCol Цвет активного спроса — Цвет для активных зон спроса
historicCol Цвет исторических зон — Цвет для исторических аннулированных зон
showRetestMarkers Показывать маркеры ретестов — Отображает маркеры ретестов зон
retestBullCol Цвет ретеста спроса — Цвет маркера ретеста зоны спроса
retestBearCol Цвет ретеста предложения — Цвет маркера ретеста зоны предложения
alertsOn Включить оповещения — Включает или выключает генерацию оповещений TradingView
Получить полный код

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

indicator("MELONA OB, OPFX ZONA PREMIUM", overlay=true, max_boxes_count=500, max_labels_count=500, max_lines_count=500, max_bars_back=5000)

showPressure = input.bool(true,title = "Show Single Candle Order Block (Pressure)",group = "Single Candle Order Block Settings")
mitigationStyle = input.string("Close",title = "Mitigation Method",options = ["Close","Wick"],group = "Single Candle Order Block Settings")
showLast = input.int(6,title = "Show Last X Single Candle Order Blocks",group = "Single Candle Order Block Settings",minval = 1 , maxval = 15)
volatilityFilter = input.bool(false,title = "Apply Volatility Filter",group = "Single Candle Order Block Settings",
 tooltip ="Enables filtering of Order Blocks based on volatility. When enabled, only Order Blocks with an Average True Range (ATR) above the mean value of the ATR" )
bullishScobColor = input.color(color.new(#00FF00, 80), title = "Bullish/Bearish Pressure Block Color", group = "Single Candle Order Block Style Settings",inline = "color")
bearishScobColor = input.color(color.new(#BD10E0, 80), title = " ", group = "Single Candle Order Block Style Settings",inline = "color")

type Pressure
    float top
    float bottom
    int barStart
    box block
    bool broken

var array<Pressure> bullishScobArray = array.new<Pressure>()    
var array<Pressure> bearishScobArray = array.new<Pressure>()   

buyPressure=false
sellPressure=false
buyMainob=false
sellMainob=false

f_check_overlap(array<Pressure> scobArray, float top, float bottom) =>
    overlap = false
    if scobArray.size() > 1
        for i = 0 to array.size(scobArray) - 1
            scobElement = array.get(scobArray, i)
            if ((top < scobElement.top and top > scobElement.bottom) or (bottom > scobElement.bottom and bottom < scobElement.top))
                overlap:= true
    overlap

detectBullishSCOB = open[2] > close[2] and close[1] > open[1] and close > open and low[1] < low[2] and close > high[1]
detectBearishSCOB = open[2] < close[2] and close[1] < open[1] and close < open and high[1] > high[2] and close < low[1]
atrw = ta.atr(14)
atrFilter = ta.sma(atrw,200)

if detectBearishSCOB
    newScob = Pressure.new(top = high[1],bottom = low[1],barStart = time[1],block = na,broken = false)
    buyPressure:=false
    sellPressure:=true
    if not f_check_overlap(bearishScobArray, newScob.top, newScob.bottom)
        if volatilityFilter and atrw > atrFilter
            array.push(bearishScobArray,newScob)
        if not volatilityFilter
            array.push(bearishScobArray,newScob)
    if bearishScobArray.size() > 20
        testScob = bearishScobArray.shift()
        box.delete(testScob.block)

if detectBullishSCOB
    newScob = Pressure.new(top = high[1],bottom = low[1],barStart = time[1],block = na,broken = false)
    buyPressure:=true
    sellPressure:=false
    if not f_check_overlap(bullishScobArray, newScob.top, newScob.bottom)
        if volatilityFilter and atrw > atrFilter
            array.push(bullishScobArray,newScob)
        if not volatilityFilter
            array.push(bullishScobArray,newScob)
    if bullishScobArray.size() > 20
        testScob = bullishScobArray.shift()
        box.delete(testScob.block)

if showPressure
    if bullishScobArray.size() > 0
        counter = 0
        for i = bullishScobArray.size() - 1 to 0 
            bullishScob = bullishScobArray.get(i)
            if counter < showLast
                if na(bullishScob.block) 
                    bullishScob.block := box.new(top = bullishScob.top,bottom = bullishScob.bottom,left = bullishScob.barStart,right = time,xloc=xloc.bar_time,bgcolor = bullishScobColor,border_color = bullishScobColor
                     ,text = "Bullish pressure",text_color = color.green,text_halign = text.align_right,text_size = size.small,force_overlay = true)
                if not na(bullishScob.block) and bullishScob.bottom > (mitigationStyle == "Close" ? close : low)
                    deletedScob = bullishScobArray.remove(i)
                    deletedScob.block.delete()
                    break
                counter := counter + 1
                bullishScob.block.set_right(time)
            else 
                bullishScob.block.delete()
                bullishScob.block := na

    if bearishScobArray.size() > 0
        counter = 0
        for i = bearishScobArray.size() - 1 to 0
            bearishScob = bearishScobArray.get(i)
            if counter < showLast
                if na(bearishScob.block)
                    bearishScob.block := box.new(top = bearishScob.top,bottom = bearishScob.bottom,left = bearishScob.barStart,right = time,xloc=xloc.bar_time,bgcolor = bearishScobColor,border_color = bearishScobColor
                     ,text = "Bearish pressure",text_color = color.red,text_halign = text.align_right,text_size = size.small,force_overlay = true)
                if not na(bearishScob.block) and bearishScob.top < (mitigationStyle == "Close" ? close : high)
                    deletedScob = bearishScobArray.remove(i)
                    deletedScob.block.delete()
                    break
                counter := counter + 1
                bearishScob.block.set_right(time)
            else 
                bearishScob.block.delete()
                bearishScob.block := na

alertcondition(detectBullishSCOB, title="Bullish Pressure Detected", message="A Bullish Single Candle Order Block has formed")
alertcondition(detectBearishSCOB, title="Bearish Pressure Detected", message="A Bearish Single Candle Order Block has formed")

barcolor(open[1] > close[1] ? close > open ? close >= open[1] ? close[1] >= open ? close - open > open[1] - close[1] ? color.white :na :na : na : na : na)

bullish = #089981
bearish = #f23645
f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180  
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
lengthx = input.int(200, minval=2, title="MA Length")
x = input.int(3, minval=1, title="Trend Angle")
srcx = input(close, title="Source")
matype = input.string(title='', defval='EMA', options=['EMA', 'SMA'])
lookbackw = input.int(4, 'Angle Lookback', minval=1)
atrPeriodx = input.int(10, 'ATR Period', minval=1)
Trend_detector=input.int(10,'Trend detector sensitivity',minval=1) 
ANGLE_TABLE=input.int(6,'ANGLE TABLE',minval=1)
AVG_angleBars = input.int(4, title="AVG ANGLE", minval=1)
simplema = ta.ema(srcx,lengthx)

gr_overlays = "INDICATOR OVERLAYS"
showcandle = input(true, "Coloring Candle", group = gr_overlays, inline = "11")
candleoption = input.string("Trend", "", options = ["Trend","RSI Gradient"],group = gr_overlays, inline = "11")
if(matype == "SMA")
    simplema := ta.sma(srcx,lengthx)
_angle = f_angle(simplema, lookbackw, atrPeriodx)
negative_x = x * -1
Pcolor = _angle > x ? color.lime : _angle < negative_x ? color.red : color.rgb(207, 223, 250)
buyTrend = false
sellTrend = false
trendChangeP = false
trendChangeN = false
if(_angle > x)
    buyTrend := true

if(_angle < negative_x )
    sellTrend := true
if(buyTrend and buyTrend[1] == false) 
    trendChangeP := true

if(sellTrend and sellTrend[1] == false) 
    trendChangeN := true 

plot(simplema ,title='Color MA', color=Pcolor, linewidth=2,force_overlay = true,force_overlay = true)
plot(simplema ,title='Color MA', color=color.new(Pcolor,80), linewidth=7,force_overlay = true,force_overlay = true)

isTrendingUp(angleAvg) =>
    angleAvg > angleAvg[AVG_angleBars]
isTrendingDown(angleAvg) =>
    angleAvg < angleAvg[AVG_angleBars]

calculateAngleAvg() =>
    sum = 0.0
    for i = 0 to 19
        sum := sum + f_angle(simplema, lookbackw, atrPeriodx)[i]
    sum / Trend_detector

nbuysell   = input.bool(true, 'Buy/Sell Signal', inline = "BSNM",group='BUY/SELL SIGNAL')
nsensitivity = input.float(defval=3, title="-", inline = "BSNM", minval=1, maxval=20, group='BUY/SELL SIGNAL')

LongTrendAverage  = input(false, 'Trend Cloud', group='TREND FEATURES')
TrendFollower     = input(true, 'Trend Follower', group='TREND FEATURES')
ShowComulus       = input(false, 'Comulus Cloud', group='TREND FEATURES')
CirrusCloud       = input(false, 'Cirrus Cloud', group='TREND FEATURES')

levels      = input.bool(false, "Show TP/SL Levels but not in this edition" , group = "Risk Management" , inline = "MMDB2")
lvlLines    = input.bool(false, "Show Lines ", inline="levels", group = "Risk Management")
linesStyle  = input.string("SOLID", "", ["SOLID", "DASHED", "DOTTED"], inline="levels", group = "Risk Management")
lvlDistance = input.int(1, "Distance", 1, inline="levels2", group = "Risk Management")
lvlDecimals = input.int(2, "   Decimals", 1, 8, inline="levels2", group = "Risk Management")
atrRisk     = input.int(1, "Risk % ", 1, group = "Risk Management" , inline="levels3")
atrLen      = input.int(14, "  ATR Length", 1, group = "Risk Management" , inline="levels3")
decimals  = lvlDecimals == 1 ? "#.#" : lvlDecimals == 2 ? "#.##" : lvlDecimals == 3 ? "#.###" : lvlDecimals == 4 ? "#.####" : lvlDecimals == 5 ? "#.#####" : lvlDecimals == 6 ? "#.######" : lvlDecimals == 7 ? "#.#######" : "#.########"

history_of_demand_to_keep = 20
show_zigzag = false
show_price_action_labels = false
showsr = input(true, title="Show Support & Resistance", group = 'Support & Resistance')
swing_length = input.int(defval=8, title="Sensitivity", group = 'Support & Resistance')
box_width = input.float(defval=4, title="Zone Width", group = 'Support & Resistance')
box_extend_option = input.string("Right", title="Extend Box", options=["Right", "Both"], group = 'Support & Resistance') 
res = input.timeframe(title='Time Frame', defval='', group="Support & Resistance")
s1 = request.security(syminfo.tickerid, res, showsr, gaps=barmerge.gaps_on)
demand_color = input.color(color.rgb(0,188,212,70), title = 'Support & Resistance Color', group = 'Support & Resistance')
supply_color = input.color(color.rgb(178,40,51,70), title = '', group = 'Support & Resistance')

supertrend(_close, factor, atrLen) =>
	atr = ta.atr(atrLen)
	upperBand = _close + factor * atr
	lowerBand = _close - factor * atr
	prevLowerBand = nz(lowerBand[1])
	prevUpperBand = nz(upperBand[1])
	lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
	upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
	int direction = na
	float superTrend = na
	prevSuperTrend = superTrend[1]
	if na(atr[1])
		direction := 1
	else if prevSuperTrend == prevUpperBand
		direction := close > upperBand ? -1 : 1
	else
		direction := close < lowerBand ? 1 : -1
	superTrend := direction == -1 ? lowerBand : upperBand
	[superTrend, direction] 

ocAvg       = math.avg(open, close)
sma4        = ta.sma(close, 8)
sma5        = ta.sma(close, 9)
sma9        = ta.sma(close, 13)
psar        = ta.sar(0.02, 0.02, 0.2)

[supertrend, direction] = supertrend(close, nsensitivity*2, 11)

green       = #2BBC4D, green2   = #00DD00
red         = #C51D0B, red2     = #DD0000
adxlen = 15
dilen = 15
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : up > down and up > 0 ? up : 0
    minusDM = na(down) ? na : down > up and down > 0 ? down : 0
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]
adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
    adx
sig = adx(dilen, adxlen)

sidewaysThreshold = input.int(title='ADX Sideways Threshold (10-30)', minval=2, defval=15)

bool isSideways = sig < sidewaysThreshold

useBarColor = true
bColor = isSideways ? color.new(#4b148d, 0) : na

y1 = low - (ta.atr(30) * 2), y1B = low - ta.atr(30)
y2 = high + (ta.atr(30) * 2), y2B = high + ta.atr(30)
bull = ta.crossover(close, supertrend) and close >= sma9
bear = ta.crossunder(close, supertrend) and close <= sma9

windowsize = 100
offset = 0.9
sigma = 6

windowsize2 = 310
offset2 = 0.85
sigma2 = 32

smoothrng(x, t, m) =>
    wper  = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng     = smoothrng(close, 22, 6)
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(close, smrng)

upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
filtcolor = upward > 0 ? color.new(#00e2ff, 50) : downward > 0 ? color.new(#fe0100, 50) : color.new(#56328f, 0)
plot(TrendFollower ? filt : na, color=filtcolor, linewidth=1, title='Trend Tracer')

tclength = 600
hullma = ta.wma(2*ta.wma(close, tclength/2)-ta.wma(close, tclength), math.floor(math.sqrt(tclength)))
plot(LongTrendAverage ? hullma : na, 'Trend Cloud', linewidth=4, color=close[8] > hullma ? color.new(#00e2ff, 65) : color.new(#fe0100, 65))

x1 = 22
x2 = 9
x3 = 15
x4 = 5
smoothrngX1(x, t, m) =>
    wper  = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrngX1 = ta.ema(avrng, wper) * m
    smoothrngX1
smrngx1x     = smoothrngX1(close, x1, x2)
smrngx1x2     = smoothrngX1(close, x3, x4)
rngfiltx1x1(x, r) =>
    rngfiltx1x1 = x
    rngfiltx1x1 := x > nz(rngfiltx1x1[1]) ? x - r < nz(rngfiltx1x1[1]) ? nz(rngfiltx1x1[1]) : x - r : x + r > nz(rngfiltx1x1[1]) ? nz(rngfiltx1x1[1]) : x + r
    rngfiltx1x1
filtx1 = rngfiltx1x1(close, smrngx1x)
filtx12 = rngfiltx1x1(close, smrngx1x2)

upwardx1 = 0.0
upwardx1 := filtx1 > filtx1[1] ? nz(upwardx1[1]) + 1 : filtx1 < filtx1[1] ? 0 : nz(upwardx1[1])
downwardx1 = 0.0
downwardx1 := filtx1 < filtx1[1] ? nz(downwardx1[1]) + 1 : filtx1 > filtx1[1] ? 0 : nz(downwardx1[1])
filtx1colorx1 = color.rgb(0, 187, 212, 100)

buy  =  buyMainob and buyPressure? label.new(bar_index, y1, "Buy", xloc.bar_index, yloc.price, #00e2ff, label.style_label_up, color.white, size.normal) : na
sell =  sellMainob and sellPressure ? label.new(bar_index, y2,"Sell", xloc.bar_index, yloc.price, #fe0100, label.style_label_down, color.white, size.normal) : na

avg_volume = ta.sma(volume, 20)
very_weak_multiplier = 0.5
weak_multiplier = 1
strong_multiplier = 1.5

var int[] demandRejections = array.new_int(history_of_demand_to_keep, 0)
var int[] supplyRejections = array.new_int(history_of_demand_to_keep, 0)
var int[] demandCreationBars = array.new_int(history_of_demand_to_keep, na)
var int[] supplyCreationBars = array.new_int(history_of_demand_to_keep, na)
var box[] current_demand_box = array.new_box(history_of_demand_to_keep, na)
var box[] current_supply_box = array.new_box(history_of_demand_to_keep, na)
f_check_demand_rejections() =>
    for i = 0 to history_of_demand_to_keep - 1
        if not na(array.get(demandCreationBars, i))
            if bar_index - array.get(demandCreationBars, i) > 15 and bar_index - array.get(demandCreationBars, i) % 15 == 0
                label.new(bar_index, high, "Checking demand rejection", color=color.red)
                dBox = array.get(current_demand_box, i)
                if (na(dBox))
                    continue
                withinBox = (high >= box.get_bottom(dBox) and high <= box.get_top(dBox)) or (close >= box.get_bottom(dBox) and close <= box.get_top(dBox))
                bearishCandlesCount = math.sum(close < open ? 1 : 0, 15)
                if withinBox and bearishCandlesCount >= 7
                    label.new(bar_index, low, "Bearish count > 7", color=color.blue)
                    array.set(demandRejections, i, array.get(demandRejections, i) + 1)
f_check_supply_rejections() =>
    for i = 0 to history_of_demand_to_keep - 1
        if not na(array.get(supplyCreationBars, i))
            if bar_index - array.get(supplyCreationBars, i) > 15 and bar_index - array.get(supplyCreationBars, i) % 15 == 0
                label.new(bar_index, low, "Checking supply rejection", color=color.red)
                sBox = array.get(current_supply_box, i)
                if (na(sBox))
                    continue
                withinBox = (low <= box.get_top(sBox) and low >= box.get_bottom(sBox)) or (close <= box.get_top(sBox) and close >= box.get_bottom(sBox))
                bullishCandlesCount = math.sum(close > open ? 1 : 0, 15)
                if withinBox and bullishCandlesCount >= 7
                    label.new(bar_index, high, "Bullish count > 7", color=color.blue)
                    array.set(supplyRejections, i, array.get(supplyRejections, i) + 1)
f_array_add_pop(array, new_value_to_add) =>
    array.unshift(array, new_value_to_add)
    array.pop(array)
f_sh_sl_labels(array, swing_type) =>
    var string label_text = na
    if swing_type == 1
        if array.get(array, 0) >= array.get(array, 1)
            label_text := 'HH'
        else
            label_text := 'LH'
        label.new(bar_index - swing_length, array.get(array,0), text = label_text, style=label.style_label_down, textcolor = color.white, color = color.new(color.white, 100), size = size.tiny)
    else if swing_type == -1
        if array.get(array, 0) >= array.get(array, 1)
            label_text := 'HL'
        else
            label_text := 'LL'
        label.new(bar_index - swing_length, array.get(array,0), text = label_text, style=label.style_label_up, textcolor = color.white, color = color.new(color.white, 100), size = size.tiny)
f_check_overlapping(new_poi, box_array, atr) =>
    atr_threshold = atr * 2
    okay_to_draw = true
    for i = 0 to array.size(box_array) - 1
        top = box.get_top(array.get(box_array, i))
        bottom = box.get_bottom(array.get(box_array, i))
        poi = (top + bottom) / 2
        upper_boundary = poi + atr_threshold
        lower_boundary = poi - atr_threshold
        if new_poi >= lower_boundary and new_poi <= upper_boundary
            okay_to_draw := false
            break
        else 
            okay_to_draw := true
    okay_to_draw
f_supply_demand(value_array, bn_array, box_array, label_array, box_type, atr) =>
    atr_buffer = atr * (box_width / 10)
    box_left = array.get(bn_array, 0)
    box_right = bar_index + 20
    var float box_top = 0.00
    var float box_bottom = 0.00
    var float poi = 0.00
    if box_type == 1
        box_top := array.get(value_array, 0)
        box_bottom := box_top - atr_buffer
        poi := (box_top + box_bottom) / 2
    else if box_type == -1
        box_bottom := array.get(value_array, 0)
        box_top := box_bottom + atr_buffer
        poi := (box_top + box_bottom) / 2
    okay_to_draw = f_check_overlapping(poi, box_array, atr)
    swing_volume = volume[swing_length]
    var string strength_text = ""

    highest_volume_last_20 = ta.highest(volume, 20)
    volume_percentage = math.round(swing_volume / highest_volume_last_20 * 100) 
    volume_percentage := math.min(volume_percentage, 100)  // Cap the volume percentage to 100

    var extend_option = extend.right
    if box_extend_option == "Right"
        extend_option := extend.right
    else if box_extend_option == "Both"
        extend_option := extend.both
    if box_type == 1 and okay_to_draw and s1
        box.delete( array.get(box_array, array.size(box_array) - 5) )
        f_array_add_pop(box_array, box.new( left = box_left, top = box_top, right = box_right, bottom = box_bottom, border_color = color.rgb(242,54,69,50), border_width=1,text="MAIN OB",text_halign = text.align_left,text_color = color.black,
             bgcolor = supply_color, extend = extend_option, text = strength_text, text_halign = text.align_right, text_valign = text.align_center, text_color = color.white, text_size = size.small, xloc = xloc.bar_index))
        box.delete( array.get(label_array, array.size(label_array) - 5) )
        f_array_add_pop(label_array, box.new( left = box_left, top = poi, right = box_right, bottom = poi, border_color = color.rgb(242,54,69,50), border_width=1, border_style=line.style_dotted,text="MAIN OB",text_halign = text.align_left,text_color = color.black,
             bgcolor = color.new(color.black,100), extend = extend_option,  text = '', text_halign = text.align_left, text_valign = text.align_center, text_color = color.white, text_size = size.small, xloc = xloc.bar_index))

    else if box_type == -1 and okay_to_draw and s1
        box.delete( array.get(box_array, array.size(box_array) - 5) )
        f_array_add_pop(box_array, box.new( left = box_left, top = box_top, right = box_right, bottom = box_bottom, border_color = color.rgb(0,188,212,50), border_width=1,text="MAIN OB",text_halign = text.align_left,text_color = color.black,
             bgcolor = demand_color, extend = extend_option,  text = strength_text, text_halign = text.align_right, text_valign = text.align_center, text_color = color.white, text_size = size.small, xloc = xloc.bar_index))
        box.delete( array.get(label_array, array.size(label_array) - 5) )
        f_array_add_pop(label_array, box.new( left = box_left, top = poi, right = box_right, bottom = poi, border_color = color.rgb(0,188,212,50), border_width=1, border_style=line.style_dotted,text="MAIN OB",text_halign = text.align_left,text_color = color.black,
             bgcolor = color.new(color.black,100), extend = extend_option,  text = '', text_halign = text.align_left, text_valign = text.align_center, text_color = color.white, text_size = size.small, xloc = xloc.bar_index))

f_sd_to_bos(box_array, bos_array, label_array, zone_type) =>
    if zone_type == 1
        for i = 0 to array.size(box_array) - 1
            level_to_break = box.get_top(array.get(box_array,i))
            if close >= level_to_break
                box.delete(array.get(box_array, i))
                box.delete(array.get(label_array, i))
    if zone_type == -1
        for i = 0 to array.size(box_array) - 1
            level_to_break = box.get_bottom(array.get(box_array,i))
            if close <= level_to_break
                box.delete(array.get(box_array, i))
                box.delete(array.get(label_array, i))
f_extend_box_endpoint(box_array) =>
    for i = 0 to array.size(box_array) - 1
        box.set_right(array.get(box_array, i), bar_index + 30) // Extend only 20 bars
atr567 = ta.atr(50)
swing_high = ta.pivothigh(high, swing_length, swing_length)
swing_low = ta.pivotlow(low, swing_length, swing_length)
var swing_high_values = array.new_float(5,0.00)
var swing_low_values = array.new_float(5,0.00)
var swing_high_bns = array.new_int(5,0)
var swing_low_bns = array.new_int(5,0)
var current_supply_poi = array.new_box(history_of_demand_to_keep, na)
var current_demand_poi = array.new_box(history_of_demand_to_keep, na)
var supply_bos = array.new_box(5, na)
var demand_bos = array.new_box(5, na)
if not na(swing_high)
    f_array_add_pop(swing_high_values, swing_high)
    f_array_add_pop(swing_high_bns, bar_index[swing_length])
    if show_price_action_labels
        f_sh_sl_labels(swing_high_values, 1)
    f_supply_demand(swing_high_values, swing_high_bns, current_supply_box, current_supply_poi, 1, atr567)
    buyMainob:=true
    sellMainob:=false
else if not na(swing_low)
    f_array_add_pop(swing_low_values, swing_low)
    f_array_add_pop(swing_low_bns, bar_index[swing_length])
    if show_price_action_labels
        f_sh_sl_labels(swing_low_values, -1)
    f_supply_demand(swing_low_values, swing_low_bns, current_demand_box, current_demand_poi, -1, atr567)
    buyMainob:=false
    sellMainob:=true
f_sd_to_bos(current_supply_box, supply_bos, current_supply_poi, 1)
f_sd_to_bos(current_demand_box, demand_bos, current_demand_poi, -1)
f_extend_box_endpoint(current_supply_box)
f_extend_box_endpoint(current_demand_box)

if not na(swing_low)
    f_array_add_pop(swing_low_values, swing_low)
    f_array_add_pop(swing_low_bns, bar_index[swing_length])
    if show_price_action_labels
        f_sh_sl_labels(swing_low_values, -1)
    f_supply_demand(swing_low_values, swing_low_bns, current_demand_box, current_demand_poi, -1, atr567)
    f_check_demand_rejections()
if not na(swing_high)
    f_array_add_pop(swing_high_values, swing_high)
    f_array_add_pop(swing_high_bns, bar_index[swing_length])
    if show_price_action_labels
        f_sh_sl_labels(swing_high_values, 1)
    f_supply_demand(swing_high_values, swing_high_bns, current_supply_box, current_supply_poi, 1, atr567)
    f_check_supply_rejections()
trigger2 = bull ? 1 : 0
countBull = ta.barssince(bull)
countBear = ta.barssince(bear)
trigger   = nz(countBull, bar_index) < nz(countBear, bar_index) ? 1 : 0
atrBand = ta.atr(atrLen) * atrRisk
atrStop = trigger == 1 ? low - atrBand : high + atrBand
lastTrade(close) => ta.valuewhen(bull or bear , close, 0)
entry = levels ? label.new(time, close, "ENTRY " + str.tostring(lastTrade(close), decimals), xloc.bar_time, yloc.price, #00e2ff, label.style_label_left, color.white, size.normal) : na
label.set_x(entry, label.get_x(entry) + math.round(ta.change(time) * lvlDistance))
label.set_y(entry, lastTrade(close))
label.delete(entry[1])
stop_y = lastTrade(atrStop)
stop  = levels ? label.new(time, close, "SL " + str.tostring(stop_y, decimals), xloc.bar_time, yloc.price, red2, label.style_label_left, color.white, size.normal) : na
label.set_x(stop, label.get_x(stop) + math.round(ta.change(time) * lvlDistance))
label.set_y(stop, stop_y)
label.delete(stop[1])
tp1Rl_y = (lastTrade(close)-lastTrade(atrStop))*1 + lastTrade(close)
tp1Rl   = levels ? label.new(time, close, "1:1 TP " + str.tostring(tp1Rl_y, decimals), xloc.bar_time, yloc.price, green2, label.style_label_left, color.white, size.normal ) : na
label.set_x(tp1Rl, label.get_x(tp1Rl) + math.round(ta.change(time) * lvlDistance))
label.set_y(tp1Rl, tp1Rl_y)
label.delete(tp1Rl[1])
tp2RL_y = (lastTrade(close)-lastTrade(atrStop))*2 + lastTrade(close)
tp2RL   = levels ? label.new(time, close, "2:1 TP " + str.tostring(tp2RL_y, decimals), xloc.bar_time, yloc.price, green2, label.style_label_left, color.white, size.normal) : na
label.set_x(tp2RL, label.get_x(tp2RL) + math.round(ta.change(time) * lvlDistance))
label.set_y(tp2RL, tp2RL_y)
label.delete(tp2RL[1])
tp3RL_y = (lastTrade(close)-lastTrade(atrStop))*3 + lastTrade(close)
tp3RL   = levels ? label.new(time, close, "3:1 TP " + str.tostring(tp3RL_y, decimals), xloc.bar_time, yloc.price, green2, label.style_label_left, color.white, size.normal) : na
label.set_x(tp3RL, label.get_x(tp3RL) + math.round(ta.change(time) * lvlDistance))
label.set_y(tp3RL, tp3RL_y)
label.delete(tp3RL[1])
style = linesStyle == "SOLID" ? line.style_solid : linesStyle == "DASHED" ? line.style_dashed : line.style_dotted
lineEntry = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull : countBear), lastTrade(close), bar_index + lvlDistance, lastTrade(close), xloc.bar_index, extend.none, #00e2ff, style, 2) : na, line.delete(lineEntry[1])
lineStop  = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull : countBear), stop_y, bar_index + lvlDistance, stop_y, xloc.bar_index, extend.none, #fe0100, style, 2) : na, line.delete(lineStop[1])
lineTp1Rl   = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull : countBear), tp1Rl_y, bar_index + lvlDistance, tp1Rl_y, xloc.bar_index, extend.none, green2, style, 2) : na, line.delete(lineTp1Rl[1])
lineTp2RL   = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull : countBear), tp2RL_y, bar_index + lvlDistance, tp2RL_y, xloc.bar_index, extend.none, green2, style, 2) : na, line.delete(lineTp2RL[1])
lineTp3RL   = levels and lvlLines ? line.new(bar_index - (trigger == 0 ? countBull : countBear), tp3RL_y, bar_index + lvlDistance, tp3RL_y, xloc.bar_index, extend.none, green2, style, 2) : na, line.delete(lineTp3RL[1])
alertcondition(bull, title='Buy Signal', message = "BUY")
alertcondition(bear, title='Buy Signal', message = "BUY") 

TD = 0
TD := close > close[4] ? nz(TD[1])+1 : 0
TDUp = TD - ta.valuewhen(TD < TD[1], TD, 1)

plotshape(TDUp==7?true:na,style=shape.triangledown, color=color.red, text="7",textcolor=color.red, location=location.abovebar)
plotshape(TDUp==8?true:na,style=shape.triangledown, color=color.red, text="8",textcolor=color.red, location=location.abovebar)
plotshape(TDUp==9?true:na,style=shape.triangledown, color=color.red, text="⛔️",textcolor=color.red, location=location.abovebar)

TS = 0
TS := close < close[4] ? nz(TS[1])+1 : 0
TDDn = TS - ta.valuewhen(TS < TS[1], TS, 1)

plotshape(TDDn==7?true:na,style=shape.triangleup, color=color.green, text="7",textcolor=color.green, location=location.belowbar)
plotshape(TDDn==8?true:na,style=shape.triangleup, color=color.green, text="8",textcolor=color.green, location=location.belowbar)
plotshape(TDDn==9?true:na,style=shape.triangleup, color=color.green,text="✅",textcolor=color.green, location=location.belowbar)

type OrderBlockState
    bool  isBullishOrderBlock
    bool  isBearishOrderBlock
    float lastState

type VolumePivotState
    bool isVolumePivotHigh
    bool isVolumePivotLow

type ZoneInformation
    line [] upperHighLines
    line [] upperLowLines
    line [] upperMidLines
    bool [] zoneEvaluated
    label[] upperHighLabels
    label[] upperMidLabels

type CrossoverStatus
    bool crossedUp
    bool crossedDown

initializeOrderBlockState() =>
    OrderBlockState.new(false, false, na)

initializeVolumePivotState() =>
    VolumePivotState.new(false, false)

isDoji(float openPrice, float closePrice, float highPrice, float lowPrice) =>
    bodySize      = math.abs(closePrice  - openPrice)
    candleRange   =          highPrice   - lowPrice
    dojiThreshold =          candleRange * 0.1 // 10% of the candle's range
    bodySize     <=          dojiThreshold

method isVolumePivot(VolumePivotState state, bool useVolume, int length) =>
    state.isVolumePivotHigh := useVolume ? not na(ta.pivothigh(volume, length, length)) : false
    state.isVolumePivotLow  := useVolume ? not na(ta.pivotlow (volume, length, length)) : false
    state

method updateOrderBlockState(OrderBlockState state, float closePrice, float openPrice, float highPrice, float lowPrice, int length) =>
    highest_high               = ta.highest(high, length)
    lowest_low                 = ta.lowest (low,  length)
    state.isBullishOrderBlock := high >= highest_high[1] and high <= highest_high and closePrice > closePrice[1]
    state.isBearishOrderBlock := low  <= lowest_low  [1] and low  >= lowest_low   and closePrice < closePrice[1]
    state

method updateOrderBlockStateVolume(OrderBlockState state, VolumePivotState volumeState, float closePrice, float openPrice, float highPrice, float lowPrice, int length) =>
    highest_high               = ta.highest(high, length)
    lowest_low                 = ta.lowest (low,  length)
    state.isBullishOrderBlock := high >= highest_high[1] and high <= highest_high and closePrice > closePrice[1] and volumeState.isVolumePivotLow
    state.isBearishOrderBlock := low  <= lowest_low  [1] and low  >= lowest_low   and closePrice < closePrice[1] and volumeState.isVolumePivotHigh
    state

displayLabels            = true
length                   = 5
useVolume                = false
bullishOrderBlockColor   = color.new(#07A896, 0)
bearishOrderBlockColor   = color.new(#E81E1E, 0)
displaySupportResistance = false
displayPriceLevels       = false
lineDisplayStyle         = 'Wick'
maxDisplayedLines        = input.int   (20,                      'Max Lines Displayed', minval = 1, maxval = 500,                    group = 'Order Block Settings',                         tooltip = 'Maximum number of lines to display on the chart.')
enableTrendColoring      = input.bool  (false,                   'Enable Trend-Based Line Coloring',                                 group = 'Order Block Settings',                         tooltip = 'Color lines based on the trend (support/resistance).')
useCandleBody            = input.bool  (false,                   'Use Candle Body',                                                  group = 'Order Block Settings',                         tooltip = 'Use the candle body (open and close) instead of the wick (high and low) for calculations.')
lineThickness            = input.int   (1,                       'Line Thickness',      minval = 1, maxval = 3,                      group = 'Order Block Settings', inline  = 'line style', tooltip = 'Thickness of the Bullish/Bearish Order Block Lines.')
lineStyleOption          = input.string('⎯⎯⎯',                 'Line Style',          options = ['⎯⎯⎯', '----', '····'],         group = 'Order Block Settings', inline  = 'line style', tooltip = 'Style of the Bullish/Bearish Order Block Lines.')
extendSupportResistance  = input.bool  (true,                    'Extend Lines',                                                     group = 'Order Block Settings',                         tooltip = 'Extend the support/resistance lines to the right of the chart.')

float highPrice = useCandleBody ? math.max(open, close) : high
float lowPrice  = useCandleBody ? math.min(open, close) : low

var OrderBlockState  obState       = initializeOrderBlockState ()
var VolumePivotState volumeState   = initializeVolumePivotState()
var ZoneInformation  upperZoneInfo = ZoneInformation.new(array.new_line(0), array.new_line(0), array.new_line(0), array.new_bool(0, false), array.new_label(0), array.new_label(0))
var ZoneInformation  lowerZoneInfo = ZoneInformation.new(array.new_line(0), array.new_line(0), array.new_line(0), array.new_bool(0, false), array.new_label(0), array.new_label(0))

volumeState := volumeState.isVolumePivot(useVolume, length)

obState := useVolume ? updateOrderBlockStateVolume(obState, volumeState, close, open, high, low, length) : updateOrderBlockState(obState, close, open, high, low, length)

bool isBullishOrderBlock = obState.isBullishOrderBlock and (na(obState.lastState) or obState.lastState !=  1)
bool isBearishOrderBlock = obState.isBearishOrderBlock and (na(obState.lastState) or obState.lastState != -1)

if isBullishOrderBlock
    obState.lastState :=  1
else if isBearishOrderBlock
    obState.lastState := -1

plotshape(series = displayLabels and isBullishOrderBlock, title = 'Bullish Order Block', location = location.belowbar, color = bullishOrderBlockColor, style = shape.circle, size = size.tiny)
plotshape(series = displayLabels and isBearishOrderBlock, title = 'Bearish Order Block', location = location.abovebar, color = bearishOrderBlockColor, style = shape.circle, size = size.tiny)

alertcondition(isBullishOrderBlock, title = 'Bullish Order Block Alert', message = 'Bullish Order Block Detected!')
alertcondition(isBearishOrderBlock, title = 'Bearish Order Block Alert', message = 'Bearish Order Block Detected!')

mapLineStyle(style) =>
    out = switch style
        '⎯⎯⎯' => line.style_solid
        '----'  => line.style_dashed
        '····'  => line.style_dotted

createZoneLine(value, isWick, isAverage, displaySignal) =>
    if displaySupportResistance and displaySignal
        if (lineDisplayStyle == 'Wick' and isWick) or (lineDisplayStyle == 'Average' and isAverage) or (lineDisplayStyle == 'Full Range')
            line.new(bar_index, value, bar_index, value)
        else
            na
    else
        na

createPriceLabel(value, isAverage, color, labelPrefix) =>
    if displaySupportResistance and displayPriceLevels
        label.new(bar_index, value, text = labelPrefix + ' - ' + str.tostring(math.round_to_mintick(value)), textcolor = color, style = label.style_none)
    else
        na

method getTrendLineColor(float lineValue, color supportColor, color resistanceColor) =>
    close < lineValue ? resistanceColor : supportColor

initializeCrossoverStatus() =>
    CrossoverStatus.new(false, false)

var CrossoverStatus crossoverStatus = initializeCrossoverStatus()

if isBearishOrderBlock

    float upperHighZone     = highPrice
    float upperLowZone      = lowPrice
    float upperMidZone      = math.avg(upperHighZone, upperLowZone)

    line  upperHighZoneLine = createZoneLine(upperHighZone, true,  false, isBearishOrderBlock)
    line  upperLowZoneLine  = createZoneLine(upperLowZone,  false, false, isBearishOrderBlock)
    line  upperMidZoneLine  = createZoneLine(upperMidZone,  false, true,  isBearishOrderBlock)
    label highZoneLabel     = na
    label midZoneLabel      = na

    if      lineDisplayStyle == 'Wick' or lineDisplayStyle == 'Full Range'
        highZoneLabel := createPriceLabel(upperHighZone, upperHighZone, bearishOrderBlockColor, 'Bearish OB')
    else if lineDisplayStyle == 'Average'
        midZoneLabel  := createPriceLabel(upperMidZone,  upperMidZone,  bearishOrderBlockColor, 'Bearish OB')

    if array.size(upperZoneInfo.upperHighLines) > maxDisplayedLines / 2
        line.delete (array.shift(upperZoneInfo.upperHighLines ))
        line.delete (array.shift(upperZoneInfo.upperLowLines  ))
        line.delete (array.shift(upperZoneInfo.upperMidLines  ))
        array.shift             (upperZoneInfo.zoneEvaluated  )
        label.delete(array.shift(upperZoneInfo.upperHighLabels))
        label.delete(array.shift(upperZoneInfo.upperMidLabels ))

    array.push(upperZoneInfo.upperHighLines,  upperHighZoneLine                     )
    array.push(upperZoneInfo.upperLowLines,   upperLowZoneLine                      )
    array.push(upperZoneInfo.upperMidLines,   upperMidZoneLine                      )
    array.push(upperZoneInfo.zoneEvaluated,   extendSupportResistance ? true : false)
    array.push(upperZoneInfo.upperHighLabels, highZoneLabel                         )
    array.push(upperZoneInfo.upperMidLabels,  midZoneLabel                          )

if array.size(upperZoneInfo.upperLowLines) > 0 or array.size(upperZoneInfo.upperMidLines) > 0
    for i = 0 to array.size(upperZoneInfo.upperLowLines) - 1 by 1
        line  tempUpperLine  = array.get(upperZoneInfo.upperHighLines,  i)
        line  tempLowerLine  = array.get(upperZoneInfo.upperLowLines,   i)
        line  tempMiddleLine = array.get(upperZoneInfo.upperMidLines,   i)
        label priceLabelHigh = array.get(upperZoneInfo.upperHighLabels, i)
        label priceLabelMid  = array.get(upperZoneInfo.upperMidLabels,  i)
        bool  zoneEvaluated  = array.get(upperZoneInfo.zoneEvaluated,   i)

        line.set_style(tempUpperLine,  mapLineStyle(lineStyleOption))
        line.set_style(tempLowerLine,  mapLineStyle(lineStyleOption))
        line.set_style(tempMiddleLine, mapLineStyle(lineStyleOption))
        line.

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

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

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

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

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

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

Стоимость полного кода
5 724,70₽ ≈ $69.97