PROTECTED SOURCE SCRIPT

Supply & Demand & Backtest (M5-H4)

92
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org/MPL/2.0/
// © RoseZero

//version=6
indicator('Vung Cung va Cau (M5-H4)', overlay = true)
//===Input===
length1 = input.int(5, 'Swing Loockback', minval = 1)
lengthM5 = input.int(10, title = 'Lookback (M5-M30)')
LengthH1 = input.int(20, title = 'Lookback (H1-H4)')
volMultiplier = input.float(1.5, title = 'Volume Threshold')
zoneHeight = input.float(0.4, title = 'Zone Height (%)')
rsiPeriod = input.int(14, title = 'RSI Period')
rsiOB = input.int(70, title = 'RSI Overbought')
rsiOS = input.int(30, title = 'RSI Oversold')
zoneDuration = input.int(20, title = 'ZOne Duration (bars)')
showEngulfing = input.bool(true, 'Highlight Engulfing Candles')
//boxLookback = input.int(10, title = 'Khoang cach toi da giua 2 liquidity Grab')
//===Auto-adjust by timeframe===
isLowerTF = timeframe.isminutes and timeframe.multiplier <= 30
length = isLowerTF ? lengthM5 : LengthH1
//===Calculation==
avgVol = ta.sma(volume, length)
rsi = ta.rsi(close, rsiPeriod)
highVol = volume > avgVol * volMultiplier
//===Supply Zone Conditions===
isSwingHigh = high == ta.highest(high, length)
bearish = close < open
supplyCond = highVol and isSwingHigh and bearish and rsi > rsiOB
//===Demand Zone Condition===
isSwingLow = low == ta.lowest(low, length)
bullish = close > open
demandCond = highVol and isSwingLow and bullish and rsi < rsiOS
//===Strength Classification===
zoneStrength = volume / avgVol
supplyColor = zoneStrength > 2 ? color.red : color.new(color.red, 60)
demandColor = zoneStrength > 2 ? color.green : color.new(color.green, 60)
supplyLabel = zoneStrength > 2 ? 'Supply(Strong)' : 'Supply(Week)'
demandLabel = zoneStrength > 2 ? 'Demand(Strong)' : 'Demand(Week)'
//===Draw Zone===
if supplyCond
box.new(left = bar_index, right = bar_index + zoneDuration, top = high, bottom = high * (1 - zoneHeight / 100), bgcolor = color.new(supplyColor, 80), border_color = supplyColor, text = supplyLabel, text_color = color.white)
alert('Vung cung moi xuat hien', alert.freq_once_per_bar_close)

if demandCond
box.new(left = bar_index, right = bar_index + zoneDuration, top = low * (1 + zoneHeight / 100), bottom = low, bgcolor = color.new(demandColor, 80), border_color = demandColor, text = demandLabel, text_color = color.white)
alert('Vung cau moi xuat hien', alert.freq_once_per_bar_close)

//===Alert=== alertc
alertcondition(supplyCond, title = 'New Supply Zone', message = 'Vung Cung moi xuat hien!')
alertcondition(demandCond, title = 'New Demand Zone', message = 'Vung Cau moi xuat hien!')

//============================================================================================
//===Khung thoi gian su ly===
timeframe = input.timeframe('30', 'Khung phan tich(vd:\'30\', \'60\')')

//===So nen truoc de do vung OB===
lookback = input.int(10, 'so nen truoc de do oder block')
//===Lay du lieu tu khung thoi gian lon hon===
[highHTF, lowHTF, openHTF, closeHTF] = request.security(syminfo.tickerid, timeframe, [high[lookback], low[lookback], open[lookback], close[lookback]])

src = input.source(close, 'Nguon gia')

//===Logic phat hien OB ===
isBearishOB = closeHTF < openHTF
isBullishOB = closeHTF > openHTF

//===Vung OB===
obHigh = isBearishOB ? highHTF : na
obLow = isBullishOB ? lowHTF : na

