Sessions [LuxAlgo]

LuxAlgo · study · 703 行 · 点赞 42,226 · TradingView 原页

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

Pine Script

// 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/
// © LuxAlgo
 
//@version=5
indicator("Sessions [LuxAlgo]"
  , overlay          = true
  , max_bars_back    = 500
  , max_lines_count  = 500
  , max_boxes_count  = 500
  , max_labels_count = 500)
//------------------------------------------------------------------------------
//Settings
//-----------------------------------------------------------------------------{
//Session A
show_sesa = input(true, ''
  , inline = 'sesa'
  , group = 'Session A')
 
sesa_txt = input('New York', ''
  , inline = 'sesa'
  , group = 'Session A')
 
sesa_ses = input.session('1300-2200', ''
  , inline = 'sesa'
  , group = 'Session A')
 
sesa_css = input.color(#ff5d00, ''
  , inline = 'sesa'
  , group = 'Session A')
 
sesa_range = input(true, 'Range'
  , inline = 'sesa_overlays'
  , group = 'Session A')
 
sesa_tl = input(false, 'Trendline'
  , inline = 'sesa_overlays'
  , group = 'Session A')
 
sesa_avg = input(false, 'Mean'
  , inline = 'sesa_overlays'
  , group = 'Session A')
 
sesa_vwap = input(false, 'VWAP'
  , inline = 'sesa_overlays'
  , group = 'Session A')
 
//Session B
show_sesb = input(true, ''
  , inline = 'sesb'
  , group = 'Session B')
 
sesb_txt = input('London', ''
  , inline = 'sesb'
  , group = 'Session B')
 
sesb_ses = input.session('0700-1600', ''
  , inline = 'sesb'
  , group = 'Session B')
 
sesb_css = input.color(#2157f3, ''
  , inline = 'sesb'
  , group = 'Session B')
 
sesb_range = input(true, 'Range'
  , inline = 'sesb_overlays'
  , group = 'Session B')
 
sesb_tl = input(false, 'Trendline'
  , inline = 'sesb_overlays'
  , group = 'Session B')
 
sesb_avg = input(false, 'Mean'
  , inline = 'sesb_overlays'
  , group = 'Session B')
 
sesb_vwap = input(false, 'VWAP'
  , inline = 'sesb_overlays'
  , group = 'Session B')
 
//Session C
show_sesc = input(true, ''
  , inline = 'sesc'
  , group = 'Session C')
 
sesc_txt = input('Tokyo', ''
  , inline = 'sesc'
  , group = 'Session C')
 
sesc_ses = input.session('0000-0900', ''
  , inline = 'sesc'
  , group = 'Session C')
 
sesc_css = input.color(#e91e63, ''
  , inline = 'sesc'
  , group = 'Session C')
 
sesc_range = input(true, 'Range'
  , inline = 'sesc_overlays'
  , group = 'Session C')
 
sesc_tl = input(false, 'Trendline'
  , inline = 'sesc_overlays'
  , group = 'Session C')
 
sesc_avg = input(false, 'Mean'
  , inline = 'sesc_overlays'
  , group = 'Session C')
 
sesc_vwap = input(false, 'VWAP'
  , inline = 'sesc_overlays'
  , group = 'Session C')
 
//Session D
show_sesd = input(true, ''
  , inline = 'sesd'
  , group = 'Session D')
 
sesd_txt = input('Sydney', ''
  , inline = 'sesd'
  , group = 'Session D')
 
sesd_ses = input.session('2100-0600', ''
  , inline = 'sesd'
  , group = 'Session D')
 
sesd_css = input.color(#ffeb3b, ''
  , inline = 'sesd'
  , group = 'Session D')
 
sesd_range = input(true, 'Range'
  , inline = 'sesd_overlays'
  , group = 'Session D')
 
sesd_tl = input(false, 'Trendline'
  , inline = 'sesd_overlays'
  , group = 'Session D')
 
sesd_avg = input(false, 'Mean'
  , inline = 'sesd_overlays'
  , group = 'Session D')
 
