本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// 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/
// © Zeiierman
//@version=5
indicator("Volume Orderbook (Expo)",overlay=true,max_boxes_count=500,max_lines_count=500)
//~~}
// ~~ Inputs {
src = input.source(close,"Source")
rows = input.int(10,"Rows",0,20,inline="rows")
mult = input.float(.5,"Width",.1,2,step=.05,inline="rows")
tbl = input.bool(false,"Table",inline="table")
left = input.int(5,"Left",0,50,5,inline="table")
tbli = input.bool(false,"Grid",inline="table")
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Variables & Array's {
b = bar_index
var step = 0.0
type Table
array<box> boxes
array<line> lines
array<label> lab
var levels = array.new<float>()
var volumes = array.new<float>()
var vols = array.new<float>(rows*2+1)
var tab = Table.new(array.new<box>(rows*2+2),array.new<line>(rows*2+1),array.new<label>(rows*2+1))
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Code {
//Save first candle size
if barstate.isfirst
step := (high-low)*mult
//Stores each candle volume in levels
if levels.size()<=0
levels.push(src+step)
levels.push(src-step)
volumes.push(volume)
else
found = false
for i=0 to levels.size()-2
lvl1 = levels.get(i)
lvl2 = levels.get(i+1)
if src<lvl1 and src>lvl2
volumes.set(i,volumes.get(i)+volume)
found := true
break
if not found
if src>levels.get(0)
lvl = levels.get(0)
while src>lvl
levels.unshift(lvl+step)
volumes.unshift(0)
lvl := lvl+step
levels.unshift(lvl+step)
volumes.unshift(volume)
else if src<levels.get(levels.size()-1)
lvl = levels.get(levels.size()-1)
while src<lvl
levels.push(lvl-step)
volumes.push(0)
lvl := lvl-step
levels.push(lvl-step)
volumes.push(volume)
//Plots the orderbook
if barstate.islast
for i=0 to levels.size()-2
if src<levels.get(i) and src>levels.get(i+1)
for x=0 to (rows*2)
vols.set(x,volumes.get(i-rows+x))
vol = vols.copy()
vols.sort()
for x=0 to (rows*2)
tab.boxes.get(x).delete()
col = x<rows?color.red:x>rows?color.lime:color.gray
colgrade = color.from_gradient(vols.indexof(vol.get(x)),0,vols.size(),color.new(col,80),color.new(col,40))
tab.boxes.set(x,box.new((b+left+rows*2)-vols.indexof(vol.get(x)),levels.get(i-rows+x),
(b+left+rows*2)+vols.indexof(vol.get(x)),levels.get(i-rows+x+1),
colgrade,bgcolor=colgrade,
border_style=line.style_dotted,
text=str.tostring(vol.get(x),format.volume),text_color=chart.fg_color))
if tbli
tab.lines.get(x).delete()
tab.lines.set(x,line.new(b+left,levels.get(i-rows+x),b+left+rows*2+vols.size()-1,levels.get(i-rows+x),
color=color.gray))
if tbl
tab.boxes.get(rows*2+1).delete()
tab.boxes.set(rows*2+1,box.new(b+left,box.get_top(tab.boxes.get(0)),
b+left+rows*2+vols.size()-1,box.get_bottom(tab.boxes.get(rows*2)),
color.gray,border_width=2,bgcolor=color(na)))
break
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}