Liquidity Price Depth Chart [LuxAlgo]

LuxAlgo · study · 168 行 · 点赞 11,354 · TradingView 原页

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

Pine Script

// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © LuxAlgo
 
//@version=5
indicator("Liquidity Price Depth Chart [LuxAlgo]", "LuxAlgo - Liquidity Price Depth Chart", overlay = true, max_labels_count = 500)
//-----------------------------------------------------------------------------}
//Settings
//-----------------------------------------------------------------------------{
//Bullish Elements
showBullMax = input(true, 'Bullish Price Highest Volume Location', group = 'Bullish Elements')
showBullPer = input(true, 'Bullish Volume %', group = 'Bullish Elements')
 
bullCss     = input(#089981, 'Bullish Prices', inline = 'bull', group = 'Bullish Elements')
bullFillCss = input(color.new(#089981, 90), 'Area', inline = 'bull', group = 'Bullish Elements')
 
//Bearish Elements
showBearMax = input(true, 'Bearish Price Highest Volume Location', group = 'Bearish Elements')
showBearPer = input(true, 'Bearish Volume %', group = 'Bearish Elements')
 
bearCss     = input(#f23645, 'Bearish Prices', inline = 'bear', group = 'Bearish Elements')
bearFillCss = input(color.new(#f23645, 90), 'Area', inline = 'bear', group = 'Bearish Elements')
 
//Misc
padding = input.float(5, 'Volume % Box Padding', minval = 0, maxval = 100, group = 'Misc') / 100
 
//-----------------------------------------------------------------------------}
//Populate maps
//-----------------------------------------------------------------------------{
var int x1 = na
 
var float max = na, var float max_bull_vol = na
var float min = na, var float max_bear_vol = na
 
var max_bull_vlvl = line.new(na,na,na,na, color = bullCss, extend = extend.both, style = line.style_dotted)
var max_bear_vlvl = line.new(na,na,na,na, color = bearCss, extend = extend.both, style = line.style_dotted)
 
var bull_map = map.new<float, float>()
var bear_map = map.new<float, float>()
 
n = bar_index
 
if time == chart.left_visible_bar_time
    x1 := n
    max := high, max_bull_vol := close > open ? volume : 0.
    min := low , max_bear_vol := close < open ? volume : 0.
 
//Populate price/volume map
if time <= chart.right_visible_bar_time and time >= chart.left_visible_bar_time
    if close > open 
        bull_map.put(close, volume)
        max_bull_vol := math.max(volume, max_bull_vol)
 
        if max_bull_vol == volume and showBullMax
            max_bull_vlvl.set_xy1(n, close + syminfo.mintick)
            max_bull_vlvl.set_xy2(n, close - syminfo.mintick)
 
    else if close < open 
        bear_map.put(close, volume)
        max_bear_vol := math.max(volume, max_bear_vol)
 
        if max_bear_vol == volume and showBearMax
            max_bear_vlvl.set_xy1(n, close + syminfo.mintick)
            max_bear_vlvl.set_xy2(n, close - syminfo.mintick)
 
    //Get maximum/minimum wicks in visible range
    max := math.max(high, max)
    min := math.min(low, min)
 
//-----------------------------------------------------------------------------}
//Set cumulative areas
//-----------------------------------------------------------------------------{
if time == chart.right_visible_bar_time
    //Sort bull map keys
    bull_sorted = bull_map.keys()
    bull_sorted.sort(order.descending)
    
    //Sort bear map keys
    bear_sorted = bear_map.keys()
    bear_sorted.sort(order.descending)
 
    //Get bullish/bearish volume sums
    bull_sumv = bull_map.values().sum()
    bear_sumv = bear_map.values().sum()
 
    bull_idx = 0.
    bear_idx = 0.
    bull_coordinates = array.new<chart.point>(0)
    bear_coordinates = array.new<chart.point>(0)
 
    bull_coordinates.push(chart.point.from_index(x1, max))
    bear_coordinates.push(chart.point.from_index(n, max))
    
    //Cumulated bullish volume
    for element in bull_sorted
        bull_idx += bull_map.get(element) / bull_sumv
        chart_point = chart.point.from_index(x1 + int(bull_idx * (n - x1) / 2), element)
 
        if bull_map.get(element) == max_bull_vol and showBullMax
            line.new(x1, element, n, element, color = bullCss, style = line.style_dotted)
 
        bull_coordinates.push(chart_point)
 
        //Point label
        label.new(chart_point
          , color = color(na)
          , style = label.style_label_center
          , text = '•'
          , textcolor = bullCss)
 
    //Cumulated bearish volume
    for [index, element] in bear_sorted
        bear_idx += bear_map.get(element) / bear_sumv
        chart_point = chart.point.from_index(n - int(bear_idx * (n - x1) / 2), element)
 
        if bear_map.get(element) == max_bear_vol and showBearMax
            line.new(x1, element, n, element, color = bearCss, style = line.style_dotted)
 
        bear_coordinates.push(chart_point)
 
        //Point label
        label.new(chart_point
          , color = color(na)
          , style = label.style_label_center
          , text = '•'
          , textcolor = bearCss)
 
    //Set horizontal min line for valid fill
    bull_coordinates.push(chart.point.from_index(x1 + (n - x1) / 2, min))
    bull_coordinates.push(chart.point.from_index(x1, min))
 
    bear_coordinates.push(chart.point.from_index(n - (n - x1) / 2, min))
    bear_coordinates.push(chart.point.from_index(n, min))
 
    //Create polylines
    polyline.new(bull_coordinates, line_color = bullCss, fill_color = bullFillCss)
    polyline.new(bear_coordinates, line_color = bearCss, fill_color = bearFillCss)
 
    //Bull % Boxes
    if showBullPer
        bull_vper = bull_sumv / (bull_sumv + bear_sumv)
 
        box.new(x1, min, x1 + (n - x1) / 2, min - padding * (max - min)
          , bullCss
          , bgcolor = na)
        
        box.new(x1, min, x1 + int((n - x1) / 2 * bull_vper), min - padding * (max - min)
          , na
          , bgcolor = bullCss
          , text_color = color.white
          , text = str.tostring(bull_vper * 100, format.percent)
          , text_size = size.small)
    
    //Bear % Boxes
    if showBearPer
        bear_vper = bear_sumv / (bull_sumv + bear_sumv)
 
        box.new(n - (n - x1) / 2, min, n, min - padding * (max - min)
          , bearCss
          , bgcolor = na)
 
        box.new(n - int((n - x1) / 2 * bear_vper), min, n, min - padding * (max - min)
          , na
          , bgcolor = bearCss
          , text_color = color.white
          , text = str.tostring(bear_vper * 100, format.percent)
          , text_size = size.small)
 
//-----------------------------------------------------------------------------}

← 返回列表