本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
// https://creativecommons.org/licenses/by-nc-sa/4.0/
// © BigBeluga
//@version=6
indicator("Volume Order Blocks [BigBeluga]", overlay = true
, max_lines_count = 500, max_labels_count = 500, max_bars_back = 5000)
// UDT ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
type level
int indx
float upper
float lower
float mid
float vol
type draw
line upper
line lower
line mid
linefill fill
label vol
// }
// INPUTS ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
int length1 = input.int(5, "Sensitivity Detection: ")
int length2 = length1 + 13
bool mid_l = input.bool(true, "Mid Line")
bool trend_shadow = input.bool(true, "Trend Shadow")
color col1 = input.color(#26ba9f, "", inline = "col")
color col2 = input.color(#6626ba, "", inline = "col")
// }
// CALCULATIONS――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
float ema1 = ta.ema(close, length1)
float ema2 = ta.ema(close, length2)
bool cross_up = ta.crossover(ema1, ema2) and barstate.isconfirmed
bool cross_dn = ta.crossunder(ema1, ema2) and barstate.isconfirmed
float lowest = ta.lowest(length2)
float highest = ta.highest(length2)
var upper_draw = array.new<draw>()
var lower_draw = array.new<draw>()
var upper_lvl = array.new<level>()
var lower_lvl = array.new<level>()
array_vol_upper = array.new<float>()
array_vol_lower = array.new<float>()
difff = ema2 - ema1
color_trend = trend_shadow ? difff > 0 ? color.from_gradient(difff, 0, ta.highest(difff,100), color(na), col2) : color.from_gradient(difff, ta.lowest(difff,100), 0, col1, color(na)) : color(na)
p1 = plot(ema1, "", display = display.none, editable = false)
p2 = plot(ema2, "", display = display.none, editable = false)
fill(p1, p2, color_trend)
atr = ta.highest(ta.atr(200),200)*3
atr1 = ta.highest(ta.atr(200),200)*2
f_clear_previous_lines(draw__) =>
if draw__.size() > 0
for l in draw__
line.delete(l.upper)
line.delete(l.lower)
line.delete(l.mid)
linefill.delete(l.fill)
label.delete(l.vol)
array.clear(draw__)
if cross_up
var vol = 0.0
vol := 0
for i = 1 to length2
if low[i] == lowest
index = bar_index-i
for k = 0 to i
vol += volume[k]
src = math.min(open[bar_index-index], close[bar_index-index])
src := (src-lowest) < atr1*0.5 ? lowest + atr1*0.5 : src
mid = math.avg(src, lowest)
l = level.new(index, src, lowest, mid, vol)
lower_lvl.push(l)
if cross_dn
var vol = 0.0
vol := 0
for i = 1 to length2
if high[i] == highest
index = bar_index-i
for k = 0 to i
vol += volume[k]
src = math.max(open[bar_index-index], close[bar_index-index])
src := (highest-src) < atr1*0.5 ? highest - atr1*0.5 : src
mid = math.avg(src, highest)
l = level.new(index, highest, src, mid, vol)
upper_lvl.push(l)
// }
// PLOT ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
// Remove crossed and Overlapped Bullish OB
if lower_lvl.size() > 0
for i = 0 to lower_lvl.size() - 1
l = lower_lvl.get(i)
l1 = lower_lvl.get(i-1)
mid = l.mid
mid1 = l1.mid
// Overlaps
if math.abs(mid - mid1) < atr
l_ = level.new(na, na, na, na, na)
lower_lvl.set(i-1, l_)
// Crossunder
if close < l.lower
l_ = level.new(na, na, na, na, na)
lower_lvl.set(i, l_)
if lower_lvl.size() > 15
lower_lvl.shift()
// Remove crossed and Overlapped Bearish OB
if upper_lvl.size() > 0
for i = 0 to upper_lvl.size() - 1
l = upper_lvl.get(i)
l1 = upper_lvl.get(i-1)
upper = l.upper
mid = l.mid
mid1 = l1.mid
// Overlaps
if math.abs(mid - mid1) < atr
l_ = level.new(na, na, na, na, na)
upper_lvl.set(i-1, l_)
// Crossover
if close > upper
l_ = level.new(na, na, na, na, na)
upper_lvl.set(i, l_)
if upper_lvl.size() > 15
upper_lvl.shift()
// Plot Bullish OBs and Colect Volume
if lower_lvl.size() > 0 and barstate.islast
f_clear_previous_lines(lower_draw)
for i = 0 to lower_lvl.size() - 1
l = lower_lvl.get(i)
array_vol_lower.push(l.vol)
for i = 0 to lower_lvl.size() - 1
l = lower_lvl.get(i)
txt = "⮜ "+str.tostring(l.vol/array_vol_lower.sum()*100, format.percent) + " ("+str.tostring(l.vol, format.volume)+")"
// Create upper, lower, and mid lines
l_1 = line.new(l.indx, l.upper, bar_index, l.upper, color=col1, width = 2)
l_2 = line.new(l.indx, l.lower, bar_index, l.lower, color=col1, width = 2)
l_mid = line.new(l.indx, l.mid, bar_index, l.mid, color= mid_l ? col1 : color(na), style = line.style_dashed)
vol_l = label.new(bar_index, l.mid, txt, style = label.style_label_left, color = color(na), textcolor = chart.fg_color)
// Create line fill
fill = linefill.new(l_1, l_2, color.new(col1, 90))
// Store newly created lines and fills
draw_ = draw.new(l_1, l_2, l_mid, fill, vol_l)
lower_draw.push(draw_)
// Plot Bearish OBs and Colect Volume
if upper_lvl.size() > 0 and barstate.islast
f_clear_previous_lines(upper_draw)
for i = 0 to array.size(upper_lvl) - 1
l = array.get(upper_lvl, i)
array_vol_upper.push(l.vol)
for i = 0 to array.size(upper_lvl) - 1
l = array.get(upper_lvl, i)
txt = "⮜ "+str.tostring(l.vol/array_vol_upper.sum()*100, format.percent) + " ("+str.tostring(l.vol, format.volume)+")"
// Create upper, lower, and mid lines
l_1 = line.new(l.indx, l.upper, bar_index, l.upper, color=col2, width = 2)
l_2 = line.new(l.indx, l.lower, bar_index, l.lower, color=col2, width = 2)
l_mid = line.new(l.indx, l.mid, bar_index, l.mid, color= mid_l ? col2 : color(na), style = line.style_dashed)
vol_l = label.new(bar_index, l.mid, txt, style = label.style_label_left, color = color(na), textcolor = chart.fg_color)
// Create line fill
fill = linefill.new(l_1, l_2, color.new(col2, 90))
draw_ = draw.new(l_1, l_2, l_mid, fill, vol_l)
upper_draw.push(draw_)
// }