Volume SMA 9 / 20 / 50This is real time volume average lines having option to select period of volume lines . it not only provides volume with respect to price action but also we can find out real picture of price action pressure. use it with ADX and MACD wisely . only volume spike is not confirmation some times fake breakout , so wait for confirmation and participate at breakout confirmation.
Educational
Micro Futures Risk Calculator (Minimal)risk calculator based off of stop distance. to keep risk consistent for consistent growth
Trap longs - Hamza Naveed// This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
//@version=5
indicator("Trap Longs - Hamza Naveed", max_labels_count = 500, overlay = false, format = format.volume)
g1 = '📊 Net Positions '
g2 = '📈 Moving Averages (VWMA/EMA) '
g3 = '⚙️ Additional Settings '
g4 = '🎚️ Profile '
g5 = '🖥️ Statistics '
g6 = '⚖️ Divergences'
// User inputs - General settings
dtype = input.string('Net Positions', 'Type', options = )
disp = input.string('Candles', 'Display as', options = )
cumu = input.string('Full Data', 'Cumulation', options = )
denom = input.string('Quote Currency', 'Quoted in', options = )
// User inputs - Data Source Settings
binance = input.bool(true, 'Binance USDT.P', inline = 'src')
binance2 = input.bool(true, 'Binance USD.P', inline = 'src')
binance3 = input.bool(true, 'Binance BUSD.P', inline = 'src2')
bitmex = input.bool(true, 'BitMEX USD.P', inline = 'src2')
bitmex2 = input.bool(true, 'BitMEX USDT.P ', inline = 'src3')
kraken = input.bool(true, 'Kraken USD.P', inline = 'src3')
// User inputs - Net Positions
showL = input.bool(true, 'NET LONGS ►', group = g1, inline='l')
showS = input.bool(false, 'NET SHORTS ►', group = g1, inline='s')
showD = input.bool(false, 'NET DELTA ►', group = g1, inline='d')
showR = input.bool(false, 'NET RATIO ►', group = g1, inline='r')
pcolL = input.color(#a5d6a7, '', group = g1, inline = 'l')
ncolL = input.color(#f77c80, '', group = g1, inline = 'l')
lcolL = input.color(#a5d6a7, '━', group = g1, inline = 'l')
pcolS = input.color(#a5d6a7, '', group = g1, inline = 's')
ncolS = input.color(#f77c80, '', group = g1, inline = 's')
lcolS = input.color(#faa1a4, '━', group = g1, inline = 's')
pcolD = input.color(#a5d6a7, '', group = g1, inline = 'd')
ncolD = input.color(#f77c80, '', group = g1, inline = 'd')
lcolD = input.color(#90bff9, '━', group = g1, inline = 'd')
pcolR = input.color(#a5d6a7, '', group = g1, inline = 'r')
ncolR = input.color(#f77c80, '', group = g1, inline = 'r')
lcolR = input.color(#f9d690, '━', group = g1, inline = 'r')
// User inputs - Net Positions EMAs
mat = input.string('VWMA', 'Type', options= , group=g2)
emaL = input.bool(false, 'LONGS ', group=g2, inline='emal')
emaS = input.bool(false, 'SHORTS ', group=g2, inline='emas')
emaD = input.bool(false, 'DELTA ',group=g2, inline='emad')
emaR = input.bool(false, 'RATIO ',group=g2, inline='emar')
emaLl = input.int(100, '', group=g2, inline='emal')
emaSl = input.int(100, '', group=g2, inline='emas')
emaDl = input.int(100, '', group=g2, inline='emad')
emaRl = input.int(100, '', group=g2, inline='emar')
emaLc = input.color(color.rgb(165, 214, 167, 60), '', group=g2, inline='emal')
emaSc = input.color(color.rgb(250, 161, 164, 60), '', group=g2, inline='emas')
emaDc = input.color(color.rgb(144, 191, 249, 60), '', group=g2, inline='emad')
emaRc = input.color(color.rgb(249, 214, 144, 60), '', group=g2, inline='emar')
// User inputs - Additional settings
volhm = input.bool(false, 'Volume HM', group=g3, inline='vol')
volc2 = input.color(color.rgb(49, 121, 245),'', group=g3, inline = 'vol')
offs = input.int (10, 'Label Offset', group=g3)
length = input.int (14, 'Position RSI Length', group=g3)
vlbl = input.bool(true, 'Value Labels', group=g3, inline='lv')
nlbl = input.bool(true, 'Data Labels', group=g3, inline='lv')
wick = input.bool(false, 'Show Candle Wicks', group=g3)
// User inputs - Profile settings
prof = input.bool (false, 'Generate a profile', group=g4)
profsrc = input.string('Net Longs', 'Profile Data', options = , group=g4)
vapct = input.float (70, 'Value Area %', minval = 5, maxval = 95, group = g4)
ori = input.string("Left", 'Position', options = , group = g4)
profSize = input.int (2, 'Node Size', minval = 1, group = g4)
rows = input.int (40, 'Rows', minval = 6, maxval = 500, step = 25, group = g4) - 1
vancol = input.color (color.new(color.blue, 75), 'Node Colors ', group = g4, inline = 'nc')
nvancol = input.color (color.new(color.gray, 75), '━', group = g4, inline = 'nc')
poc = input.bool (false, 'POC', group = g4, inline = 'POC'),
poccol = input.color (color.new(color.red, 50), ' ', group = g4, inline = "POC")
val = input.bool (false, 'VA', group = g4, inline = "VA")
vafill = input.color (color.new(color.blue, 95), ' ', group = g4, inline = 'VA')
// User inputs - Statistics
stats = input.bool(false, 'Show Stats', group = g5)
chg_b = input.int(50, 'Bars Back', group = g5)
tablevpos = input.string('Horizontal', 'Orientation', options= , group = g5)
tablepos = input.string('Bottom Center', 'Position', options= , group = g5)
stat_oi = input.bool(true, 'OI ━', group = g5, inline = 'oi')
stat_nl = input.bool(true, 'NL ━', group = g5, inline = 'nl')
stat_ns = input.bool(true, 'NS ━', group = g5, inline = 'ns')
stat_nd = input.bool(true, 'ND ━', group = g5, inline = 'nd')
stat_oi_c = input.bool(true, 'OI Change ━', group = g5, inline = 'oi')
stat_nl_c = input.bool(true, 'NL Change ━', group = g5, inline = 'nl')
stat_ns_c = input.bool(true, 'NS Change ━', group = g5, inline = 'ns')
stat_nd_c = input.bool(true, 'ND Change ━', group = g5, inline = 'nd')
stat_oi_r = input.bool(true, 'OI RSI', group = g5, inline = 'oi')
stat_nl_r = input.bool(true, 'NL RSI', group = g5, inline = 'nl')
stat_ns_r = input.bool(true, 'NS RSI', group = g5, inline = 'ns')
stat_nd_r = input.bool(true, 'ND RSI', group = g5, inline = 'nd')
// User inputs - Divergence Finder
showdiv = input.bool(false, 'Divergence finder', group = g6)
divsrc = input.string('Net Longs', 'Source', options = , group=g6)
pivotDistance = input.int(5, 'Maximum Distance', minval=0, group=g6)
leftPivot = input.int(8, 'Lookback Bars Left', minval=1, group=g6)
rightPivot = input.int(8, 'Lookback Bars Right', minval=1, group=g6)
pHH_npLH = input.bool(true, 'Price HH + Data LH', group = g6, inline='div1')
pLH_npHH = input.bool(true, 'Price LH + Data HH', group = g6, inline='div2')
pLL_npHL = input.bool(true, 'Price LL + Data HL ', group = g6, inline='div3')
pHL_npLL = input.bool(true, 'Price HL + Data LL ', group = g6, inline='div4')
pHH_npLHcol = input.color(color.red, '', group = g6, inline='div1')
pLH_npHHcol = input.color(color.red, '', group = g6, inline='div2')
pLL_npHLcol = input.color(color.green, '', group = g6, inline='div3')
pHL_npLLcol = input.color(color.green, '', group = g6, inline='div4')
// Getting OI data
mex = syminfo.basecurrency=='BTC' ? 'XBT' : string(syminfo.basecurrency)
= request.security('BINANCE' + ":" + string(syminfo.basecurrency) + 'USDT.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BINANCE' + ":" + string(syminfo.basecurrency) + 'USD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BINANCE' + ":" + string(syminfo.basecurrency) + 'BUSD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BITMEX' + ":" + mex + 'USD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BITMEX' + ":" + mex + 'USDT.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('KRAKEN' + ":" + string(syminfo.basecurrency) + 'USD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
deltaOI = (binance ? nz(oid1,0) : 0) + (binance2 ? nz(oid2,0)/close : 0) + (binance3 ? nz(oid3,0) : 0) + (bitmex ? nz(oid4,0)/close : 0) + (bitmex2 ? nz(oid5,0)/close : 0) + (kraken ? nz(oid6,0)/close : 0)
OI = (binance ? nz(oi1,0) : 0) + (binance2 ? nz(oi2,0)/close : 0) + (binance3 ? nz(oi3,0) : 0) + (bitmex ? nz(oi4,0)/close : 0) + (bitmex2 ? nz(oi5,0)/close : 0) + (kraken ? nz(oi6,0)/close : 0)
// Conditions for positions entering and exiting
priceUP = close>open
priceDOWN = close0
oiDOWN = deltaOI<0
newlongs = oiUP and priceUP
rektlongs = oiDOWN and priceDOWN
newshorts = oiUP and priceDOWN
rektshorts = oiDOWN and priceUP
// Visible range
vrc = cumu=='Visible Range' ? time > chart.left_visible_bar_time and time <= chart.right_visible_bar_time : true
// Cumulation of positions entering and exiting
longs_entering = ta.cum(newlongs and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
longs_exiting = ta.cum(rektlongs and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
shorts_entering = ta.cum(newshorts and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
shorts_exiting = ta.cum(rektshorts and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
// Output data
net_longs = longs_entering - math.abs(longs_exiting)
net_shorts = shorts_entering - math.abs(shorts_exiting)
net_delta = net_longs - net_shorts
net_ratio = net_longs / net_shorts
// Calculating Relative Strength
longs_strength = ta.rsi(net_longs, length)
shorts_strength = ta.rsi(net_shorts, length)
delta_strength = ta.rsi(net_delta, length)
ratio_strength = ta.rsi(net_ratio, length)
oi_strength = ta.rsi(OI, length)
// Calculating candle OHLC
src = dtype=='Net Positions' ? net_longs : longs_strength
OpenL = wick ? ta.sma(src , 2) : src
HighL = ta.highest(src, 1)
LowL = ta.lowest(src, 1)
CloseL = wick ? ta.sma(src, 2) : src
src2 = dtype=='Net Positions' ? net_shorts : shorts_strength
OpenS = wick ? ta.sma(src2 , 2) : src2
HighS = ta.highest(src2, 1)
LowS = ta.lowest(src2, 1)
CloseS = wick ? ta.sma(src2, 2) : src2
src3 = dtype=='Net Positions' ? net_delta : delta_strength
OpenD = wick ? ta.sma(src3 , 2) : src3
HighD = ta.highest(src3, 1)
LowD = ta.lowest(src3, 1)
CloseD = wick ? ta.sma(src3, 2) : src3
src4 = dtype=='Net Positions' ? net_ratio : ratio_strength
OpenR = wick ? ta.sma(src4 , 2) : src4
HighR = ta.highest(src4, 1)
LowR = ta.lowest(src4, 1)
CloseR = wick ? ta.sma(src4, 2) : src4
// Calculating EMAs
Lema = mat=='EMA' ? ta.ema(src, emaLl) : ta.vwma(src, emaLl)
Sema = mat=='EMA' ? ta.ema(src2, emaSl) : ta.vwma(src2, emaSl)
Dema = mat=='EMA' ? ta.ema(src3, emaDl) : ta.vwma(src3, emaDl)
Rema = mat=='EMA' ? ta.ema(src4, emaRl) : ta.vwma(src4, emaRl)
// Conditions
lcondL = showL and (disp=='Line' or disp=='Columns'), ccondL = showL and disp=='Candles'
lcondS = showS and (disp=='Line' or disp=='Columns'), ccondS = showS and disp=='Candles'
lcondD = showD and (disp=='Line' or disp=='Columns'), ccondD = showD and disp=='Candles'
lcondR = showR and (disp=='Line' or disp=='Columns'), ccondR = showR and disp=='Candles'
// Plotting Lines
plot(lcondL ? src : na, title="Net Longs", color=disp=='Line' ? lcolL : (net_longs >0 ? pcolL : ncolL), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
plot(lcondS ? src2 : na, title="Net Shorts", color=disp=='Line' ? lcolS : (net_shorts >0 ? pcolS : ncolS), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
plot(lcondD ? src3 : na, title="Net Shorts", color=disp=='Line' ? lcolD : (net_delta >0 ? pcolD : ncolD), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
plot(lcondR ? src4 : na, title="Net Ratio", color=disp=='Line' ? lcolR : (net_ratio >0 ? pcolR : ncolR), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
// Plotting Candles
plotcandle(ccondL ? OpenL : na, ccondL ? HighL : na, ccondL ? LowL : na, ccondL ? CloseL : na, "Longs", CloseL>OpenL ? pcolL : ncolL, CloseL>OpenL ? pcolL : ncolL, false, bordercolor = CloseL>OpenL ? pcolL : ncolL)
plotcandle(ccondS ? OpenS : na, ccondS ? HighS : na, ccondS ? LowS : na, ccondS ? CloseS : na, "Shorts", CloseS>OpenS ? pcolS : ncolS, CloseS>OpenS ? pcolS : ncolS, false, bordercolor = CloseS>OpenS ? pcolS : ncolS)
plotcandle(ccondD ? OpenD : na, ccondD ? HighD : na, ccondD ? LowD : na, ccondD ? CloseD : na, "Delta", CloseD>OpenD ? pcolD : ncolD, CloseD>OpenD ? pcolD : ncolD, false, bordercolor = CloseD>OpenD ? pcolD : ncolD)
plotcandle(ccondR ? OpenR : na, ccondR ? HighR : na, ccondR ? LowR : na, ccondR ? CloseR : na, "Ratio", CloseR>OpenR ? pcolR : ncolR, CloseR>OpenR ? pcolR : ncolR, false, bordercolor = CloseR>OpenR ? pcolR : ncolR)
// Plotting EMAs
plot(emaL ? Lema : na, color=emaLc, editable = false)
plot(emaS ? Sema : na, color=emaSc, editable = false)
plot(emaD ? Dema : na, color=emaDc, editable = false)
plot(emaR ? Rema : na, color=emaRc, editable = false)
// Plotting Relative Strength
plot(dtype=='Position RSI' ? 100 : na, color=color.rgb(120, 123, 134, 90), title = 'RSI 100')
plot(dtype=='Position RSI' ? 70 : na, color=color.rgb(120, 123, 134, 72), title = 'RSI 70')
plot(dtype=='Position RSI' ? 50 : na, color=color.rgb(120, 123, 134, 90), title = 'RSI 50')
plot(dtype=='Position RSI' ? 30 : na, color=color.rgb(120, 123, 134, 72), title = 'RSI 30')
plot(dtype=='Position RSI' ? 0 : na, color=color.rgb(120, 123, 134, 90), title = 'RSI 0')
// Volume Heatmap
vol = volume
volmax = ta.highest(volume, 50)
col = color.from_gradient(volume, 0, volmax, chart.bg_color, volc2)
plotshape(time>chart.left_visible_bar_time and volhm, style=shape.square, size=size.normal,location = location.bottom, color=col, editable = false)
// Labels
if vlbl and disp=='Candles'
vLlabel = showL ? label.new(bar_index, CloseL>OpenL ? HighL : LowL, newlongs or rektlongs ? str.tostring(deltaOI, format.volume) : na, size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseL>OpenL ? label.style_label_down : label.style_label_up) : na
vSlabel = showS ? label.new(bar_index, CloseS>OpenS ? HighS : LowS, newshorts or rektshorts ? str.tostring(deltaOI, format.volume) : na, size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseS>OpenS ? label.style_label_down : label.style_label_up) : na
vDlabel = showD ? label.new(bar_index, CloseD>OpenD ? HighD : LowD, str.tostring(deltaOI, format.volume), size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseD>OpenD ? label.style_label_down : label.style_label_up) : na
vRlabel = showR ? label.new(bar_index, CloseR>OpenR ? HighR : LowR, str.tostring(deltaOI, format.volume), size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseR>OpenR ? label.style_label_down : label.style_label_up) : na
if nlbl and disp!='Columns'
Llabel = showL ? label.new(bar_index+offs, src, 'NET LONGS', size = size.tiny, color=lcolL, textcolor = color.black, style = label.style_label_left) : na
Slabel = showS ? label.new(bar_index+offs, src2, 'NET SHORTS', size = size.tiny, color=lcolS, textcolor = color.black, style = label.style_label_left) : na
Dlabel = showD ? label.new(bar_index+offs, src3, 'NET DELTA', size = size.tiny, color=lcolD, textcolor = color.black, style = label.style_label_left) : na
Rlabel = showR ? label.new(bar_index+offs, src4, 'NET RATIO', size = size.tiny, color=lcolR, textcolor = color.black, style = label.style_label_left) : na
label.delete(Llabel )
label.delete(Slabel )
label.delete(Dlabel )
label.delete(Rlabel )
// Generating a profile - Code from @KioseffTrading's "Profile Any Indicator" script (used with their permission)
srcp = profsrc=='Net Longs' ? src : profsrc=='Net Shorts' ? src2 : profsrc=='Net Delta' ? src3 : src4
var int timeArray = array.new_int()
var float dist = array.new_float()
var int x2 = array.new_int(rows + 1, 5)
var vh = matrix.new(1, 1)
array.unshift(timeArray, math.round(time))
if prof and time >= chart.left_visible_bar_time and time <= chart.right_visible_bar_time
matrix.add_col(vh)
matrix.set(vh, 0, matrix.columns(vh) - 1, srcp)
if prof and barstate.islast
= switch ori
"Left" =>
=>
calc = (matrix.max(vh) - matrix.min(vh)) / (rows + 1)
for i = 0 to rows
array.push(dist, matrix.min(vh) + (i * calc))
for i = 1 to matrix.columns(vh) - 1
for x = 0 to array.size(dist) - 1
if matrix.get(vh, 0, i) >= matrix.get(vh, 0, i - 1)
if array.get(dist, x) >= matrix.get(vh, 0, i - 1) and array.get(dist, x) <= matrix.get(vh, 0, i)
array.set(x2, x, array.get(x2, x) + profSize)
else
if array.get(dist, x) >= matrix.get(vh, 0, i) and array.get(dist, x) <= matrix.get(vh, 0, i - 1)
array.set(x2, x, array.get(x2, x) + profSize)
boc = array.new_box()
for i = 1 to rows
right = array.get(timeArray, n + array.get(x2, i))
if ori == "Left"
switch math.sign(n - array.get(x2, i))
-1 => right := chart.right_visible_bar_time
=> right := array.get(timeArray, n - array.get(x2, i))
array.push(boc, box.new(pos, array.get(dist, i - 1),
right, array.get(dist, i), xloc = xloc.bar_time, border_color =
nvancol, bgcolor = nvancol
))
if i == rows
array.push(boc, box.new(pos, array.get(dist, array.size(dist) - 1),
right, array.get(dist, array.size(dist) - 1) + calc, xloc = xloc.bar_time, border_color =
nvancol, bgcolor = nvancol
))
array.shift(x2), nx = array.indexof(x2, array.max(x2))
nz = nx - 1, nz2 = 0, nz3 = 0, nz4 = 0
for i = 0 to array.size(x2) - 1
if nz > -1 and nx <= array.size(x2) - 1
switch array.get(x2, nx) >= array.get(x2, nz)
true => nz2 += array.get(x2, nx), nx += 1
=> nz2 += array.get(x2, nz), nz -= 1
else if nz <= -1
nz2 += array.get(x2, nx), nx += 1
else if nx >= array.size(x2)
nz2 += array.get(x2, nz), nz -= 1
if nz2 >= array.sum(x2) * (vapct / 100)
nz3 := nx <= array.size(x2) - 1 ? nx : array.size(x2) - 1, nz4 := nz <= -1 ? 0 : nz
break
for i = nz3 to nz4
box.set_border_color(array.get(boc, i), vancol)
box.set_bgcolor(array.get(boc, i), vancol)
if poc
var pocL = line(na)
y = math.avg(box.get_top(array.get(boc, array.indexof(x2, array.max(x2)))), box.get_bottom(array.get(boc, array.indexof(x2, array.max(x2)))))
if na(pocL)
pocL := line.new(chart.left_visible_bar_time, y, chart.right_visible_bar_time, y, xloc = xloc.bar_time, color = poccol, width = 1)
else
line.set_xy1(pocL, chart.left_visible_bar_time, y)
line.set_xy2(pocL, chart.right_visible_bar_time, y)
if val
var vaup = line(na), var vadn = line(na)
ydn = box.get_bottom(array.get(boc, nz3)), yup = box.get_top(array.get(boc, nz4))
if na(vaup)
vadn := line.new(chart.left_visible_bar_time, ydn, chart.right_visible_bar_time, ydn, xloc = xloc.bar_time, color = vancol, width = 1)
vaup := line.new(chart.left_visible_bar_time, yup, chart.right_visible_bar_time, yup, xloc = xloc.bar_time, color = vancol, width = 1)
else
line.set_xy1(vadn, chart.left_visible_bar_time, ydn), line.set_xy2(vadn, chart.right_visible_bar_time, ydn)
line.set_xy1(vaup, chart.left_visible_bar_time, yup), line.set_xy2(vaup, chart.right_visible_bar_time, yup)
linefill.new(vadn, vaup, vafill)
//Generating tables for Stats
switchpos(tablepos) =>
switch tablepos
'Top Left' => position.top_left
'Top Center' => position.top_center
'Top Right' => position.top_right
'Bottom Left' => position.bottom_left
'Bottom Center' => position.bottom_center
'Bottom right' => position.bottom_right
dataTable = table.new(switchpos(tablepos), columns=15, rows=15, bgcolor=color.rgb(120, 123, 134, 56))
fill_rows(cond, txt, c, r) =>
if cond
table.cell(table_id=dataTable, column = tablevpos=='Horizontal' ? c : 0, row = tablevpos=='Horizontal' ? 0 : r, text = txt, height=0, text_color=color.white, text_halign=text.align_center, text_valign= text.align_center)
if barstate.islast and stats and dtype!='Position RSI'
txt = ' •𝗢𝗜: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(denom=='Base Currency' ? OI : OI*close, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt2 = ' •𝗡𝗟: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_longs, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt3 = ' •𝗡𝗦: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_shorts, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt4 = ' •𝗡𝗗: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_delta, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt5 = ' •𝗢𝗜𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(denom=='Base Currency' ? OI-OI : (OI-OI ) * close, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt6 = ' •𝗡𝗟𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_longs - net_longs , format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt7 = ' •𝗡𝗦𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_shorts - net_shorts , format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt8 = ' •𝗡𝗗𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_delta - net_delta , format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt9 = ' •𝗢𝗜 𝗥𝗦𝗜: ' + str.tostring(math.round(oi_strength,1))
txt10 = ' •𝗡𝗟 𝗥𝗦𝗜: ' + str.tostring(math.round(longs_strength,1))
txt11 = ' •𝗡𝗦 𝗥𝗦𝗜: ' + str.tostring(math.round(shorts_strength, 1))
txt12 = ' •𝗡𝗗 𝗥𝗦𝗜: ' + str.tostring(math.round(delta_strength, 1))
fill_rows(stat_oi, txt, 0, 0)
fill_rows(stat_nl, txt2, 1, 1)
fill_rows(stat_ns, txt3, 2, 2)
fill_rows(stat_nd, txt4, 3, 3)
fill_rows(stat_oi_c, txt5, 4, 4)
fill_rows(stat_nl_c, txt6, 5, 5)
fill_rows(stat_ns_c, txt7, 6, 6)
fill_rows(stat_nd_c, txt8, 7, 7)
fill_rows(stat_oi_r, txt9, 8, 8)
fill_rows(stat_nl_r, txt10, 9, 9)
fill_rows(stat_ns_r, txt11, 10, 10)
fill_rows(stat_nd_r, txt12, 11, 11)
// Divergence Finder
switchdivsrc(divsrc) =>
switch divsrc
'Net Longs' => src
'Net Shorts' => src2
'Net Delta' => src3
'Net Ratio' => src4
np = switchdivsrc(divsrc)
var priceHigh = array.new_float(0), var priceLow = array.new_float(0)
var priceHighIndex = array.new_int (0), var priceLowIndex = array.new_int (0)
var npHigh = array.new_float(0), var npLow = array.new_float(0)
var npHighIndex = array.new_int (0), var npLowIndex = array.new_int (0)
var priceHighTrend = 0, var priceLowTrend = 0
var npHighTrend = 0, var npLowTrend = 0
bool closeRecentHighs = false, bool closeOldHighs = false
bool closeHighs = false, bool closeRecentLows = false
bool closeOldLows = false, bool closeLows = false
curPriceHigh = ta.pivothigh(close, leftPivot, rightPivot)
curPriceLow = ta.pivotlow (close, leftPivot, rightPivot)
curnpHigh = ta.pivothigh(np, leftPivot, rightPivot)
curnpLow = ta.pivotlow (np, leftPivot, rightPivot)
if not na(curPriceHigh)
array.push(priceHigh, curPriceHigh)
array.push(priceHighIndex, bar_index-rightPivot)
if not na(curPriceLow)
array.push(priceLow, curPriceLow)
array.push(priceLowIndex, bar_index-rightPivot)
if not na(curnpHigh)
array.push(npHigh, curnpHigh)
array.push(npHighIndex, bar_index-rightPivot)
if not na(curnpLow)
array.push(npLow, curnpLow)
array.push(npLowIndex, bar_index-rightPivot)
if showdiv
if array.size(priceHigh) >= 2 and not na(curPriceHigh)
if array.get(priceHigh, array.size(priceHigh)-1) >= array.get(priceHigh, array.size(priceHigh)-2)
priceHighTrend := 1
else
priceHighTrend := -1
if array.size(priceLow) >= 2 and not na(curPriceLow)
if array.get(priceLow, array.size(priceLow)-1) >= array.get(priceLow, array.size(priceLow)-2)
priceLowTrend := 1
else
priceLowTrend := -1
if array.size(npHigh) >= 2 and not na(curnpHigh)
if array.get(npHigh, array.size(npHigh)-1) >= array.get(npHigh, array.size(npHigh)-2)
npHighTrend := 1
else
npHighTrend := -1
if array.size(npLow) >= 2 and not na(curnpLow)
if array.get(npLow, array.size(npLow)-1) >= array.get(npLow, array.size(npLow)-2)
npLowTrend := 1
else
npLowTrend := -1
if array.size(priceHighIndex) >= 2 and array.size(npHighIndex) >=2
closeRecentHighs := math.abs(array.get(priceHighIndex, array.size(priceHighIndex)-1) - array.get(npHighIndex, array.size(npHighIndex)-1)) <= pivotDistance
closeOldHighs := math.abs(array.get(priceHighIndex, array.size(priceHighIndex)-2) - array.get(npHighIndex, array.size(npHighIndex)-2)) <= pivotDistance
closeHighs := closeRecentHighs and closeOldHighs
if array.size(priceLowIndex) >= 2 and array.size(npLowIndex) >=2
closeRecentLows := math.abs(array.get(priceLowIndex, array.size(priceLowIndex)-1) - array.get(npLowIndex, array.size(npLowIndex)-1)) <= pivotDistance
closeOldLows := math.abs(array.get(priceLowIndex, array.size(priceLowIndex)-2) - array.get(npLowIndex, array.size(npLowIndex)-2)) <= pivotDistance
closeLows := closeRecentLows and closeOldLows
bool uptrendExhuastion = closeHighs and priceHighTrend > 0 and npHighTrend < 0 and (not na(curnpHigh) or not na(curPriceHigh))
bool uptrendAbsorption = closeHighs and priceHighTrend < 0 and npHighTrend > 0 and (not na(curnpHigh) or not na(curPriceHigh))
bool downtrendExhuastion = closeLows and priceLowTrend < 0 and npLowTrend > 0 and (not na(curnpLow) or not na(curPriceLow))
bool downtrendAbsorption = closeLows and priceLowTrend > 0 and npLowTrend < 0 and (not na(curnpLow) or not na(curPriceLow))
drawDiv(time1, price1, time2, price2, type) =>
dcol = type == 'Uptrend Exhuastion' ? pHH_npLHcol : type == 'Uptrend Absorption' ? pLH_npHHcol : type == 'Downtrend Exhaustion' ? pLL_npHLcol : type == 'Downtrend Absorption' ? pHL_npLLcol : na
line.new(x1=time1, y1=price1, x2=time2, y2=price2, color=dcol, width=1)
if uptrendAbsorption or uptrendExhuastion and showdiv
highTime1 = array.get(npHighIndex, array.size(npHighIndex)-1)
highPrice1 = array.get(npHigh, array.size(npHigh)-1)
highTime2 = array.get(npHighIndex, array.size(npHighIndex)-2)
highPrice2 = array.get(npHigh, array.size(npHigh)-2)
if uptrendExhuastion and pHH_npLH
drawDiv(highTime1, highPrice1, highTime2, highPrice2, 'Uptrend Exhuastion')
if uptrendAbsorption and pLH_npHH
drawDiv(highTime1, highPrice1, highTime2, highPrice2, 'Uptrend Absorption')
if downtrendAbsorption or downtrendExhuastion and showdiv
lowTime1 = array.get(npLowIndex, array.size(npLowIndex)-1)
lowPrice1 = array.get(npLow, array.size(npLow)-1)
lowTime2 = array.get(npLowIndex, array.size(npLowIndex)-2)
lowPrice2 = array.get(npLow, array.size(npLow)-2)
if downtrendExhuastion and pLL_npHL
drawDiv(lowTime1, lowPrice1, lowTime2, lowPrice2, 'Downtrend Exhuastion')
if downtrendAbsorption and pHL_npLL
drawDiv(lowTime1, lowPrice1, lowTime2, lowPrice2, 'Downtrend Absorption')
Range Breakout Statistics [Honestcowboy]⯁ Overview
The Range Breakout Statistics uses a very simple system to detect ranges/consolidating markets. The principle is simple, it looks for areas where the slope of a moving average is flat compared to past values. If the moving average is flat for X amount of bars that's a range and it will draw a box.
The statistics part of the script is a bit more complicated. The aim of this script is to expand analysis of trading signals in a different way than a regular backtest. It also highlights the polyline tool, one of my favorite drawing tools on the tradingview platform.
⯁ Statistics Methods
The script has 2 different modes of analyzing a trading signals strength/robustness. It will do that for 2 signals native to the script.
Upper breakout: first price breakout at top of box, before max bars (100 bars by default)
Lower breakout: first price breakout at bottom of box, before max bars
The analysis methods themselves are straightforward and it should be possible for tradingview community to expand this type of analysis to other trading signals. This script is a demo for this analysis, yet some might still find the native signals helpful in their trading, that's why the script includes alerts for the 2 native signals. I've also added a setting to disable any data gathering, which makes script run faster if you want to automate it.
For both of the analysis methods it uses the same data, just with different calculations and drawing methods. The data set is all past price action reactions to the signals saved in a matrix. Below a chart for explaining this visually.
⯁ Method 1: Averages Projection
The idea behind this is that just showing all price action that happened after signal does not give actionable insights. It's more a spaghetti jumble mess of price action lines. So instead the script averages the data out using 3 different approaches, all selectable in the settings menu.
Geometric Average: useful as it accurately reflects compound returns over time, smoothing out the impact of large gains or losses. Accounts for volatility drift.
Arithmetic Average: a standard average calculation, can be misleading in trading due to volatility drift. It is the most basic form of averaging so I included it.
Median: useful as any big volatility huge moves after a signal does not really impact the mean as it's just the middle value of all values.
These averages are the 2 lines you will find in the middle of the projection. Having a clear difference between a lower break average and upper break average price reaction can signal significance of the trading signal instead of pure chaos.
Outside of this I also included calculations for the maximum and minimum values in the dataset. This is useful for seeing price reactions range to the signal, showing extreme losses or wins are possible. For this range I also included 2 matrices of highs and lows data. This makes it possible to draw a band between the range based on closing price and the one using high/low data.
Below is a visualisation of how the averages data is shown on chart.
⯁ Method 2: Equity Simulation
This method will feel closer to home for traders as it more closely resembles a backtest. It does not include any commissions however and also is just a visualisation of price reaction to a signal. This method will simulate what would happen if you would buy at the breakout point and hold the trade for X amount of bars. With 0 being sell at same bar close. To test robustness I've given the option to visualise Equity simulation not just for 1 simulation but a bunch of simulations.
On default settings it will draw the simulations for 0 bars holding all the way to 10 bars holding. The idea behind it is to check how stable the effect is, to have further confirmation of the significance of the signal. If price simulation line moves up on average for 0 bars all the way to 10 bars holding time that means the signal is steady.
Below is a visualisation of the Equity Simulation.
⯁ Signal filtering
For the boxes themselves where breakouts come from I've included a simple filter based on the size of the box in ATR or %. This will filter out all the boxes that are larger top to bottom than the ATR or % value you setup.
⯁ Coloring of Script
The script includes 5 color themes. There are no color settings or other visual settings in the script, the script themes are simple and always have colors that work well together. Equity simulation uses a gradient based on lightness to color the different lines so it's easier to differentiate them while still upper breaks having a different color than lower breaks.
This script is not created to be used in conjunction with other scripts, it will force you into a background color that matches the theme. It's purpose is a research tool for systematic trading, to analyse signals in more depth.
Metaverse color theme:
⯁ Conclusion
I hope this script will help traders get a deeper understanding of how different assets react to their assets. It should be possible to convert this script into other signals if you know how to code on the platform. It is my intention to make more publications that include this type of analysis. It is especially useful when dealing with signals that do not happen often enough, so a regular backtest is not enough to test their significance.
TDPOWERSYS vs Market-Cap Weighted Peersfor QIC - UnCut Diamonds team..
to compare one company vs its peers bundled as basket.
editable..
Price Compression Scanner (Chartink Logic)Breakout above range high → BUY
🔹 Breakdown below range low → SELL
🔹 Best with volume expansion
🔹 Works well for swing trades & momentum breakouts
Highs
Highest High of last 10 days (ending 1 day agos) < Highest High of previous 10 days
Highest High of last 10 days < Highest High of earlier 10 days
➡️ Lower highs (falling resistance)
Lows
3. Lowest Low of last 10 days > Lowest Low of previous 10 days
4. Lowest Low of last 10 days > Lowest Low of earlier 10 days
Closed Source Strategy TesterAllows you to test an indicator that is closed source (you don't have access to the code). You will need to understand the exposed data elements of the indicator you are testing. This strategy is only looking for a buy, sell, exit long, or exit short to be signals that change from 0 to 1. The stop loss/take profit, if used, are expected to be price values.
I encourage you to copy this code and modify it to your needs for specific indicators.
Gold Pullback Precision ProGold Pullback Precision Pro
EMA slope + pullback strategy designed for gold scalping. Combines trend confirmation (slopes) with precise entries (pullbacks), filtered by HTF direction, volume, and RSI. Shows clear BUY/SELL signals with comprehensive dashboard.
EMA Slope + Pullback Pro IndicatorEMA Slope + Pullback Pro Indicator
Core: EMA trend analysis with automated pullback detection.
Key Features:
3-EMA Slope System (9,20,50) with trend signals
Smart Pullback Monitor with visual alerts
Complete Data Table showing all metrics
Multi-Filter System (timeframe + volume)
What It Does:
Shows EMA trends and strength
Detects price pullbacks to EMA levels
Gives entry signals at EMA support/resistance
Filters signals with higher timeframe trend
Visual:
EMA lines on chart
Pullback zones (colored)
Entry arrows
Data table with live metrics
For: Trend + pullback traders wanting automated EMA analysis.
My Custom IndexA small indicator to create custom index (Max 10 constituents)
This tool allows:
Define upto 10 instruments for creating custom index
Define % contribution for each
Activate / Disable constituents by merely tick/untick
Choose to skip adding weights per constituent, by selecting "Equi Weights"
Display a benchmark index (Selectable)
Normalise the plot so that proper inference can be made
This indicator automatically adjusts for the index plot as and when the constituents got listed on the exchange (or when the first data) is available. So there is a possibility of a "jump" in the graph, when a new constituent got listed. Whenever in time a new constituent is included, a "diamond" sign is placed below to indicate the same.
This code is based on the "Make Your Own Index!" by Stefan @Scheplick. Thanks to him.
Pullback Master Pro v2Yes, excellent for scalping too when used on lower timeframes (1-15 min):
Why it works for scalping:
Quick pullback identification for fast entries
EMA slope changes catch momentum shifts early
RSI extremes pinpoint overextended moves
Volume spikes confirm momentum entries
Fast signals for quick in-and-out trades
Scalping Setup:
Use on 1-5 minute charts
Set higher timeframe to 15-30 minutes for trend filter
Shorter EMA periods (5-9) for faster signals
Small pullback depth (5-15%) for tighter entries
The indicator's real-time signals and clean visualization make it ideal for rapid scalping decisions.
Pullback Master ProPullback Master Pro - Scalping & Swing Trading Indicator
Perfect for both scalping and swing trading:
For Scalpers (1-5 min charts):
Quick pullback signals with fast EMA response
Real-time RSI/volume confirmation for rapid entries
Clean signals for fast in/out decisions
For Swing Traders (1H-4H charts):
Multi-timeframe trend filtering for higher accuracy
Deep pullback detection for better risk/reward
Sustained momentum signals for longer holds
Core Features:
Pullback detection with customizable depth
Multi-timeframe trend alignment
RSI + Volume + EMA confluence
Adjustable signal display (opacity, position, size)
Always-visible 3×6 data table
Multiple themes and customization options
One indicator for all timeframes - works equally well for quick scalps and strategic swing trades by adjusting the settings.
Argentina Bonds TIR - Sovereign Bond Yield Curves Indicator# Argentina Bonds TIR
A comprehensive indicator that calculates the Internal Rate of Return (IRR/TIR) for Argentine sovereign bonds and projects future price curves at fixed yield levels.
## Features
**Real-time TIR Calculation**
- Calculates current yield based on market price and expected cashflows
- Uses Newton-Raphson iterative method for precise IRR calculation
- Day count convention: Actual/365 with T+1 settlement
**Automatic Currency Conversion**
- Works with any trading currency: ARS, USD MEP (D suffix), USD Cable (C suffix)
- Automatically converts prices using AL30/AL30D/AL30C ratios
- Bonares use MEP conversion, Globales use Cable conversion
**Yield Curve Projections**
- Projects price curves 150 bars into the future (configurable)
- Fixed TIR lines at 7%, 8%, 9%, 10%, 11%, 12% (each toggleable)
- Current TIR line showing price trajectory at current yield
- Custom TIR line with user-defined yield value
**Clear Labeling**
- Labels positioned near current date for easy reading (configurable offset)
- Color-coded lines for quick identification
- Info panel showing bond details, prices, TIR, and exchange rates
## Supported Bonds
**Bonares** (Argentina legislation, USD MEP): AE38, AL29, AL30, AL35, AL41, AN29
**Globales** (Foreign legislation, USD Cable): GD29, GD30, GD35, GD38, GD41, GD46
## How to Use
1. Apply indicator to any supported bond symbol (e.g., BCBA:AL30D, BCBA:GD35C)
2. The indicator auto-detects bond type and currency
3. View current TIR in the info panel
4. Use projected lines to visualize price targets at different yield levels
5. Toggle individual TIR lines on/off as needed
6. Add a custom TIR line for specific yield analysis
## Settings
**Display**: Show/hide current TIR line, projection bars (30-300), label offset in days
**Fixed TIR Lines**: Individual toggles for 7%, 8%, 9%, 10%, 11%, 12%
**Custom TIR**: Enable custom TIR line, set value (%), choose color
**Colors**: Customize colors for all lines
## Info Panel
Shows bond ticker, type (Bonar/Global), trading currency, current price, native price, current TIR percentage, MEP and CCL exchange rates.
---
## Español
Indicador que calcula la Tasa Interna de Retorno (TIR) para bonos soberanos argentinos y proyecta curvas de precios futuros a niveles fijos de rendimiento.
### Características
- Cálculo de TIR en tiempo real usando método Newton-Raphson
- Conversión automática de moneda (ARS, USD MEP, USD Cable)
- Líneas de TIR fijas al 7%, 8%, 9%, 10%, 11%, 12%
- Línea de TIR personalizada configurable
- Panel informativo con detalles del bono y tipos de cambio
### Bonos Soportados
- **Bonares** (USD MEP): AE38, AL29, AL30, AL35, AL41, AN29
- **Globales** (USD Cable): GD29, GD30, GD35, GD38, GD41, GD46
---
**DISCLAIMER**: This indicator is for informational and educational purposes only. Eco Valores S.A. does NOT provide investment advice or recommendations. Consult a qualified financial advisor before making investment decisions.
**AVISO LEGAL**: Este indicador es solo para fines informativos y educativos. Eco Valores S.A. NO brinda asesoramiento ni recomendaciones de inversión. Consulte con un asesor financiero calificado antes de invertir.
RSI Divergence Pro Price Overlay High-Prob v6RSI Divergence Pro — Comprehensive Usage Guide
1) What This Indicator Does (in plain English)
Goal: Detect high-probability reversal (and optionally continuation) points using RSI divergences, then draw clean visual lines on price (red/bearish, green/bullish) and attach a % Strength label to help you quickly decide if it’s worth trading.
Core logic:
• Finds confirmed peaks and valleys using ta.pivothigh and ta.pivotlow.
• Bearish: Price makes Higher High while RSI makes Lower High.
• Bullish: Price makes Lower Low while RSI makes Higher Low.
• Filters for high probability: RSI near OB/OS, min RSI diff, ATR scaling, pivot spacing.
• Draws lines on price chart and attaches % Strength label.
• Alerts trigger only when a new divergence line is drawn.
2) Inputs & What Each One Means
• RSI Period: Shorter = more reactive; longer = smoother.
• Pivot Left/Right: Controls peak/valley confirmation.
• RSI Overbought/Oversold: Default 60/40; tighten for lower TFs.
• Min RSI Divergence: Minimum difference between RSI pivots.
• ATR Length & Min Price Move vs ATR: Ensures structural change.
• Bars Between Pivots: Avoid micro noise and stale signals.
• Hidden Divergence toggle: OFF for reversal; ON for continuation.
3) The % Strength Label — What It Represents
Combines RSI divergence magnitude (60%), Price move vs ATR (30%), OB/OS proximity (10%).
Interpretation:
• 80–100%: A-grade signals.
• 60–79%: Good, tradable with confirmation.
• 40–59%: Caution.
• <40%: Usually skip.
4) High-Probability Trading Workflow (H1)
1. Step 1: Scan & identify the signal.
2. Step 2: Confirm with price action (structure break or engulfing).
3. Step 3: Entry (conservative or aggressive).
4. Step 4: Stop placement (pivot ±0.5×ATR).
5. Step 5: Take profit & management (TP1 1×ATR, TP2 2×ATR, trail).
5) Confluence & Filters
• EMA slope confirmation.
• Structure alignment with S/R zones.
• Volatility regime check.
6) Example Scenarios
• A) Bearish Classic Divergence: HH price + LH RSI, Strength 83%.
• B) Bullish Classic Divergence: LL price + HL RSI, Strength 68%.
• C) Hidden Bullish Divergence: HL price + LL RSI, Strength 75%.
7) Common Pitfalls & How to Avoid Them
• Forcing signals in dead volatility.
• Taking divergences in strong trends without confirmation.
• Ignoring pivot spacing.
8) Tuning for Your Style
• H1 defaults: RSI 10, pivots 5/5, thresholds 60/40.
• M15/M5: thresholds 65/35, min RSI diff 10–12.
• H4/D1: thresholds 58/42, ATR multiple 0.4–0.6.
9) Multi-Asset Notes
• FX majors: overlap session ideal.
• Indices: require engulfing confirmation.
• Crypto: use ATR multiple ≥0.7.
10) Alerts — How to Use Them
• Set alerts Once per bar close.
• Alert names: Bearish RSI Divergence, Bullish RSI Divergence.
11) Backtesting & Forward Testing
• Define rules: entry, stop, TP.
• Track Strength % bins.
12) Troubleshooting & Diagnostics
• No lines? Loosen thresholds.
• Too many lines? Tighten thresholds.
13) Quick Operator’s Checklist
• Signal present?
• Location near S/R?
• Confirmation present?
14) Future Upgrade Options
• Session filter (London–NY overlap).
• EMA slope confirmation.
• Structure-break confirmation.
• Alert text enhancements.
Breakout ProAdvanced breakout/breakdown indicator featuring multi-pattern detection, quality tier scoring (S/A/B/C), strength analysis (0-10), VWAP integration, multi-timeframe filters, and adaptive R-based take-profit/stop-loss framework. Includes comprehensive dashboard with real-time metrics and market regime detection.
Breakout Alert Pro + VWAPAdvanced breakout/breakdown indicator featuring multi-pattern detection, quality tier scoring (S/A/B/C), strength analysis (0-10), VWAP integration, multi-timeframe filters, and adaptive R-based take-profit/stop-loss framework. Includes comprehensive dashboard with real-time metrics and market regime detection.
World sessionsThe indicator highlights trading sessions of major global exchanges (Tokyo, Hong Kong, Frankfurt, London, New York, Chicago).
It highlights them with horizontal dashed lines from the start to the end of each session. At the session start, it draws a label with the exchange name above the bar, with adjustable height based on ATR.
With gratitude to God the Father, the Lord Jesus Christ - the Son of God, and the Holy Spirit.
// © icman — ic380.com
// Open Source: исходный код открыт (MPL-2.0)
Global Sovereign Spread MonitorIn the summer of 2011, the yield on Italian government bonds rose dramatically while German Bund yields fell to historic lows. This divergence, measured as the BTP-Bund spread, reached nearly 550 basis points in November of that year, signaling what would become the most severe test of the European monetary union since its inception. Portfolio managers who monitored this spread had days, sometimes weeks, of advance warning before equity markets crashed. Those who ignored it suffered significant losses.
The Global Sovereign Spread Monitor is built on a simple but powerful observation that has been validated repeatedly in academic literature: sovereign bond spreads contain forward-looking information about systemic risk that is not fully reflected in equity prices (Longstaff et al., 2011). When investors demand higher yields to hold peripheral government debt relative to safe-haven bonds, they are expressing a view about credit risk, liquidity conditions, and the probability of systemic stress. This information, when properly analyzed, provides actionable signals for traders across all asset classes.
The Science of Sovereign Spreads
The academic study of government bond yield differentials began in earnest following the creation of the European Monetary Union. Codogno, Favero and Missale (2003) published what remains one of the foundational papers in this field, examining why yields on government bonds within a currency union should differ at all. Their analysis, published in Economic Policy, identified two primary drivers: credit risk and liquidity. Countries with higher debt-to-GDP ratios and weaker fiscal positions commanded higher yields, but importantly, these spreads widened dramatically during periods of market stress even when fundamentals had not changed significantly.
This observation led to a crucial insight that Favero, Pagano and von Thadden (2010) explored in depth in the Journal of Financial and Quantitative Analysis. They found that liquidity effects can amplify credit risk during stress periods, creating a feedback loop where rising spreads reduce liquidity, which in turn pushes spreads even higher. This dynamic explains why sovereign spreads often move in non-linear fashion, remaining stable for extended periods before suddenly widening rapidly.
Longstaff, Pan, Pedersen and Singleton (2011) extended this research in their American Economic Review paper by examining the relationship between sovereign credit default swap spreads and bond spreads across multiple countries. Their key finding was that a significant portion of sovereign credit risk is driven by global factors rather than country-specific fundamentals. This means that when spreads widen in Italy, it often reflects broader risk aversion that will eventually affect other asset classes including equities and corporate bonds.
The practical implication of this research is clear: sovereign spreads function as a leading indicator for systemic risk. Aizenman, Hutchison and Jinjarak (2013) confirmed this in their analysis of European sovereign debt default probabilities, finding that spread movements preceded rating downgrades and provided earlier warning signals than traditional fundamental analysis.
How the Indicator Works
The Global Sovereign Spread Monitor translates these academic findings into a systematic framework for monitoring credit conditions. The indicator calculates yield differentials between peripheral government bonds and German Bunds, which serve as the benchmark safe-haven asset in European markets. Italian ten-year yields minus German ten-year yields produce the BTP-Bund spread, the single most important metric for Eurozone stress. Spanish yields minus German yields produce the Bonos-Bund spread, providing a secondary confirmation signal. The transatlantic US-Bund spread captures divergence between the two major safe-haven markets.
Raw spreads are converted to Z-scores, which measure how many standard deviations the current spread is from its historical average over the lookback period. This normalization is essential because absolute spread levels vary over time with interest rate cycles and structural changes in sovereign debt markets. A spread of 150 basis points might have been concerning in 2007 but entirely normal in 2023 following the European debt crisis and subsequent ECB interventions.
The composite index combines these individual Z-scores using weights that reflect the relative importance of each spread for global risk assessment. Italy receives the highest weight because it represents the third-largest sovereign bond market globally and any Italian debt crisis would have systemic implications for the entire Eurozone. Spain provides confirmation of peripheral stress, while the US-Bund spread captures flight-to-quality dynamics between the two primary safe-haven markets.
Regime classification transforms the continuous Z-score into discrete states that correspond to different market environments. The Stress regime indicates that spreads have widened to levels historically associated with crisis periods. The Elevated regime signals rising risk aversion that warrants increased attention. Normal conditions represent typical spread behavior, while the Calm regime may actually signal complacency and potential mean-reversion opportunities.
Retail Trader Applications
For individual traders without access to institutional research teams, the Global Sovereign Spread Monitor provides a window into the macro environment that typically remains opaque. The most immediate application is risk management for equity positions.
Consider a trader holding a diversified portfolio of European stocks. When the composite Z-score rises above 1.0 and enters the Elevated regime, historical data suggests an increased probability of equity market drawdowns in the coming days to weeks. This does not mean the trader must immediately liquidate all positions, but it does suggest reducing position sizes, tightening stop-losses, or adding hedges such as put options or inverse ETFs.
The BTP-Bund spread specifically provides actionable information for anyone trading EUR/USD or European equity indices. Research by De Grauwe and Ji (2013) demonstrated that sovereign spreads and currency movements are closely linked during stress periods. When the BTP-Bund spread widens sharply, the Euro typically weakens against the Dollar as investors question the sustainability of the monetary union. A retail forex trader can use the indicator to time entries into EUR/USD short positions or to exit long positions before spread-driven selloffs occur.
The regime classification system simplifies decision-making for traders who cannot constantly monitor multiple data feeds. When the dashboard displays Stress, it is time to adopt a defensive posture regardless of what individual stock charts might suggest. When it displays Calm, the trader knows that risk appetite is elevated across institutional markets, which typically supports equity prices but also means that any negative catalyst could trigger a sharp reversal.
Mean-reversion signals provide opportunities for more active traders. When spreads reach extreme levels in either direction, they tend to revert toward their historical average. A Z-score above 2.0 that begins declining suggests professional investors are starting to buy peripheral debt again, which historically precedes broader risk-on behavior. A Z-score below minus 1.0 that starts rising may indicate that complacency is ending and risk-off positioning is beginning.
The key for retail traders is to use the indicator as a filter rather than a primary signal generator. If technical analysis suggests a long entry in European stocks, check the sovereign spread regime first. If spreads are elevated or rising, the technical setup becomes higher risk. If spreads are stable or compressing, the technical signal has a higher probability of success.
Professional Applications
Institutional investors use sovereign spread analysis in more sophisticated ways that go beyond simple risk filtering. Systematic macro funds incorporate spread data into quantitative models that generate trading signals across multiple asset classes simultaneously.
Portfolio managers at large asset allocators use sovereign spreads to make strategic allocation decisions. When the composite Z-score trends higher over several weeks, they reduce exposure to peripheral European equities and bonds while increasing allocations to German Bunds, US Treasuries, and other safe-haven assets. This rotation often happens before explicit risk-off signals appear in equity markets, giving these investors a performance advantage.
Fixed income specialists at banks and hedge funds use sovereign spreads for relative value trades. When the BTP-Bund spread widens to historically elevated levels but fundamentals have not deteriorated proportionally, they may go long Italian government bonds and short German Bunds, betting on mean reversion. These trades require careful risk management because spreads can widen further before reversing, but when properly sized they offer attractive risk-adjusted returns.
Risk managers at financial institutions use sovereign spread monitoring as an input to Value-at-Risk models and stress testing frameworks. Elevated spreads indicate higher correlation among risk assets, which means diversification benefits are reduced precisely when they are needed most. This information feeds into position sizing decisions across the entire trading book.
Currency traders at proprietary trading firms incorporate sovereign spreads into their EUR/USD and EUR/CHF models. The relationship between the BTP-Bund spread and EUR weakness is well-documented in academic literature and provides a systematic edge when combined with other factors such as interest rate differentials and positioning data.
Central bank watchers use sovereign spreads to anticipate policy responses. The European Central Bank has demonstrated repeatedly that it will intervene when spreads reach levels that threaten financial stability, most notably through the Outright Monetary Transactions program announced in 2012 and the Transmission Protection Instrument introduced in 2022. Understanding spread dynamics helps investors anticipate these interventions and position accordingly.
Interpreting the Dashboard
The statistics panel provides real-time information that supports both quick assessments and deeper analysis. The composite Z-score is the primary metric, representing the weighted average of all spread Z-scores. Values above zero indicate spreads are wider than their historical average, while values below zero indicate compression. The magnitude matters: a reading of 0.5 suggests modestly elevated stress, while 2.0 or higher indicates conditions similar to historical crisis periods.
The regime classification translates the Z-score into actionable categories. Stress should trigger immediate review of risk exposure and consideration of hedges. Elevated warrants increased vigilance and potentially reduced position sizes. Normal indicates no immediate concerns from sovereign markets. Calm suggests risk appetite may be elevated, which supports risk assets but also creates potential for sharp reversals if sentiment changes.
The percentile ranking provides historical context by showing where the current Z-score falls within its distribution over the lookback period. A reading of 90 percent means spreads are wider than they have been 90 percent of the time over the past year, which is significant even if the absolute Z-score is not extreme. This metric helps identify when spreads are creeping higher before they reach official stress thresholds.
Momentum indicates whether spreads are widening or compressing. Rising momentum during elevated spread conditions is particularly concerning because it suggests stress is accelerating. Falling momentum during stress suggests the worst may be past and mean reversion could be beginning.
Individual spread readings allow traders to identify which component is driving the composite signal. If the BTP-Bund spread is elevated but Bonos-Bund remains normal, the stress may be Italy-specific rather than systemic. If all spreads are widening together, the signal reflects broader flight-to-quality that affects all risk assets.
The bias indicator provides a simple summary for traders who need quick guidance. Risk-Off means spreads indicate defensive positioning is appropriate. Risk-On means spread conditions support risk-taking. Neutral means spreads provide no clear directional signal.
Limitations and Risk Factors
No indicator provides perfect signals, and sovereign spread analysis has specific limitations that users must understand. The European Central Bank has demonstrated its willingness to intervene in sovereign bond markets when spreads threaten financial stability. The Transmission Protection Instrument announced in 2022 specifically targets situations where spreads widen beyond levels justified by fundamentals. This creates a floor under peripheral bond prices and means that extremely elevated spreads may not persist as long as historical patterns would suggest.
Political events can cause sudden spread movements that are impossible to anticipate. Elections, government formation crises, and policy announcements can move spreads by 50 basis points or more in a single session. The indicator will reflect these moves but cannot predict them.
Liquidity conditions in sovereign bond markets can temporarily distort spread readings, particularly around quarter-end and year-end when banks adjust their balance sheets. These technical factors can cause spread widening or compression that does not reflect fundamental credit risk.
The relationship between sovereign spreads and other asset classes is not constant over time. During some periods, spread movements lead equity moves by several days. During others, both markets move simultaneously. The indicator provides valuable information about credit conditions, but users should not expect mechanical relationships between spread signals and subsequent price moves in other markets.
Conclusion
The Global Sovereign Spread Monitor represents a systematic application of academic research on sovereign credit risk to practical trading decisions. The indicator monitors yield differentials between peripheral and safe-haven government bonds, normalizes these spreads using statistical methods, and classifies market conditions into regimes that correspond to different risk environments.
For retail traders, the indicator provides risk management information that was previously available only to institutional investors with access to Bloomberg terminals and dedicated research teams. By checking the sovereign spread regime before executing trades, individual investors can avoid taking excessive risk during periods of elevated credit stress.
For professional investors, the indicator offers a standardized framework for monitoring sovereign credit conditions that can be integrated into broader macro models and risk management systems. The real-time calculation of Z-scores, regime classifications, and component spreads provides the inputs needed for systematic trading strategies.
The academic foundation is robust, built on peer-reviewed research published in top finance and economics journals over the past two decades. The practical applications have been validated through multiple market cycles including the European debt crisis of 2011-2012, the COVID-19 shock of 2020, and the rate normalization stress of 2022.
Sovereign spreads will continue to provide valuable forward-looking information about systemic risk for as long as credit conditions vary across countries and investors respond rationally to changes in default probabilities. The Global Sovereign Spread Monitor makes this information accessible and actionable for traders at all levels of sophistication.
References
Aizenman, J., Hutchison, M. and Jinjarak, Y. (2013) What is the Risk of European Sovereign Debt Defaults? Fiscal Space, CDS Spreads and Market Pricing of Risk. Journal of International Money and Finance, 34, pp. 37-59.
Codogno, L., Favero, C. and Missale, A. (2003) Yield Spreads on EMU Government Bonds. Economic Policy, 18(37), pp. 503-532.
De Grauwe, P. and Ji, Y. (2013) Self-Fulfilling Crises in the Eurozone: An Empirical Test. Journal of International Money and Finance, 34, pp. 15-36.
Favero, C., Pagano, M. and von Thadden, E.L. (2010) How Does Liquidity Affect Government Bond Yields? Journal of Financial and Quantitative Analysis, 45(1), pp. 107-134.
Longstaff, F.A., Pan, J., Pedersen, L.H. and Singleton, K.J. (2011) How Sovereign Is Sovereign Credit Risk? American Economic Review, 101(6), pp. 2191-2212.
Manganelli, S. and Wolswijk, G. (2009) What Drives Spreads in the Euro Area Government Bond Market? Economic Policy, 24(58), pp. 191-240.
Arghyrou, M.G. and Kontonikas, A. (2012) The EMU Sovereign-Debt Crisis: Fundamentals, Expectations and Contagion. Journal of International Financial Markets, Institutions and Money, 22(4), pp. 658-677.
Discipline Sleeping TimeThe Sleeping Time indicator highlights a predefined time window on the chart that represents your sleeping hours. This will help doing backtest easily by filtering out unrealistic result of trades while we are still sleeping.
During the selected period:
- The chart background is softly shaded to visually mark your sleep window
- The first candle of the range is labeled “Sleep”
- The last candle of the range is labeled “Wake Up”
You can also use it for other purpose.
This makes it easy to:
- Visually avoid trading during sleep hours
- Identify when a trading session should be inactive
- Maintain discipline and consistency across different markets and timezones
Key Features:
- Custom Time Range
Define your sleeping hours using a start and end time.
- UTC Offset Selector
Adjust the time window using a UTC offset dropdown (−10 to +13), so the indicator aligns correctly with your local time.
- Clear Visual Markers
Background shading during sleep hours
- Start label: Sleep
- End label: Wake Up
- Customizable Labels
Change label text, size, and style to suit your chart layout.
Best Use Case
Use this indicator to lock in rest time, avoid emotional trades, and respect personal trading boundaries. Because good trades start with good sleep 😴
Advanced Momentum TrackerThe Advanced Momentum Tracker (AMT) is a technical indicator designed to identify high-probability trend reversals and momentum shifts in real-time. Unlike traditional indicators that rely solely on mathematical formulas, AMT analyzes price action structure and historical patterns to detect when market momentum is shifting from bullish to bearish (and vice versa).
Core Methodology:
The indicator tracks consecutive price movements and maintains a comprehensive database of historical momentum patterns. It identifies trend changes by analyzing:
Sequential candle relationships (opens and closes)
Break of key trailing stop levels formed by recent price action
Historical success rates of similar momentum patterns
Key Features
1. Dynamic Levels:
Automatically plots real-time dynamic trailing stop levels based on current momentum
Color-coded lines: Green for bullish momentum, Red for bearish momentum
These levels act as trigger points for potential trend changes
2. Entry Signal Markers:
Clear BUY (↑) and SELL (↓) arrows when momentum shifts are detected
Arrows positioned above/below candles for maximum visibility ,Signals only appear on confirmed trend changes
3. Momentum Score Display:
Shows statistical probability based on historical pattern analysis
Displays strength percentage of current momentum continuation
Helps traders assess confidence level of the current trend
4. Exit Zone Indicator:
Plots recommended exit levels for active positions
Dynamic color coding: Red for long exits, Green for short exits
Warning system (orange) when price breaches exit zones
5. Position Management Filter:
Optional risk filter to avoid trades with excessive distance from trigger level
Customizable position threshold percentage
Helps maintain consistent risk-reward ratios
6. Comprehensive Alert System:
Customizable alert messages for both long and short signals
Configurable alert frequency (once per bar or once per bar close)
Real-time notifications for all signal types
Customization Options-
Visual Settings:
Toggle visibility of current price level, momentum score, and exit zones
Customizable colors for all elements (bullish/bearish themes)
Adjustable line thickness for dynamic levels
Entry Markers:
Custom colors for long and short entry signals
Adjustable arrow distance from candles
Core Parameters:
Historical Depth: Amount of past data to analyze (default: 20,000 bars)
Sensitivity Level: Controls how strong a move must be to trigger signals (default: 4)
Higher values = fewer but stronger signals
Lower values = more signals with earlier entries
Position Management:
Enable/disable position filter
Set maximum acceptable risk threshold as percentage
How It Works:-
Momentum Detection Engine: The script continuously monitors price action, tracking each bullish and bearish leg. It maintains arrays of opens, closes, and counts to build a comprehensive picture of market structure.
Pattern Recognition: When price breaks key levels (minimum/maximum of recent candles based on sensitivity), the indicator recognizes a potential momentum shift.
Statistical Validation: The script compares the current pattern against its historical database to calculate the probability of momentum continuation.
Signal Generation: When a valid trend change is detected (and passes the position filter if enabled), entry signals are displayed with corresponding exit zones.
Best Use Cases:
Swing trading on any timeframe (works on 1m to 1D charts)
Trend reversal identification
Momentum trading strategies
Works on all markets: Forex, Stocks, Crypto, Indices, Commodities etc
Recommended Settings:
Scalping/Day Trading: Sensitivity 2-3, Historical Depth 10,000-20,000
Swing Trading: Sensitivity 3-4, Historical Depth 20,000-30,000
Position Trading: Sensitivity 4-5, Historical Depth 30,000+
Important Notes:
Signals appear only on confirmed bars (not on real-time candles unless confirmed)
The momentum score becomes more accurate as more historical data is processed
Position filter should be adjusted based on the volatility of the instrument being traded
Best used in conjunction with proper risk management and position sizing
What Makes This Indicator Unique:
Unlike indicators that simply apply mathematical formulas to price data, AMT learns from historical price behavior. It doesn't just tell you what happened—it tells you what's likely to happen next based on thousands of similar situations in the past. The statistical momentum score provides an edge that pure technical indicators cannot offer.
Disclaimer: This indicator is a tool for technical analysis and should not be used as the sole basis for trading decisions. Always use proper risk management and combine with your own analysis. Happy Trading !!






















