Indicator · Pine Script v5 · On the chart

Time Based Retracement - Stats

by TamaraKGreen· code credited to notprofessorgreen

This indicator tracks and projects session-based price retracement levels directly onto the main price chart.

View on GitHub

GitHub stars46on the repository
Pine versionv5runs as is
Lines of code297
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update7 weeks ago4 Sep 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

297 lines of Pine Script v5 from Time based level retracement - stats.txt, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

Time based level retracement - stats.txt
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © notprofessorgreen

//@version=5
indicator("Time based retracement - stats", "Retracement", true, max_lines_count = 500)

get_line_type(string style) =>
    result = switch style
        'Solid' => line.style_solid
        'Dotted' => line.style_dotted
        'Dashed' => line.style_dashed
    result


// Level 1
open_time_1 = input.session("0000-0001", "Open time Level 1", group="Level 1")
ret_time_1 = input.session("0800-1600", "Retracement during Level 1", group="Level 1")
ret_pct_1 = input.int(50, "Retracement % Level 1", group="Level 1")
ret_pc_col_1 = input.color(color.rgb(98, 1, 255), 'Retracement % color Level 1', group="Level 1")
open_col_1 = input.color(color.rgb(98, 1, 255), 'Open time color Level 1', group="Level 1")
show_1 = input.bool(true, 'Show level 1 plots on the chart', group = 'Level 1')
style_1 = get_line_type(input.string("Dotted", "Target retracement line style", options = ['Solid','Dashed','Dotted'], group = 'Level 1'))

// Level 2
open_time_2 = input.session("0100-0101", "Open time Level 2", group="Level 2")
ret_time_2 = input.session("0800-1600", "Retracement during Level 2", group="Level 2")
ret_pct_2 = input.int(50, "Retracement % Level 2", group="Level 2")
ret_pc_col_2 = input.color(color.rgb(195, 0, 255), 'Retracement % color Level 2', group="Level 2")
open_col_2 = input.color(color.rgb(195, 0, 255), 'Open time color Level 2', group="Level 2")
show_2 = input.bool(true, 'Show level 2 plots on the chart', group = 'Level 2')
style_2 = get_line_type(input.string("Dotted", "Target retracement line style", options = ['Solid','Dashed','Dotted'], group = 'Level 2'))


// Level 3
open_time_3 = input.session("0300-0301", "Open time Level 3", group="Level 3")
ret_time_3 = input.session("0800-1600", "Retracement during Level 3", group="Level 3")
ret_pct_3 = input.int(50, "Retracement % Level 3", group="Level 3")
ret_pc_col_3 = input.color(color.rgb(255, 0, 221), 'Retracement % color Level 3', group="Level 3")
open_col_3 = input.color(color.rgb(255, 0, 221), 'Open time color Level 3', group="Level 3")
show_3 = input.bool(true, 'Show level 3 plots on the chart', group = 'Level 3')
style_3 = get_line_type(input.string("Dotted", "Target retracement line style", options = ['Solid','Dashed','Dotted'], group = 'Level 3'))



// Level 4
open_time_4 = input.session("0400-0401", "Open time Level 4", group="Level 4")
ret_time_4 = input.session("0800-1600", "Retracement during Level 4", group="Level 4")
ret_pct_4 = input.int(50, "Retracement % Level 4", group="Level 4")
ret_pc_col_4 = input.color(color.rgb(0, 4, 255), 'Retracement % color Level 4', group="Level 4")
open_col_4 = input.color(color.rgb(0, 4, 255), 'Open time color Level 4', group="Level 4")
show_4 = input.bool(true, 'Show level 4 plots on the chart', group = 'Level 4')
style_4 = get_line_type(input.string("Dotted", "Target retracement line style", options = ['Solid','Dashed','Dotted'], group = 'Level 4'))


// Level 5
open_time_5 = input.session("0700-0501", "Open time Level 5", group="Level 5")
ret_time_5 = input.session("0800-1600", "Retracement during Level 5", group="Level 5")
ret_pct_5 = input.int(50, "Retracement % Level 5", group="Level 5")
ret_pc_col_5 = input.color(color.rgb(0, 183, 255), 'Retracement % color Level 5', group="Level 5")
open_col_5 = input.color(color.rgb(0, 183, 255), 'Open time color Level 5', group="Level 5")
show_5 = input.bool(true, 'Show level 5 plots on the chart', group = 'Level 5')
style_5 = get_line_type(input.string("Dotted", "Target retracement line style", options = ['Solid','Dashed','Dotted'], group = 'Level 5'))


