Volume Profile

kv4coins · study · 130 行 · 点赞 24,843 · TradingView 原页

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

Pine Script

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kv4coins
 
//@version=4
///////////////////////////////////////////////////////////////////////////////////////////////////
//// STUDY
///////////////////////////////////////////////////////////////////////////////////////////////////
study(title = "Volume Profile", shorttitle = "VP", overlay = true, precision = 4, linktoseries = true, max_bars_back = 1000)
 
///////////////////////////////////////////////////////////////////////////////////////////////////
//// INPUTS
///////////////////////////////////////////////////////////////////////////////////////////////////
vp_lookback   = input(defval = 200   , title = "Volume Lookback Depth [10-1000]", type = input.integer, minval = 10, maxval = 1000)
vp_bar_mult   = input(defval = 30    , title = "Bar Length Multiplier [10-100]" , type = input.integer, minval = 10, maxval = 100)
vp_bar_offset = input(defval = 30    , title = "Bar Horizontal Offset [0-100]"  , type = input.integer, minval = 0 , maxval = 100)
vp_bar_width  = input(defval = 4     , title = "Bar Width [1-20]"               , type = input.integer, minval = 1 , maxval = 20)
vp_poc_show   = input(defval = true  , title = "Show POC Line"                  , type = input.bool)
 
///////////////////////////////////////////////////////////////////////////////////////////////////
//// VARIABLES
///////////////////////////////////////////////////////////////////////////////////////////////////
float vp_Vmax = 0.0
int vp_VmaxId = 0
int vp_N_BARS = 55
 
var color vp_color_vp = color.new(color.gray, 60) 
var color vp_color_pk = color.new(color.orange, 60)
 
var int vp_first = time
 
vp_a_P = array.new_float((vp_N_BARS + 1), 0.0)
vp_a_V = array.new_float(vp_N_BARS, 0.0)
vp_a_D = array.new_float(vp_N_BARS, 0.0)
vp_a_W = array.new_int(vp_N_BARS, 0)
 
///////////////////////////////////////////////////////////////////////////////////////////////////
//// CALCULATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////
float vp_HH = highest(high, vp_lookback)
float vp_LL = lowest(low, vp_lookback)
 
if barstate.islast
	float vp_HL = (vp_HH - vp_LL) / vp_N_BARS
    for j = 1 to (vp_N_BARS + 1)
        array.set(vp_a_P, (j-1), (vp_LL + vp_HL * j))
	for i = 0 to (vp_lookback - 1)
		int Dc = 0
		array.fill(vp_a_D, 0.0)
		for j = 0 to (vp_N_BARS - 1)
			float Pj = array.get(vp_a_P, j)
			if low[i] < Pj and high[i] > Pj
				float Dj = array.get(vp_a_D, j)
				float dDj = Dj + nz(volume[i])
				array.set(vp_a_D, j, dDj)
				Dc := Dc + 1
		for j = 0 to (vp_N_BARS - 1)
			float Vj = array.get(vp_a_V, j)
			float Dj = array.get(vp_a_D, j)
			float dVj = Vj + ((Dc > 0) ? (Dj / Dc) : 0.0)
			array.set(vp_a_V, j, dVj)
	vp_Vmax := array.max(vp_a_V)
    vp_VmaxId := array.indexof(vp_a_V, vp_Vmax)
    for j = 0 to (vp_N_BARS - 1)
        float Vj = array.get(vp_a_V, j)
        int Aj = round(vp_bar_mult * Vj / vp_Vmax)
        array.set(vp_a_W, j, Aj)
 
