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