本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
// https://creativecommons.org/licenses/by-nc-sa/4.0/
// © BigBeluga
//@version=6
indicator("Trading Sessions [BigBeluga]", overlay=true, max_labels_count=500, max_boxes_count = 500, max_lines_count = 500)
groupd_ = "Sessions" + " UTC+0"
tk = "Tokyoㅤㅤ " + " Time:"
lo = "Londonㅤ " + " Time:"
ny = "New York " + " Time:"
si = "Sidney " + " Time:"
// INPUTS ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
display_mid_range = input.bool(true, "Middle Range", group = "Range")
extend = input.bool(false, "Future Range", group = "Range")
show_tokyo = input.bool(true, tk, inline = "Tokyo", group = groupd_)
tk_ss = input.session("0000-0900", "", inline = "Tokyo", group = groupd_)
tokyo_color = input.color(color.rgb(0, 137, 123), "", inline = "Tokyo", group = groupd_)
show_london = input.bool(false, lo, inline = "London", group = groupd_)
lo_ss = input.session("0700-1600", "", inline = "London", group = groupd_)
london_color = input.color(#ff9900, "", inline = "London", group = groupd_)
show_ny = input.bool(true, ny, inline = "NY", group = groupd_)
ny_ss = input.session("1300-2200", "", inline = "NY", group = groupd_)
ny_color = input.color(#ff5252, "", inline = "NY", group = groupd_)
show_si = input.bool(false, si, inline = "Sidney", group = groupd_)
si_ss = input.session("2100-0600", "", inline = "Sidney", group = groupd_)
si_color = input.color(#bd52ff, "", inline = "Sidney", group = groupd_)
// }
// CALCULATIONS――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
// Function to format session string from "HHMM-HHMM" to "HH:MM-HH:MM"
formatSessionString(sessionStr) =>
// Extract start and end times
startStr = str.substring(sessionStr, 0, 4)
endStr = str.substring(sessionStr, 5, 9)
// Insert colons
formattedStart = str.format("{0}:{1}", str.substring(startStr, 0, 2), str.substring(startStr, 2, 4))
formattedEnd = str.format("{0}:{1}", str.substring(endStr, 0, 2), str.substring(endStr, 2, 4))
// Combine into final formatted string
str.format("{0}-{1}", formattedStart, formattedEnd)
in_session(i_sess) =>
t = time(timeframe.period, i_sess + ":23456", "UTC")
time == t
session_dash(dash, row, session, range_)=>
dash.cell(0,row, session, text_halign = text.align_left, text_color = chart.fg_color)
dash.cell(1,row, formatSessionString(range_), text_color = chart.fg_color)
dash.cell(2,row, in_session(range_) ? "✔" : "✖", text_color = in_session(range_) ? color.lime : color.red)
box_session(session, sessionss, display, color)=>
sessions = in_session(sessionss)
var boxx = box(na)
var mid = line(na)
// New: extended midline across session gap
var line ext_mid = na
var line ext_h = na
var line ext_l = na
var labl = label(na)
var highh = array.new<float>()
var loww = array.new<float>()
var vol = array.new<float>()
var delta = array.new<float>()
// When session changes (start of new session)
if sessions and not sessions[1]
// Clear arrays for new session
highh.clear()
loww.clear()
vol.clear()
delta.clear()
// New box and midline
boxx := box.new(bar_index, na, na, na
, bgcolor = color.new(color, 90)
, border_color = color.new(color, 50)
)
if display_mid_range
mid := line.new(bar_index, na, na, na, color = color.new(color, 30))
labl := label.new(bar_index, na
, style = label.style_label_upper_left
, color = color(na)
, textcolor = chart.fg_color
, size = size.small
, textalign = text.align_left
)
// During session, update everything
if display and sessions
highh.push(high)
loww.push(low)
vol.push(volume)
delta.push(close > open ? volume : -volume)
h = array.max(highh)
l = array.min(loww)
boxx.set_right(bar_index+1)
boxx.set_top(h)
boxx.set_bottom(l)
mid_y = (h + l) / 2
data = session + ": " + formatSessionString(sessionss) + "\n\n" + "Volume: " + str.tostring(array.sum(vol), format.volume) + "\n" + "Delta: " + str.tostring(array.sum(delta), format.volume)
if display_mid_range
mid.set_x2(bar_index+1)
mid.set_y1(mid_y)
mid.set_y2(mid_y)
labl.set_y(l)
labl.set_text(data)
if extend
if not sessions and sessions[1]
h = array.max(highh)
l = array.min(loww)
mid_y = (h + l) / 2
ext_mid := line.new(bar_index, mid_y, bar_index, mid_y, style=line.style_dashed, color=color.new(color, 30))
ext_h := line.new(bar_index, h, bar_index, h, style=line.style_dashed, color=color.new(color, 30))
ext_l := line.new(bar_index, l, bar_index, l, style=line.style_dashed, color=color.new(color, 30))
if not sessions
ext_mid.set_x2(bar_index)
ext_h.set_x2(bar_index)
ext_l.set_x2(bar_index)
// }
// PLOT ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
box_session("Tokyo", tk_ss, show_tokyo, tokyo_color)
box_session("London", lo_ss, show_london, london_color)
box_session("New York", ny_ss, show_ny, ny_color)
box_session("Sidney", si_ss, show_si, si_color)
if barstate.islast
dash = table.new(position.top_right, 10, 10, bgcolor = color.new(chart.fg_color, 90), border_color = chart.bg_color, border_width = 3)
dash.cell(0, 0, "Session", text_halign = text.align_left, text_color = chart.fg_color)
dash.cell(1, 0, "Time", text_color = chart.fg_color)
dash.cell(2, 0, "Now", text_color = chart.fg_color)
session_dash(dash, 1, "Tokyo", tk_ss)
session_dash(dash, 2, "London", lo_ss)
session_dash(dash, 3, "New York", ny_ss)
session_dash(dash, 4, "Sidney", si_ss)
// }