sesd_vwap = input(false, 'VWAP'
  , inline = 'sesd_overlays'
  , group = 'Session D')
 
//Ranges Options
bg_transp = input.float(90, 'Range Area Transparency'
  , group = 'Ranges Settings')
 
show_outline = input(true, 'Range Outline'
  , group = 'Ranges Settings')
 
show_txt = input(true, 'Range Label'
  , group = 'Ranges Settings')
 
//Dashboard
show_dash = input(true, 'Show Dashboard'
  , group   = 'Dashboard')
 
advanced_dash = input(true, 'Advanced Dashboard'
  , group = 'Dashboard')
 
dash_loc = input.string('Top Right', 'Dashboard Location'
  , options = ['Top Right', 'Bottom Right', 'Bottom Left']
  , group   = 'Dashboard')
  
text_size = input.string('Small', 'Dashboard Size'
  , options = ['Tiny', 'Small', 'Normal']
  , group   = 'Dashboard')
 
//Divider
show_ses_div = input(true, 'Show Sessions Divider'
  , group = 'Dividers')
 
show_day_div = input(true, 'Show Daily Divider'
  , group = 'Dividers')
 
//-----------------------------------------------------------------------------}
//Functions
//-----------------------------------------------------------------------------{
n = bar_index
 
//Get session average
get_avg(session)=>
    var len = 1
    var float csma = na
    var float sma = na
 
    if session > session[1]
        len := 1
        csma := close
    
    if session and session == session[1]
        len += 1    
        csma += close
        sma := csma / len
    
    sma
 
//Get trendline coordinates
get_linreg(session)=>
    var len = 1
    var float cwma  = na
    var float csma  = na
    var float csma2 = na
 
    var float y1 = na
    var float y2 = na
    var float stdev = na 
    var float r2    = na 
 
    if session > session[1]
        len   := 1
        cwma  := close
        csma  := close
        csma2 := close * close
    
    if session and session == session[1]
        len   += 1    
        csma  += close
        csma2 += close * close
        cwma  += close * len
 
        sma = csma / len
        wma = cwma / (len * (len + 1) / 2)
 
        cov   = (wma - sma) * (len+1)/2
        stdev := math.sqrt(csma2 / len - sma * sma)
        r2    := cov / (stdev * (math.sqrt(len*len - 1) / (2 * math.sqrt(3))))
 
        y1 := 4 * sma - 3 * wma
        y2 := 3 * wma - 2 * sma
 
    [y1 , y2, stdev, r2]
 
//Session Vwap
get_vwap(session) =>
    var float num = na
    var float den = na
 
    if session > session[1]
        num := close * volume
        den := volume
    
    else if session and session == session[1]
        num += close * volume
        den += volume
    else
        num := na
 
    [num, den]
 
//Set line
set_line(session, y1, y2, session_css)=>
    var line tl = na
 
    if session > session[1]
        tl := line.new(n, close, n, close, color = session_css)
 
    if session and session == session[1]
        line.set_y1(tl, y1)
        line.set_xy2(tl, n, y2)
 
//Set session range
get_range(session, session_name, session_css)=>
    var t = 0 
    var max = high
    var min = low
    var box bx = na
    var label lbl = na 
    
    if session > session[1]
        t := time
        max := high
        min := low
 
        bx := box.new(n, max, n, min
          , bgcolor = color.new(session_css, bg_transp)
          , border_color = show_outline ? session_css : na
          , border_style = line.style_dotted)
 
        if show_txt
            lbl := label.new(t, max, session_name
              , xloc = xloc.bar_time
              , textcolor = session_css
              , style = label.style_label_down
              , color = color.new(color.white, 100)
              , size = size.tiny)
 
    if session and session == session[1]
        max := math.max(high, max)
        min := math.min(low, min)
 
        box.set_top(bx, max)
        box.set_rightbottom(bx, n, min)
 
        if show_txt
            label.set_xy(lbl, int(math.avg(t, time)), max)
 
