Volume Order Blocks [BigBeluga]

BigBeluga · study · 220 行 · 点赞 10,018 · TradingView 原页

本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。

Pine Script

// 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_)
 
// }

← 返回列表