本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// © juliangonzaconde
//@version=4
study("VP-Period", overlay=true, max_bars_back = 1000, max_lines_count=500)
var bool is_first_candle= true
var diff = 0.0
float maxV = 0.0
int maxV_index = 0
int last_time = 0
margin=0.0
ys=0.0
int bar_offset=0
var is_first_inRange=false
period_time = input(defval = 10,
title = "Number of days (Min: 3, Max: 500)",
type = input.integer,
minval = 3,
maxval = 500)
resolution = input(defval = 500,
title = "calculation resolution (Min: 400, Max: 700)",
type = input.integer,
minval = 400,
maxval = 700)
show_from = input(defval = 3,
title = "show support/resistance since (Min: 2, Max: 45)",
type = input.integer,
minval = 2,
maxval = 45)
show_volume_bars = input(defval = true,
title = "Show volume bars (If selected, maximum days are 17)",
type = input.bool
)
show_vpoc_line = input(defval = true,
title = "Show VPOC line",
type = input.bool
)
vpoc_color = input(defval = color.new(color.yellow, 10),
title = "VPOC color",
type = input.color
)
high_low_color = input(defval = color.new(color.blue, 50),
title = "High-low lines color",
type = input.color
)
volume_bars_color = input(defval = color.new(color.green, 70),
title = "Volume bars color",
type = input.color
)
sup_color = input(defval = color.new(color.red, 10),
title = "Support line color",
type = input.color
)
res_color = input(defval = color.new(color.green, 10),
title = "Resistance line color",
type = input.color
)
range_prices = array.new_float((resolution + 1), 0.0)
partial_vol = array.new_float(resolution, 0.0)
total_vol = array.new_float(resolution, 0.0)
var all_ys = array.new_float(show_from, 0.0)
var ys_time = array.new_float(show_from, 0.0)
var is_support = array.new_bool(show_from, true)
t = time("1440", session.regular)
var int startTime =time
int ncandles =0
if barstate.isfirst
startTime := timenow - period_time*86400000
bar_offset:= barssince(is_first_inRange)
is_first = na(t[1]) and not na(t) or t[1] < t
is_first_inRange:=is_first and t>startTime
high_price=0.0
low_price=0.0
price_level=0.0
if is_first_inRange or barstate.islast
last_time:= t[1]
ncandles := bar_offset
current_low_price=0.0
for i = 1 to (ncandles)
current_low_price:=low[i]
if current_low_price < low_price or low_price==0.0
low_price:=current_low_price
current_high_price=0.0
for i = 1 to (ncandles)
current_high_price:=high[i]
if current_high_price >high_price or high_price==0.0
high_price:=current_high_price
diff := (high_price-low_price)/resolution
for j = 0 to (resolution)
array.set(range_prices, (j), (low_price + (diff * (j+1))))
for i = 0 to (ncandles)
int w_candle = 0
array.fill(partial_vol, 0.0)
for j=0 to (resolution-1)
float current_price = array.get(range_prices, j)
if high[i] > current_price and low[i] < current_price
float j_partial_vol = array.get(partial_vol, j)
float sum_vol = j_partial_vol + nz(volume[i])
array.set(partial_vol, j, sum_vol)
w_candle := w_candle + 1
for j = 0 to (resolution - 1)
float j_total_vol = array.get(total_vol, j)
float j_partial_vol = array.get(partial_vol, j)
float sum_partial_total=0.0
if w_candle > 0
sum_partial_total := j_total_vol + j_partial_vol/w_candle
else
sum_partial_total := j_total_vol
array.set(total_vol, j, sum_partial_total)
maxV := array.max(total_vol)
maxV_index := array.indexof(total_vol, maxV)
if is_first_inRange
price_level:=diff*maxV_index+low_price
if high_price - price_level > price_level - low_price
margin:=high_price - price_level
ys:=price_level - margin
else
margin:=price_level - low_price
ys:=price_level + margin
if ys > high_price
array.shift(is_support)
array.push(is_support, false)
else
array.shift(is_support)
array.push(is_support, true)
array.shift(all_ys)
array.push(all_ys, ys)
array.shift(ys_time)
array.push(ys_time, t)
if barstate.islast
for i=0 to (show_from - 1)
ys := array.get(all_ys, i)
time_back = array.get(ys_time, i)
if array.get(is_support, i)
line.new(x1=int(time_back), y1=ys, x2=time, y2=ys, color=sup_color ,xloc= xloc.bar_time, extend = extend.none, width=2, style=line.style_dashed)
else
line.new(x1=int(time_back), y1=ys, x2=time, y2=ys, color=res_color ,xloc= xloc.bar_time, extend = extend.none, width=2, style=line.style_dashed)
label.new(int(time), ys, text ="From days: " + tostring(show_from - i), xloc=xloc.bar_time)
dif_time=0.0
if is_first_inRange or barstate.islast
last_time:= int(t[1])
dif_time:= (time-last_time)
if dif_time/86400000 > 1.5
dif_time:=(dif_time)/9
else
dif_time:=(dif_time)/3
diff_t=0
x1=0.0
norm_vol=0.0
proportion=resolution/40
for i = 0 to (resolution - 1)
y=array.get(range_prices,i)
current_vol= array.get(total_vol,i)
norm_vol :=current_vol/maxV
x1 :=dif_time*norm_vol
diff_t := last_time + int(x1)
if (i % int(proportion) == 0 or int(proportion) == 0) and show_volume_bars
line.new(x1=t[1], y1=y, x2=diff_t, y2=y, color=volume_bars_color ,xloc= xloc.bar_time, extend = extend.none, width=2)
line.new(x1=t[1], y1=low_price, x2=time, y2=low_price,xloc= xloc.bar_time, color=high_low_color)
if show_vpoc_line
line.new(x1=t[1], y1=diff*maxV_index+low_price, x2=time, y2=diff*maxV_index+low_price, color=vpoc_color, width=2,xloc= xloc.bar_time)
line.new(x1=t[1], y1=high_price, x2=time, y2=high_price,xloc= xloc.bar_time, color=high_low_color)