//-----------------------------------------------------------------------------}
//Sessions
//-----------------------------------------------------------------------------{
tf = timeframe.period
 
is_sesa = math.sign(nz(time(tf, sesa_ses, 'UTC')))
is_sesb = math.sign(nz(time(tf, sesb_ses, 'UTC')))
is_sesc = math.sign(nz(time(tf, sesc_ses, 'UTC')))
is_sesd = math.sign(nz(time(tf, sesd_ses, 'UTC')))
 
//-----------------------------------------------------------------------------}
//Dashboard
//-----------------------------------------------------------------------------{
var table_position = dash_loc == 'Bottom Left' ? position.bottom_left 
  : dash_loc == 'Top Right' ? position.top_right 
  : position.bottom_right
 
var table_size = text_size == 'Tiny' ? size.tiny 
  : text_size == 'Small' ? size.small 
  : size.normal
 
var tb = table.new(table_position, 5, 5
  , bgcolor = #1e222d
  , border_color = #373a46
  , border_width = 1
  , frame_color = #373a46
  , frame_width = 1)
 
if barstate.isfirst and show_dash
    table.cell(tb, 0, 1, sesa_txt, text_color = sesa_css, text_size = table_size)
    table.cell(tb, 0, 2, sesb_txt, text_color = sesb_css, text_size = table_size)
    table.cell(tb, 0, 3, sesc_txt, text_color = sesc_css, text_size = table_size)
    table.cell(tb, 0, 4, sesd_txt, text_color = sesd_css, text_size = table_size)
 
    if advanced_dash
        table.cell(tb, 0, 0, 'Session', text_color = color.white
          , text_size = table_size)
        
        table.cell(tb, 1, 0, 'Status', text_color = color.white
          , text_size = table_size)
        
        table.cell(tb, 2, 0, 'Trend', text_color = color.white
          , text_size = table_size)
        
        table.cell(tb, 3, 0, 'Volume', text_color = color.white
          , text_size = table_size)
        
        table.cell(tb, 4, 0, 'σ', text_color = color.white
          , text_size = table_size)
 
if barstate.islast and show_dash
    table.cell(tb, 1, 1, is_sesa ? 'Active' : 'Innactive'
      , bgcolor = is_sesa ? #089981 : #f23645
      , text_color = color.white
      , text_size = table_size)
    
    table.cell(tb, 1, 2, is_sesb ? 'Active' : 'Innactive'
      , bgcolor = is_sesb ? #089981 : #f23645
      , text_color = color.white
      , text_size = table_size)
    
    table.cell(tb, 1, 3, is_sesc ? 'Active' : 'Innactive'
      , bgcolor = is_sesc ? #089981 : #f23645
      , text_color = color.white
      , text_size = table_size)
    
    table.cell(tb, 1, 4, is_sesd ? 'Active' : 'Innactive'
      , bgcolor = is_sesd ? #089981 : #f23645
      , text_color = color.white
      , text_size = table_size)
 
//-----------------------------------------------------------------------------}
//Overlays
//-----------------------------------------------------------------------------{
//Ranges
if show_sesa and sesa_range
    get_range(is_sesa, sesa_txt, sesa_css)
 
if show_sesb and sesb_range
    get_range(is_sesb, sesb_txt, sesb_css)
 
if show_sesc and sesc_range
    get_range(is_sesc, sesc_txt, sesc_css)
 
if show_sesd and sesd_range
    get_range(is_sesd, sesd_txt, sesd_css)
 
//Trendlines
if show_sesa and (sesa_tl or advanced_dash)
    [y1, y2, stdev, r2] = get_linreg(is_sesa)
 
    if advanced_dash
        table.cell(tb, 2, 1, str.tostring(r2, '#.##')
          , bgcolor = r2 > 0 ? #089981 : #f23645
          , text_color = color.white
          , text_size = table_size)
        
        table.cell(tb, 4, 1, str.tostring(stdev, '#.####')
          , text_color = color.white
          , text_size = table_size)
        
    if sesa_tl
        set_line(is_sesa, y1, y2, sesa_css)
 