// Time checks for each level
t1 = not na(time("", open_time_1, "America/New_York"))
t2 = not na(time("", open_time_2, "America/New_York"))
t3 = not na(time("", open_time_3, "America/New_York"))
t4 = not na(time("", open_time_4, "America/New_York"))
t5 = not na(time("", open_time_5, "America/New_York"))
ret_t_1 = not na(time("", ret_time_1, "America/New_York"))
ret_t_2 = not na(time("", ret_time_2, "America/New_York"))
ret_t_3 = not na(time("", ret_time_3, "America/New_York"))
ret_t_4 = not na(time("", ret_time_4, "America/New_York"))
ret_t_5 = not na(time("", ret_time_5, "America/New_York"))

// Struct for tracking retracement stats
type tracking
    float[] ret_distance
    line open_line
    line ret_open_line
    line ret_line
    float open_price
    float ret_price
    bool returned = false
    int count_returned = 0
    int count_sessions = 0

// Create tracking instances for both levels
var track_1 = tracking.new(array.new_float())
var track_2 = tracking.new(array.new_float())
var track_3 = tracking.new(array.new_float())
var track_4 = tracking.new(array.new_float())
var track_5 = tracking.new(array.new_float())

// Open price logic for each level
if t1 and not t1[1]
    track_1.open_price := open
    track_1.returned := false
    track_1.ret_price := na
    track_1.count_sessions += 1
    if show_1
        track_1.open_line := line.new(time, open, time+timeframe.in_seconds("D")*1000, open, xloc=xloc.bar_time, color=open_col_1, style = style_1, width=2)

if t2 and not t2[1]
    track_2.open_price := open
    track_2.returned := false
    track_2.ret_price := na
    track_2.count_sessions += 1
    if show_2
        track_2.open_line := line.new(time, open, time+timeframe.in_seconds("D")*1000, open, xloc=xloc.bar_time, color=open_col_2, style = style_2, width=2)

if t3 and not t3[1]
    track_3.open_price := open
    track_3.returned := false
    track_3.ret_price := na
    track_3.count_sessions += 1
    if show_3
        track_3.open_line := line.new(time, open, time+timeframe.in_seconds("D")*1000, open, xloc=xloc.bar_time, color=open_col_3, style = style_3, width=2)

if t4 and not t4[1]
    track_4.open_price := open
    track_4.returned := false
    track_4.ret_price := na
    track_4.count_sessions += 1
    if show_4
        track_4.open_line := line.new(time, open, time+timeframe.in_seconds("D")*1000, open, xloc=xloc.bar_time, color=open_col_4, style = style_4, width=2)

if t5 and not t5[1]
    track_5.open_price := open
    track_5.returned := false
    track_5.ret_price := na
    track_5.count_sessions += 1
    if show_5
        track_5.open_line := line.new(time, open, time+timeframe.in_seconds("D")*1000, open, xloc=xloc.bar_time, color=open_col_5, style = style_5, width=2)

// Retracement logic for each level
if ret_t_1
    if not ret_t_1[1]
        offset1 = math.abs(open - track_1.open_price) * ret_pct_1 / 100
        above1 = open > track_1.open_price
        track_1.ret_price := above1 ? (open - offset1) : (open + offset1)
        track_1.ret_distance.unshift(offset1)
        if show_1
            track_1.ret_open_line := line.new(time, open, time + timeframe.in_seconds("D") * 1000, open, xloc=xloc.bar_time, color=open_col_1, width=2)
            track_1.ret_line := line.new(time, track_1.ret_price, time + timeframe.in_seconds("D") * 1000, track_1.ret_price, xloc=xloc.bar_time, color=ret_pc_col_1, width=2, style = style_1)
    if not track_1.returned and high >= track_1.ret_price and low <= track_1.ret_price
        track_1.returned := true
        track_1.count_returned += 1

if ret_t_2
    if not ret_t_2[1]
        offset2 = math.abs(open - track_2.open_price) * ret_pct_2 / 100
        above2 = open > track_2.open_price
        track_2.ret_price := above2 ? (open - offset2) : (open + offset2)
        track_2.ret_distance.unshift(offset2)
        if show_2
            track_2.ret_open_line := line.new(time, open, time + timeframe.in_seconds("D") * 1000, open, xloc=xloc.bar_time, color=open_col_2, width=2)
            track_2.ret_line := line.new(time, track_2.ret_price, time + timeframe.in_seconds("D") * 1000, track_2.ret_price, xloc=xloc.bar_time, color=ret_pc_col_2, width=2, style = style_2)
    if not track_2.returned and high >= track_2.ret_price and low <= track_2.ret_price
        track_2.returned := true
        track_2.count_returned += 1