//===Canh bao===
touchOB = close >= obLow and close <= obHigh
alertcondition(touchOB, title = 'Cham vung OB', message = 'Gia dang cham vung Smart Money Order Block!')

plotshape(touchOB, location = location.belowbar, color = color.orange, style = shape.triangleup, size = size.small)
if touchOB
alert('Cham vung OB: Gia dang cham vung Smart Money Order Block!', alert.freq_once_per_bar_close)


//===Vung thanh khoan===(Liquidity Sweep Zones)
swingHigh = ta.highest(high, length1)
swingLow = ta.lowest(low, length1)

liquidityHigh = high > swingHigh[1]
liquidityLow = low < swingLow[1]

//==========================================================================================


//===Volume filter===
avgVol2 = ta.sma(volume, 20)
highVol2 = volume > avgVol2 * volMultiplier
//===Candle Pattern===
bullishEngulfing = close > open and close[1] < open[1] and close > open[1] and open < close[1]
bearishEngulfing = close < open and close[1] > open[1] and close < open[1] and open > close[1]
isPinBarBull = close > open and (open - low) > 2 * (close - open)
isPinBarBear = close < open and (high - open) > 2 * (open - close)
isHammer = (high - low) > 3 * (open - close) and (close - low) / (high - low) > 0.6
isHangingMan = (high - low) > 3 * (open - close) and (high - open) / (high - low) > 0.6
isBullMarubozu = close > open and (high - close) < 0.1 * (high -low) and (open -low) < 0.1 * (high - low)
isBearMarubozu = close < open and (high - open) < 0.1 * (high - low) and (close -low) < 0.1 * (high -low)


//===Bien luu vung Cung / Cau da bi pha===
var float lastSupplyTop = na
var float lastSupplyBottom = na
var bool supplyBroken = false

var float lastDemandTop = na
var float lastDemandBottom = na
var bool demandBroken = false

//===Cap nhat vung moi khi co Cung/Cau moi ===
if supplyCond
lastSupplyTop := high
lastSupplyBottom := high * (1 - zoneHeight / 100)
supplyBroken := false

if demandCond
lastDemandBottom := low
lastDemandTop := low * (1 + zoneHeight / 100)

//===Kiem tra pha vo vung Cung/Cau===
if not supplyBroken and close > lastSupplyTop
supplyBroken := true

if not demandBroken and close < lastDemandBottom
demandBroken := true

//===Kiem tra backtest vung da bi pha===
backtestSupply = supplyBroken and close <= lastSupplyTop and close >= lastSupplyBottom
backtestDemand = demandBroken and close >= lastDemandBottom and close <= lastDemandTop

//===Kiem tra thung vung backtest (gia vuot qua vung luon)===
failBacktestSupply = supplyBroken and close < lastSupplyBottom
failBacktestDemand = demandBroken and close > lastDemandTop

//Hien thi canh bao tren bieu do===
plotshape(backtestSupply, title = 'Backtest Supply', location = location.abovebar, color = color.new(color.red, 50), style = shape.circle, size = size.small)
plotshape(backtestDemand, title = 'Backtest Demand', location = location.belowbar, color = color.new(color.green, 60), style = shape.circle, size = size.small)
volStrong = volume > ta.sma(volume, 20) * volMultiplier
validBull = bullishEngulfing and isPinBarBull and isHammer and isBullMarubozu and volStrong and demandCond
validBear = bearishEngulfing and isPinBarBear and isHangingMan and isBearMarubozu and volStrong and supplyCond
if validBull
alert("Tin hieu Buy: Mo hinh nen dao chieu tang + RSI + Volume lon", alert.freq_once_per_bar_close)

if validBear
alert("Tin hieu Sell: Mo hinh nen dao chieu giam + RSI + Volume lon", alert.freq_once_per_bar_close)


//plot(close)

//===============================================================================================

Declinazione di responsabilità

Le informazioni ed i contenuti pubblicati non costituiscono in alcun modo una sollecitazione ad investire o ad operare nei mercati finanziari. Non sono inoltre fornite o supportate da TradingView. Maggiori dettagli nelle Condizioni d'uso.