if show_sesb and (sesb_tl or advanced_dash)
    [y1, y2, stdev, r2] = get_linreg(is_sesb)
    
    if advanced_dash
        table.cell(tb, 2, 2, str.tostring(r2, '#.##')
          , bgcolor = r2 > 0 ? #089981 : #f23645
          , text_color = color.white
          , text_size = table_size)
 
        table.cell(tb, 4, 2, str.tostring(stdev, '#.####')
          , text_color = color.white
          , text_size = table_size)
        
    if sesb_tl
        set_line(is_sesb, y1, y2, sesb_css)
 
if show_sesc and (sesc_tl or advanced_dash)
    [y1, y2, stdev, r2] = get_linreg(is_sesc)
    
    if advanced_dash
        table.cell(tb, 2, 3, str.tostring(r2, '#.##')
          , bgcolor = r2 > 0 ? #089981 : #f23645
          , text_color = color.white
          , text_size = table_size)
 
        table.cell(tb, 4, 3, str.tostring(stdev, '#.####')
          , text_color = color.white
          , text_size = table_size)
        
    if sesc_tl
        set_line(is_sesc, y1, y2, sesc_css)
 
if show_sesd and (sesd_tl or advanced_dash)
    [y1, y2, stdev, r2] = get_linreg(is_sesd)
    
    if advanced_dash
        table.cell(tb, 2, 4, str.tostring(r2, '#.##')
          , bgcolor = r2 > 0 ? #089981 : #f23645
          , text_color = color.white
          , text_size = table_size)
        
        table.cell(tb, 4, 4, str.tostring(stdev, '#.####')
          , text_color = color.white
          , text_size = table_size)
        
    if sesd_tl
        set_line(is_sesd, y1, y2, sesd_css)
 
//Mean
if show_sesa and sesa_avg
    avg = get_avg(is_sesa)
    set_line(is_sesa, avg, avg, sesa_css)
 
if show_sesb and sesb_avg
    avg = get_avg(is_sesb)
    set_line(is_sesb, avg, avg, sesb_css)
 
if show_sesc and sesc_avg
    avg = get_avg(is_sesc)
    set_line(is_sesc, avg, avg, sesc_css)
 
if show_sesd and sesd_avg
    avg = get_avg(is_sesd)
    set_line(is_sesd, avg, avg, sesd_css)
 
//VWAP
var float vwap_a = na
var float vwap_b = na
var float vwap_c = na
var float vwap_d = na
 
if show_sesa and (sesa_vwap or advanced_dash)
    [num, den] = get_vwap(is_sesa)
 
    if sesa_vwap
        vwap_a := num / den
 
    if advanced_dash
        table.cell(tb, 3, 1, str.tostring(den, format.volume)
          , text_color = color.white
          , text_size = table_size)
 
if show_sesb and (sesb_vwap or advanced_dash)
    [num, den] = get_vwap(is_sesb)
 
    if sesb_vwap
        vwap_b := num / den
 
    if advanced_dash
        table.cell(tb, 3, 2, str.tostring(den, format.volume)
          , text_color = color.white
          , text_size = table_size)
 
if show_sesc and (sesc_vwap or advanced_dash)
    [num, den] = get_vwap(is_sesc)
 
    if sesc_vwap
        vwap_c := num / den
 
    if advanced_dash
        table.cell(tb, 3, 3, str.tostring(den, format.volume)
          , text_color = color.white
          , text_size = table_size)
 
if show_sesd and (sesd_vwap or advanced_dash)
    [num, den] = get_vwap(is_sesd)
 
    if sesd_vwap
        vwap_d := num / den
 
    if advanced_dash
        table.cell(tb, 3, 4, str.tostring(den, format.volume)
          , text_color = color.white
          , text_size = table_size)
 