if ret_t_3
    if not ret_t_3[1]
        offset3 = math.abs(open - track_3.open_price) * ret_pct_3 / 100
        above3 = open > track_3.open_price
        track_3.ret_price := above3 ? (open - offset3) : (open + offset3)
        track_3.ret_distance.unshift(offset3)
        if show_3
            track_3.ret_open_line := line.new(time, open, time + timeframe.in_seconds("D") * 1000, open, xloc=xloc.bar_time, color=open_col_3, width=2)
            track_3.ret_line := line.new(time, track_3.ret_price, time + timeframe.in_seconds("D") * 1000, track_3.ret_price, xloc=xloc.bar_time, color=ret_pc_col_3, width=2, style = style_3)
    if not track_3.returned and high >= track_3.ret_price and low <= track_3.ret_price
        track_3.returned := true
        track_3.count_returned += 1

if ret_t_4
    if not ret_t_4[1]
        offset4 = math.abs(open - track_4.open_price) * ret_pct_4 / 100
        above4 = open > track_4.open_price
        track_4.ret_price := above4 ? (open - offset4) : (open + offset4)
        track_4.ret_distance.unshift(offset4)
        if show_4
            track_4.ret_open_line := line.new(time, open, time + timeframe.in_seconds("D") * 1000, open, xloc=xloc.bar_time, color=open_col_4, width=2)
            track_4.ret_line := line.new(time, track_4.ret_price, time + timeframe.in_seconds("D") * 1000, track_4.ret_price, xloc=xloc.bar_time, color=ret_pc_col_4, width=2, style = style_4)
    if not track_4.returned and high >= track_4.ret_price and low <= track_4.ret_price
        track_4.returned := true
        track_4.count_returned += 1

if ret_t_5
    if not ret_t_5[1]
        offset5 = math.abs(open - track_5.open_price) * ret_pct_5 / 100
        above5 = open > track_5.open_price
        track_5.ret_price := above5 ? (open - offset5) : (open + offset5)
        track_5.ret_distance.unshift(offset5)
        if show_5
            track_5.ret_open_line := line.new(time, open, time + timeframe.in_seconds("D") * 1000, open, xloc=xloc.bar_time, color=open_col_5, width=2)
            track_5.ret_line := line.new(time, track_5.ret_price, time + timeframe.in_seconds("D") * 1000, track_5.ret_price, xloc=xloc.bar_time, color=ret_pc_col_5, width=2, style = style_5)
    if not track_5.returned and high >= track_5.ret_price and low <= track_5.ret_price
        track_5.returned := true
        track_5.count_returned += 1

// Table setup for both levels
tablePosition = input.string("top_center", title="Table Position", options=["top_left", "top_center", "top_right", "middle_left", "middle_center", "middle_right", "bottom_left", "bottom_center", "bottom_right"])
tableTextSize = input.string("small", title="Text Size", options=["tiny", "small", "normal", "large"])
text_color = input.color(color.white, title="Text color")
bd_color = input.color(color.teal, title="Border color")
bg_color = input.color(color.rgb(40, 40, 40), title="Background color")
fr_color = input.color(color.teal, title="Frame color")

getTablePosition(positionStr) =>
    switch positionStr
        "top_left" => position.top_left
        "top_center" => position.top_center
        "top_right" => position.top_right
        "middle_left" => position.middle_left
        "middle_center" => position.middle_center
        "middle_right" => position.middle_right
        "bottom_left" => position.bottom_left
        "bottom_center" => position.bottom_center
        "bottom_right" => position.bottom_right

getTableTextSize(sizeStr) =>
    switch sizeStr
        "tiny" => size.tiny
        "small" => size.small
        "normal" => size.normal
        "large" => size.large

tablePositionValue = getTablePosition(tablePosition)
tableTextSizeValue = getTableTextSize(tableTextSize)

level1_label = str.tostring(open_time_1)
level2_label = str.tostring(open_time_2)
level3_label = str.tostring(open_time_3)
level4_label = str.tostring(open_time_4)
level5_label = str.tostring(open_time_5)
retracement_time_1 = str.tostring(ret_time_1)
retracement_time_2 = str.tostring(ret_time_2)
retracement_time_3 = str.tostring(ret_time_3)
retracement_time_4 = str.tostring(ret_time_4)
retracement_time_5 = str.tostring(ret_time_5)

