pine-script - 当 30 分钟蜡烛收盘时,每 50 美元的高点和低点创建 line.new
问题描述
整个下午,
有没有一种方法可以在每 50 美元的蜡烛关闭 30 分钟蜡烛后创建 line.new。
那么当价格通过这些线返回时被删除而不是重新创建?
我试图让它突出显示单个打印件,其中 24 小时内的价格在 30 分钟蜡烛后没有回溯。
我认为这个问题中的完整元素可能会起作用。 扩展绘图功能
//@version=4
study("Single Print", shorttitle="SP", overlay=true)
//30 min chart
Incr = input(50, "Increment(50)")
Date = input(title="Date", type=input.time, defval=timestamp("27 Jun 2021 00:00"))
Top = 0.0, Bot = 0.0
Top := time == Date? high : Top[1]
Bot := time == Date? low : Bot[1]
if time > Date
Top := high > Top[1]? high : Top[1]
Bot := low < Bot[1]? low : Bot[1]
rTop = ceil(Top/Incr) * Incr
rBot = floor(Bot/Incr) * Incr
NoLines = (rTop - rBot) / Incr
//array
a_lines = array.new_float(NoLines)
for x = 0 to NoLines -1
array.set(a_lines, x, rBot + (x * Incr))
a_used = array.new_bool(NoLines)
for x = 0 to NoLines -1
break
//Determine if line was already used
Get_Array(ArrayName,index) => value = array.get(ArrayName,index)
for i = 0 to NoLines - 1
Y = Get_Array(a_lines,i)
U = Get_Array(a_used,i)
theline = line.new(x1 = Date, y1 = Y, x2 = timenow, y2 = Y,
color=color.new(color.red, 70), width=3, extend=extend.none, xloc=xloc.bar_time)
if U
line.delete(theline)
##################更新到问题 28/06/2021#########
Bjorn 一如既往的惊艳。
我有第二个问题,我不确定它是否可以实现。
有没有办法让间隔达到整整 50 美元(也许四舍五入高点/低点)。
当一条线被创建并且价格通过该线被删除时,有没有办法在创建新的价格行为线时(在删除之后)它回顾并说如果我们正在删除一条线,请不要创建新线.
这将只留下未被价格行为回溯的区域。那有意义吗?
解决方案
可能是这样的?
//@version=4
var int max_lines = 500
study("Lines", max_lines_count=max_lines, overlay=true)
i_line_distance = input(50, "Distance between lines", input.float)
i_max_array = input(max_lines, "Max array size", input.integer, minval=max_lines, maxval=100000)
i_include_high = input(true, "Draw line at high", input.bool)
i_remove_gaps = input(true, "Remove line if price gaps over it", input.bool)
var line[] a_lines = array.new_line()
var float last_level = na
var int size_array = na
f_add_line(_level) =>
if array.size(a_lines) >= i_max_array
line.delete(array.shift(a_lines))
array.push(a_lines, line.new(bar_index-1, _level, bar_index, _level, extend=extend.right))
_level
// Create new lines
if barstate.isconfirmed[1]
lo = low[1], hi = high[1]
for level = lo to hi by i_line_distance
last_level := f_add_line(level)
if i_include_high and last_level != hi
f_add_line(hi)
// Delete touched lines
a_idx_deleted = array.new_int()
size_array := array.size(a_lines)
if size_array > 0
for i = 0 to size_array - 1
p = line.get_price(array.get(a_lines, i), bar_index)
if (p >= low and p <= high) or (i_remove_gaps and ((p >= high[1] and p <= high) or (p <= low[1] and p >= low)))
line.delete(array.get(a_lines, i))
array.push(a_idx_deleted, i) // Remember which line was deleted (for cleanup of lines array)
// Remove deleted lines from lines array
array.reverse(a_idx_deleted)
size_array := array.size(a_idx_deleted)
if size_array > 0
for i = 0 to size_array - 1
array.remove(a_lines, array.get(a_idx_deleted, i))
编辑 1以回应此评论
//@version=4
var int max_lines = 500
study("Lines", max_lines_count=max_lines, overlay=true)
i_line_distance = input(50, "Distance between lines", input.float)
i_max_array = input(max_lines, "Max array size", input.integer, minval=max_lines, maxval=100000)
i_remove_gaps = input(true, "Remove line if price gaps over it", input.bool)
var line[] a_lines = array.new_line()
var float[] a_levels_deleted = array.new_float()
var float last_level = na
var int size_array = na
f_add_line(_level) =>
if not array.includes(a_levels_deleted, _level) // Don't redraw deleted lines
if array.size(a_lines) >= i_max_array
line.delete(array.shift(a_lines))
array.push(a_lines, line.new(bar_index-1, _level, bar_index, _level, extend=extend.right))
// Create new lines
if barstate.isconfirmed[1]
// Round to interval
lo = ceil(low[1] / i_line_distance) * i_line_distance
hi = floor(high[1] / i_line_distance) * i_line_distance
for level = lo to hi by i_line_distance
f_add_line(level)
// Delete touched lines
a_idx_deleted = array.new_int()
size_array := array.size(a_lines)
if size_array > 0
for i = 0 to size_array - 1
p = line.get_price(array.get(a_lines, i), bar_index)
if (p >= low and p <= high) or (i_remove_gaps and ((p >= high[1] and p <= high) or (p <= low[1] and p >= low)))
line.delete(array.get(a_lines, i))
array.push(a_idx_deleted, i) // Remember which line was deleted (for cleanup of lines array)
array.push(a_levels_deleted, p)
// Remove deleted lines from lines array
array.reverse(a_idx_deleted)
size_array := array.size(a_idx_deleted)
if size_array > 0
for i = 0 to size_array - 1
array.remove(a_lines, array.get(a_idx_deleted, i))
编辑 2以回应此评论
//@version=4
var int max_lines = 500
study("Lines", max_lines_count=max_lines, overlay=true)
i_line_distance = input(50, "Distance between lines", input.float)
i_max_array = input(max_lines, "Max array size", input.integer, minval=max_lines, maxval=100000)
i_remove_gaps = input(true, "Remove line if price gaps over it", input.bool)
var line[] a_lines = array.new_line()
var float[] a_levels_deleted = array.new_float()
var int size_array = na
f_add_line(_level) =>
if not array.includes(a_levels_deleted, _level) // Don't redraw deleted lines
if array.size(a_lines) >= i_max_array
line.delete(array.shift(a_lines))
array.push(a_lines, line.new(bar_index-1, _level, bar_index, _level, extend=extend.right))
// Only plot last 24h
if change(dayofweek)
size_array := array.size(a_lines)
if size_array > 0
for i = 0 to size_array - 1
line.delete(array.get(a_lines, i))
array.clear(a_lines)
array.clear(a_levels_deleted)
// Create new lines
if barstate.isconfirmed[1]
// Round to interval
lo = ceil(low[1] / i_line_distance) * i_line_distance
hi = floor(high[1] / i_line_distance) * i_line_distance
for level = lo to hi by i_line_distance
f_add_line(level)
// Delete touched lines
a_idx_deleted = array.new_int()
size_array := array.size(a_lines)
if size_array > 0
for i = 0 to size_array - 1
p = line.get_price(array.get(a_lines, i), bar_index)
if (p >= low and p <= high) or (i_remove_gaps and ((p >= high[1] and p <= high) or (p <= low[1] and p >= low)))
line.delete(array.get(a_lines, i))
array.push(a_idx_deleted, i) // Remember which line was deleted (for cleanup of lines array)
array.push(a_levels_deleted, p)
// Remove deleted lines from lines array
array.reverse(a_idx_deleted)
size_array := array.size(a_idx_deleted)
if size_array > 0
for i = 0 to size_array - 1
array.remove(a_lines, array.get(a_idx_deleted, i))
编辑 3每天保持不变的线条
//@version=4
var int max_lines = 500
study("Lines", max_lines_count=max_lines, overlay=true)
i_line_distance = input(50, "Distance between lines", input.float)
i_max_array = input(max_lines, "Max array size", input.integer, minval=max_lines, maxval=100000)
i_remove_gaps = input(true, "Remove line if price gaps over it", input.bool)
var line[] a_lines = array.new_line()
var float[] a_levels_deleted = array.new_float()
var int size_array = na
f_add_line(_level) =>
if not array.includes(a_levels_deleted, _level) // Don't redraw deleted lines
if array.size(a_lines) >= i_max_array
line.delete(array.shift(a_lines))
array.push(a_lines, line.new(bar_index-1, _level, bar_index, _level, extend=extend.right))
// Keep untouched lines for each day
if change(dayofweek)
// change length of existing lines
size_array := array.size(a_lines)
if size_array > 0
for i = 0 to size_array - 1
myLine = array.get(a_lines, i)
line.set_x2(myLine, bar_index)
line.set_extend(myLine, extend.none)
array.clear(a_lines)
array.clear(a_levels_deleted)
// Create new lines
if barstate.isconfirmed[1]
// Round to interval
lo = ceil(low[1] / i_line_distance) * i_line_distance
hi = floor(high[1] / i_line_distance) * i_line_distance
for level = lo to hi by i_line_distance
f_add_line(level)
// Delete touched lines
a_idx_deleted = array.new_int()
size_array := array.size(a_lines)
if size_array > 0
for i = 0 to size_array - 1
p = line.get_price(array.get(a_lines, i), bar_index)
if (p >= low and p <= high) or (i_remove_gaps and ((p >= high[1] and p <= high) or (p <= low[1] and p >= low)))
line.delete(array.get(a_lines, i))
array.push(a_idx_deleted, i) // Remember which line was deleted (for cleanup of lines array)
array.push(a_levels_deleted, p)
// Remove deleted lines from lines array
array.reverse(a_idx_deleted)
size_array := array.size(a_idx_deleted)
if size_array > 0
for i = 0 to size_array - 1
array.remove(a_lines, array.get(a_idx_deleted, i))
推荐阅读
- html - 无论如何要使用弹性仪表板填充图表区域上的空间?每个图表区域有两个输出?
- excel - 基于标准跨多列平均数据(excel)
- ios - 为什么删除不存在的 CloudKit 记录显然会成功?
- python - 我收到此错误:“ValueError:int() 的无效文字,基数为 10:'',但它仍然有效
- arrays - 如何在 JuMP 中初始化与模型相关的空约束数组?
- docusignapi - Error calling CreateRecepientView: Unknown_envelope_Recipient
- javascript - JS - 用数组过滤数组(包括对象)
- r - 如何在 R 中没有循环的情况下快速访问列表列表中的元素?(谷歌方式包)
- snowflake-cloud-data-platform - Snowflake-如何获取现有表的sql脚本
- java - 如何在 JAR 文件中的 Jetty 服务器中启用 JSP?