//Plot vwaps
plot(vwap_a, 'Session A VWAP', sesa_css, 1, plot.style_linebr)
plot(vwap_b, 'Session B VWAP', sesb_css, 1, plot.style_linebr)
plot(vwap_c, 'Session C VWAP', sesc_css, 1, plot.style_linebr)
plot(vwap_d, 'Session D VWAP', sesd_css, 1, plot.style_linebr)
 
//-----------------------------------------------------------------------------}
//Plots session dividers
//-----------------------------------------------------------------------------{
//Plot Divider A
plotshape(is_sesa and show_ses_div and show_sesa, "·"
  , shape.square
  , location.bottom
  , na
  , text = "."
  , textcolor = sesa_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(is_sesa != is_sesa[1] and show_ses_div and show_sesa, "NYE"
  , shape.labelup
  , location.bottom
  , na
  , text = "❚"
  , textcolor = sesa_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
//Plot Divider B
plotshape(is_sesb and show_ses_div and show_sesb, "·"
  , shape.labelup
  , location.bottom
  , na
  , text = "."
  , textcolor = sesb_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(is_sesb != is_sesb[1] and show_ses_div and show_sesb, "LDN"
  , shape.labelup
  , location.bottom
  , na
  , text = "❚"
  , textcolor = sesb_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
//Plot Divider C
plotshape(is_sesc and show_ses_div and show_sesc, "·"
  , shape.square
  , location.bottom
  , na
  , text = "."
  , textcolor = sesc_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(is_sesc != is_sesc[1] and show_ses_div and show_sesc, "TYO"
  , shape.labelup
  , location.bottom
  , na
  , text = "❚"
  , textcolor = sesc_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
//Plot Divider D
plotshape(is_sesd and show_ses_div and show_sesd, "·"
  , shape.labelup
  , location.bottom
  , na
  , text = "."
  , textcolor = sesd_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(is_sesd != is_sesd[1] and show_ses_div and show_sesd, "SYD"
  , shape.labelup
  , location.bottom
  , na
  , text = "❚"
  , textcolor = sesd_css
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
//-----------------------------------------------------------------------------}
//Plots daily dividers
//-----------------------------------------------------------------------------{
day = dayofweek
 
if day != day[1] and show_day_div
    line.new(n, close + syminfo.mintick, n, close - syminfo.mintick
      , color  = color.gray
      , extend = extend.both
      , style  = line.style_dashed)
 
plotshape(day != day[1] and day == 1 and show_day_div, "Sunday"
  , shape.labeldown
  , location.top
  , na
  , text = "Sunday"
  , textcolor = color.gray
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(day != day[1] and day == 2 and show_day_div, "Monday"
  , shape.labeldown
  , location.top
  , na
  , text = "Monday"
  , textcolor = color.gray
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(day != day[1] and day == 3 and show_day_div, "Tuesday"
  , shape.labeldown
  , location.top
  , na
  , text = "Tuesday"
  , textcolor = color.gray
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(day != day[1] and day == 4 and show_day_div, "Wednesay"
  , shape.labeldown
  , location.top
  , na
  , text = "Wednesday"
  , textcolor = color.gray
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(day != day[1] and day == 5 and show_day_div, "Thursday"
  , shape.labeldown
  , location.top
  , na
  , text = "Thursday"
  , textcolor = color.gray
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(day != day[1] and day == 6 and show_day_div, "Friday"
  , shape.labeldown
  , location.top
  , na
  , text = "Friday"
  , textcolor = color.gray
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
plotshape(day != day[1] and day == 7 and show_day_div, "Saturday"
  , shape.labeldown
  , location.top
  , na
  , text = "Saturday"
  , textcolor = color.gray
  , size = size.tiny
  , display = display.all - display.status_line
  , editable = false)
 
//-----------------------------------------------------------------------------}
//LuxAlgo
//-----------------------------------------------------------------------------{
var watermark = table.new(position.bottom_left, 1, 1)
 
if barstate.isfirst
    table.cell(watermark, 0, 0, '@LuxAlgo'
      , text_color = chart.fg_color
      , text_size = size.normal)
      
//-----------------------------------------------------------------------------}

← 返回列表