if barstate.islast
    var tbl = table.new(tablePositionValue, 10, 10, bgcolor=bg_color, frame_color=fr_color, frame_width=2, border_color=bd_color, border_width=1, force_overlay=true)

    // Column headers
    table.cell(tbl, 0, 0, 'Session\nfor retracement\nto occur', text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 1, 0, 'Time of level\nretracing to', text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 2, 0, "Avgerage distance\nfrom open\nto target", text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 3, 0, "Sample size", text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 4, 0, "Targeted\nretracement %", text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 5, 0, "Successful retracements", text_color=text_color, text_size = tableTextSizeValue)

    // Row for Level 1
    table.cell(tbl, 2, 1, str.format("{0,number,#.#}", track_1.ret_distance.avg()), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 3, 1, str.format("{0,number,#}", track_1.count_sessions), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 4, 1, str.format("{0,number,percent}", ret_pct_1 / 100), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 5, 1, str.format("{0,number,percent}", track_1.count_returned / track_1.count_sessions), text_color=text_color, text_size = tableTextSizeValue)

    // Row for Level 2
    table.cell(tbl, 2, 2, str.format("{0,number,#.#}", track_2.ret_distance.avg()), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 3, 2, str.format("{0,number,#}", track_2.count_sessions), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 4, 2, str.format("{0,number,percent}", ret_pct_2 / 100), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 5, 2, str.format("{0,number,percent}", track_2.count_returned / track_2.count_sessions), text_color=text_color, text_size = tableTextSizeValue)

    // Row for Level 3
    table.cell(tbl, 2, 3, str.format("{0,number,#.#}", track_3.ret_distance.avg()), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 3, 3, str.format("{0,number,#}", track_3.count_sessions), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 4, 3, str.format("{0,number,percent}", ret_pct_3 / 100), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 5, 3, str.format("{0,number,percent}", track_3.count_returned / track_3.count_sessions), text_color=text_color, text_size = tableTextSizeValue)

    // Row for Level 4
    table.cell(tbl, 2, 4, str.format("{0,number,#.#}", track_4.ret_distance.avg()), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 3, 4, str.format("{0,number,#}", track_4.count_sessions), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 4, 4, str.format("{0,number,percent}", ret_pct_4 / 100), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 5, 4, str.format("{0,number,percent}", track_4.count_returned / track_4.count_sessions), text_color=text_color, text_size = tableTextSizeValue)

    // Row for Level 5
    table.cell(tbl, 2, 5, str.format("{0,number,#.#}", track_5.ret_distance.avg()), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 3, 5, str.format("{0,number,#}", track_5.count_sessions), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 4, 5, str.format("{0,number,percent}", ret_pct_5 / 100), text_color=text_color, text_size = tableTextSizeValue)
    table.cell(tbl, 5, 5, str.format("{0,number,percent}", track_5.count_returned / track_5.count_sessions), text_color=text_color, text_size = tableTextSizeValue)

    // Row titles

    table.cell(tbl, 1, 1, level1_label, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 1, 2, level2_label, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 1, 3, level3_label, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 1, 4, level4_label, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 1, 5, level5_label, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)

    table.cell(tbl, 0, 1, retracement_time_1, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 0, 2, retracement_time_2, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 0, 3, retracement_time_3, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 0, 4, retracement_time_4, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)
    table.cell(tbl, 0, 5, retracement_time_5, text_color=text_color, bgcolor=bg_color, text_size = tableTextSizeValue)

Overview

Users can configure up to five distinct time sessions alongside specific evaluation windows to measure price retracement targets calculated from open price levels. Input settings allow full customization of open time sessions, evaluation timeframes, target retracement percentages, line styles, and individual visual colors for each defined level.

Details

Published by

TamaraKGreen on GitHub

Code credit

notprofessorgreen, as written in the script's header

Type

Indicator, Pine Script v5

Draws

On the price chart

Category

Sessions & time, Support & resistance

Markets

Any symbol

Timeframes