///////////////////////////////////////////////////////////////////////////////////////////////////
//// PLOTING
///////////////////////////////////////////////////////////////////////////////////////////////////
var line L00 = line.new(bar_index, low, bar_index, low), var line L01 = line.new(bar_index, low, bar_index, low), 
var line L02 = line.new(bar_index, low, bar_index, low), var line L03 = line.new(bar_index, low, bar_index, low), 
var line L04 = line.new(bar_index, low, bar_index, low), var line L05 = line.new(bar_index, low, bar_index, low), 
var line L06 = line.new(bar_index, low, bar_index, low), var line L07 = line.new(bar_index, low, bar_index, low), 
var line L08 = line.new(bar_index, low, bar_index, low), var line L09 = line.new(bar_index, low, bar_index, low), 
var line L10 = line.new(bar_index, low, bar_index, low), var line L11 = line.new(bar_index, low, bar_index, low), 
var line L12 = line.new(bar_index, low, bar_index, low), var line L13 = line.new(bar_index, low, bar_index, low), 
var line L14 = line.new(bar_index, low, bar_index, low), var line L15 = line.new(bar_index, low, bar_index, low), 
var line L16 = line.new(bar_index, low, bar_index, low), var line L17 = line.new(bar_index, low, bar_index, low), 
var line L18 = line.new(bar_index, low, bar_index, low), var line L19 = line.new(bar_index, low, bar_index, low), 
var line L20 = line.new(bar_index, low, bar_index, low), var line L21 = line.new(bar_index, low, bar_index, low), 
var line L22 = line.new(bar_index, low, bar_index, low), var line L23 = line.new(bar_index, low, bar_index, low), 
var line L24 = line.new(bar_index, low, bar_index, low), var line L25 = line.new(bar_index, low, bar_index, low), 
var line L26 = line.new(bar_index, low, bar_index, low), var line L27 = line.new(bar_index, low, bar_index, low), 
var line L28 = line.new(bar_index, low, bar_index, low), var line L29 = line.new(bar_index, low, bar_index, low), 
var line L30 = line.new(bar_index, low, bar_index, low), var line L31 = line.new(bar_index, low, bar_index, low), 
var line L32 = line.new(bar_index, low, bar_index, low), var line L33 = line.new(bar_index, low, bar_index, low), 
var line L34 = line.new(bar_index, low, bar_index, low), var line L35 = line.new(bar_index, low, bar_index, low), 
var line L36 = line.new(bar_index, low, bar_index, low), var line L37 = line.new(bar_index, low, bar_index, low), 
var line L38 = line.new(bar_index, low, bar_index, low), var line L39 = line.new(bar_index, low, bar_index, low), 
var line L40 = line.new(bar_index, low, bar_index, low), var line L41 = line.new(bar_index, low, bar_index, low), 
var line L42 = line.new(bar_index, low, bar_index, low), var line L43 = line.new(bar_index, low, bar_index, low), 
var line L44 = line.new(bar_index, low, bar_index, low), var line L45 = line.new(bar_index, low, bar_index, low), 
var line L46 = line.new(bar_index, low, bar_index, low), var line L47 = line.new(bar_index, low, bar_index, low), 
var line L48 = line.new(bar_index, low, bar_index, low), var line L49 = line.new(bar_index, low, bar_index, low), 
var line L50 = line.new(bar_index, low, bar_index, low), var line L51 = line.new(bar_index, low, bar_index, low), 
var line L52 = line.new(bar_index, low, bar_index, low), var line L53 = line.new(bar_index, low, bar_index, low),
var line L54 = line.new(bar_index, low, bar_index, low)
 
if barstate.isfirst
    vp_first := time
vp_change = change(time)
vp_x_loc = timenow + round(vp_change * vp_bar_offset)
 
f_modify_bar(l, n) =>
	x1 = ((vp_VmaxId == n) and vp_poc_show) ? max(time[vp_lookback], vp_first) : 
		 (timenow + round(vp_change * (vp_bar_offset - array.get(vp_a_W, n))))
	ys = array.get(vp_a_P, n)
	line.set_xloc(id = l, x1 = x1, x2 = vp_x_loc, xloc = xloc.bar_time)
	line.set_y1(id = l, y = ys)
	line.set_y2(id = l, y = ys)
	line.set_color(id = l, color = (vp_VmaxId == n ? vp_color_pk : vp_color_vp))
	line.set_width(id = l, width = vp_bar_width)
 
if barstate.islast
	f_modify_bar(L00, 00), f_modify_bar(L01, 01), f_modify_bar(L02, 02), f_modify_bar(L03, 03), f_modify_bar(L04, 04),
	f_modify_bar(L05, 05), f_modify_bar(L06, 06), f_modify_bar(L07, 07), f_modify_bar(L08, 08), f_modify_bar(L09, 09),
	f_modify_bar(L10, 10), f_modify_bar(L11, 11), f_modify_bar(L12, 12), f_modify_bar(L13, 13), f_modify_bar(L14, 14),
	f_modify_bar(L15, 15), f_modify_bar(L16, 16), f_modify_bar(L17, 17), f_modify_bar(L18, 18), f_modify_bar(L19, 19),
	f_modify_bar(L20, 20), f_modify_bar(L21, 21), f_modify_bar(L22, 22), f_modify_bar(L23, 23), f_modify_bar(L24, 24),
	f_modify_bar(L25, 25), f_modify_bar(L26, 26), f_modify_bar(L27, 27), f_modify_bar(L28, 28), f_modify_bar(L29, 29),
	f_modify_bar(L30, 30), f_modify_bar(L31, 31), f_modify_bar(L32, 32), f_modify_bar(L33, 33), f_modify_bar(L34, 34),
	f_modify_bar(L35, 35), f_modify_bar(L36, 36), f_modify_bar(L37, 37), f_modify_bar(L38, 38), f_modify_bar(L39, 39),
	f_modify_bar(L40, 40), f_modify_bar(L41, 41), f_modify_bar(L42, 42), f_modify_bar(L43, 43), f_modify_bar(L44, 44),
	f_modify_bar(L45, 45), f_modify_bar(L46, 46), f_modify_bar(L47, 47), f_modify_bar(L48, 48), f_modify_bar(L49, 49),
	f_modify_bar(L50, 50), f_modify_bar(L51, 51), f_modify_bar(L52, 52), f_modify_bar(L53, 53), f_modify_bar(L54, 54)
 
///////////////////////////////////////////////////////////////////////////////////////////////////
//// END
///////////////////////////////////////////////////////////////////////////////////////////////////

← 返回列表