M1-M5, M15-H1

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Open time Level 1session0000-0001open_time_1
Retracement during Level 1session0800-1600ret_time_1
Retracement % Level 1int50ret_pct_1
Retracement % color Level 1colorcolor.rgb(98, 1, 255)ret_pc_col_1
Open time color Level 1colorcolor.rgb(98, 1, 255)open_col_1
Show level 1 plots on the chartbooltrueshow_1
Target retracement line stylestringDottedTarget retracement line style
Open time Level 2session0100-0101open_time_2
Retracement during Level 2session0800-1600ret_time_2
Retracement % Level 2int50ret_pct_2
Retracement % color Level 2colorcolor.rgb(195, 0, 255)ret_pc_col_2
Open time color Level 2colorcolor.rgb(195, 0, 255)open_col_2
Show all 40 settings
SettingTypeDefaultVariable
Show level 2 plots on the chartbooltrueshow_2
Target retracement line stylestringDottedTarget retracement line style
Open time Level 3session0300-0301open_time_3
Retracement during Level 3session0800-1600ret_time_3
Retracement % Level 3int50ret_pct_3
Retracement % color Level 3colorcolor.rgb(255, 0, 221)ret_pc_col_3
Open time color Level 3colorcolor.rgb(255, 0, 221)open_col_3
Show level 3 plots on the chartbooltrueshow_3
Target retracement line stylestringDottedTarget retracement line style
Open time Level 4session0400-0401open_time_4
Retracement during Level 4session0800-1600ret_time_4
Retracement % Level 4int50ret_pct_4
Retracement % color Level 4colorcolor.rgb(0, 4, 255)ret_pc_col_4
Open time color Level 4colorcolor.rgb(0, 4, 255)open_col_4
Show level 4 plots on the chartbooltrueshow_4
Target retracement line stylestringDottedTarget retracement line style
Open time Level 5session0700-0501open_time_5
Retracement during Level 5session0800-1600ret_time_5
Retracement % Level 5int50ret_pct_5
Retracement % color Level 5colorcolor.rgb(0, 183, 255)ret_pc_col_5
Open time color Level 5colorcolor.rgb(0, 183, 255)open_col_5
Show level 5 plots on the chartbooltrueshow_5
Target retracement line stylestringDottedTarget retracement line style
Table Positionstringtop_centertablePosition
Text SizestringsmalltableTextSize
Text colorcolorcolor.whitetext_color
Border colorcolorcolor.tealbd_color
Background colorcolorcolor.rgb(40, 40, 40)bg_color
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

575 stars

This indicator builds Market Profile Time Price Opportunity (TPO) structures across defined session timeframes directly on the main price chart. It visualizes the Point of Control (POC) and Value Area boundaries using dynamic box drawings. An integrated multi-

Indicator v5 Support & resistanceScreeners & dashboards
Updated 1 year ago · MPL-2.0 GitHub repository of Market Profile with Screener
257 stars

This indicator plots auto trade signals for E-mini S&P 500 futures on the price chart. It computes an EMA200 filter along with day ETH RTH session levels and percentage-based entry zones. Signals trigger CALL or PUT cases when price crosses defined thresholds

Indicator v6 TrendSupport & resistance
Updated 6 weeks ago · None stated GitHub repository of Auto Trade Futures ES
219 stars

This indicator plots reference levels for previous daily high and low prices directly on the price chart. It requests daily timeframe data using the security function and plots the offset values as continuous lines, displaying resistance in red and support in

Indicator v4 Support & resistanceSessions & time
Updated 5 years ago · None stated GitHub repository of 昨日高低點標示

Golden Bullet Strategy

by TradersPost
218 stars

The Golden Bullet Strategy is an overlay signal indicator based on Smart Money Concepts and time-based liquidity models. It identifies liquidity sweeps of a designated reference session range during a specified hunt window. It then confirms Market Structure Sh

Indicator v6 SMC / ICT / price actionSessions & time
Updated 3 months ago · None stated GitHub repository of Golden Bullet Strategy

Moon Dev GEX Arrows

by moondevonyt
92 stars

This overlay indicator plots option strike walls and an optional session VWAP on the price chart for SPY or ES. It spaces major strikes by the selected instrument, draws a set number of strikes on each side, and marks wall-trap and sweep events after a cooldow

Indicator v5 Support & resistanceSessions & time
Updated 8 weeks ago · Custom licence GitHub repository of Moon Dev GEX Arrows

Key Levels

by cryptorife
75 stars

This indicator plots reference levels and session markers directly on the price chart. It calculates and draws lines for the daily open, weekly open, monthly open, previous day OHLC, and previous week extremes, along with a selectable day-of-week range and ini

Indicator v4 Support & resistanceSessions & time Repaints
Updated 3 years ago · GPL-3.0 GitHub repository of Key Levels

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers