Indicator · Pine Script v5 · On the chart

Market Profile with Screener

by ArunKBhaskar

This indicator builds Market Profile Time Price Opportunity (TPO) structures across defined session timeframes directly on the main price chart.

View on GitHub

GitHub stars575on the repository
Pine versionv5runs as is
Lines of code374
Settings16inputs
LicenceMPL-2.0
Last update1 year ago30 Mar 2025

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

374 lines of Pine Script v5 from [Screener] Market Profile with Screener (Based on [RS]Market Profile by RicardoSantos).txt, published under MPL-2.0. Keep the author's credit and licence lines when you reuse it.

[Screener] Market Profile with Screener (Based on [RS]Market Profile by RicardoSantos).txt
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Arun_K_Bhaskar

// Acknowledgement & Reference
// Trader: 'RicardoSantos'
// Indicator Title: '[RS]Market Profile'
// Indicator Link: 'https://www.tradingview.com/script/uoysXxWM-RS-Market-Profile/'

//@version=5
indicator(title='Market Profile with Screener (Based on [RS]Market Profile by RicardoSantos)', shorttitle='Market Profile Screener', overlay=true, max_lines_count=300, max_boxes_count=300)

//_____________________________ Market Profile Start

//  ||--    Inputs:
g_mp='Market Profile'
string i_session_timeframe = input.string(defval='5D', title='Timeframe', group=g_mp)
float i_percent_of_tpo = input.float(defval=0.7, title='TPO %', group=g_mp)
int i_sessions = input.int(defval=1, title='Show Last', minval=0, maxval=40, group=g_mp)
color i_poc_col = input.color(defval=#EA738D, title='Point of Control', group=g_mp)
color i_va_col = input.color(defval=#89ABE3, title='Value Area', group=g_mp)
color i_open_col = input.color(defval=color.silver, title='Open', group=g_mp)
int i_mp_transp = input.int(defval=100, title='Transparency', minval=0, maxval=100, group=g_mp)

//  ||--    Extra Functions:
f_line_stack(_array, _max_elements, _new_element) =>
    int _size = array.size(_array)
    if _size >= _max_elements
        line.delete(array.pop(_array))
    array.unshift(_array, _new_element)
f_open_session_line(_x1, _y1, _x2, _y2) =>
    line.new(_x1, _y1, _x2, _y2, xloc=xloc.bar_time, color=i_open_col, style=line.style_dashed)

f_box_stack(_array, _max_elements, _new_element) =>
    int _size = array.size(_array)
    if _size >= _max_elements
        box.delete(array.pop(_array))
    array.unshift(_array, _new_element)

f_poc_box(_x1, _y1, _x2, _y2) =>
    box.new(_x1, _y1, _x2, _y2, border_color=i_poc_col, xloc=xloc.bar_time, bgcolor=color.new(i_poc_col, i_mp_transp))
f_vah_box(_x1, _y1, _x2, _y2) =>
    box.new(_x1, _y1, _x2, _y2, border_color=i_va_col, xloc=xloc.bar_time, bgcolor=color.new(i_va_col, i_mp_transp))

var line[] open_session_lines = array.new_line(0)
var box[] poc_boxes = array.new_box(0)
var box[] vah_boxes = array.new_box(0)

float tf_high = high
float tf_low = low
float tf_close = close

//  ||--    Bars since session started:
isnewsession = ta.change(time(i_session_timeframe)) != 0

var int session_bar_counter = 0
var int previous_session_start = na
var int previous_session_end = na
var int session_time_range = na

if isnewsession
    session_bar_counter := 0
    previous_session_start := previous_session_end
    previous_session_end := time
    session_time_range := previous_session_end - previous_session_start
    session_time_range
else
    session_bar_counter += 1
    session_bar_counter

//  ||--    session high, low, range:
var float session_high = tf_high
var float session_low = tf_low
var float session_range = tf_high - tf_low

//      ||--    recalculate session high, low and range:
if session_bar_counter == 0
    session_high := tf_high
    session_low := tf_low
    session_range := tf_high - tf_low
    session_range
if tf_high > session_high[1]
    session_high := tf_high
    session_range := session_high - session_low
    session_range
if tf_low < session_low[1]
    session_low := tf_low
    session_range := session_high - session_low
    session_range

//  ||--    define tpo section range:
tpo_section_range = session_range / 20

//  ||--    function to get the frequency a specified range is visited:
f_frequency_of_range(_src, _upper_range, _lower_range, _length) =>
    _adjusted_length = _length < 1 ? 1 : _length
    _frequency = 0
    for _i = 0 to _adjusted_length - 1 by 1
        if _src[_i] >= _lower_range and _src[_i] < _upper_range
            _frequency += 1
            _frequency
    _return = nz(_frequency, 0)  // _adjusted_length
    _return

//  ||--    frequency the tpo range is visited:
tpo_00 = f_frequency_of_range(tf_close, session_high, session_high - tpo_section_range * 1, session_bar_counter)
tpo_01 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 1, session_high - tpo_section_range * 2, session_bar_counter)
tpo_02 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 2, session_high - tpo_section_range * 3, session_bar_counter)
tpo_03 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 3, session_high - tpo_section_range * 4, session_bar_counter)
tpo_04 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 4, session_high - tpo_section_range * 5, session_bar_counter)
tpo_05 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 5, session_high - tpo_section_range * 6, session_bar_counter)
tpo_06 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 6, session_high - tpo_section_range * 7, session_bar_counter)
tpo_07 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 7, session_high - tpo_section_range * 8, session_bar_counter)
tpo_08 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 8, session_high - tpo_section_range * 9, session_bar_counter)
tpo_09 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 9, session_high - tpo_section_range * 10, session_bar_counter)
tpo_10 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 10, session_high - tpo_section_range * 11, session_bar_counter)
tpo_11 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 11, session_high - tpo_section_range * 12, session_bar_counter)
tpo_12 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 12, session_high - tpo_section_range * 13, session_bar_counter)
tpo_13 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 13, session_high - tpo_section_range * 14, session_bar_counter)
tpo_14 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 14, session_high - tpo_section_range * 15, session_bar_counter)
tpo_15 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 15, session_high - tpo_section_range * 16, session_bar_counter)
tpo_16 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 16, session_high - tpo_section_range * 17, session_bar_counter)
tpo_17 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 17, session_high - tpo_section_range * 18, session_bar_counter)
tpo_18 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 18, session_high - tpo_section_range * 19, session_bar_counter)
tpo_19 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 19, session_high - tpo_section_range * 20, session_bar_counter)
tpo_20 = f_frequency_of_range(tf_close, session_high - tpo_section_range * 20, session_high - tpo_section_range * 21, session_bar_counter)

//  ||--    function to retrieve a specific tpo value
f_get_tpo_count(_value) =>
    _return = switch (_value)
        0 => tpo_00
        1 => tpo_01
        2 => tpo_02
        3 => tpo_03
        4 => tpo_04
        5 => tpo_05
        6 => tpo_06
        7 => tpo_07
        8 => tpo_08
        9 => tpo_09
        10 => tpo_10
        11 => tpo_11
        12 => tpo_12
        13 => tpo_13
        14 => tpo_14
        15 => tpo_15
        16 => tpo_16
        17 => tpo_17
        18 => tpo_18
        19 => tpo_19
        20 => tpo_20
        => 0.0

tpo_sum = 0.0
current_poc_position = 0.0
current_poc_value = 0.0

for _i = 0 to 20 by 1
    _get_tpo_value = f_get_tpo_count(_i)
    tpo_sum += _get_tpo_value
    if _get_tpo_value >= current_poc_value
        current_poc_position := _i
        current_poc_value := _get_tpo_value
        current_poc_value

poc_upper = session_high - tpo_section_range * current_poc_position
poc_lower = session_high - tpo_section_range * (current_poc_position + 1)

//  ||--    get value area high/low
vah_position = current_poc_position
val_position = current_poc_position
current_sum = current_poc_value

for _i = 0 to 20 by 1
    if current_sum < tpo_sum * i_percent_of_tpo
        vah_position := math.max(0, vah_position - 1)
        current_sum += f_get_tpo_count(math.round(vah_position))
        current_sum
    if current_sum < tpo_sum * i_percent_of_tpo
        val_position := math.min(20, val_position + 1)
        current_sum += f_get_tpo_count(math.round(val_position))
        current_sum

vah_value = session_high - tpo_section_range * vah_position
val_value = session_high - tpo_section_range * (val_position + 1)

if isnewsession
    f_box_stack(vah_boxes, i_sessions, f_vah_box(previous_session_end, vah_value[1], time_close(i_session_timeframe), val_value[1]))
    f_box_stack(poc_boxes, i_sessions, f_poc_box(previous_session_end, poc_upper[1], time_close(i_session_timeframe), poc_lower[1]))
    f_line_stack(open_session_lines, i_sessions, f_open_session_line(previous_session_end, open, time_close(i_session_timeframe), open))

// Function to get the pivot value
vahl_pivot_value(src) =>
    ta.valuewhen(session_bar_counter == 0, src[1], 0)

// Get VAH and VAL pivots
vah_pivot = vahl_pivot_value(vah_value)
val_pivot = vahl_pivot_value(val_value)
poc_pivot = vahl_pivot_value(math.avg(poc_upper, poc_lower))

// Calculate percentage between VAH and VAL
va_percent = ((vah_pivot - val_pivot) / val_pivot) * 100
poc_percent = ((close - poc_pivot) / poc_pivot) * 100
//_____________________________ Market Profile End


//_____________________________ Screener Start

// Note:
// - TradingView allows up to 40 requests per indicator, so keep the number of symbols below 40.
// - Too many requests and complex calculations may slow down the indicator.
// - You can combine multiple indicators in one script, like Close crossing above EMA 20, RSI crossing 60, etc.

//_____________________________ Menu Screener Table Start

g_tb = 'Screener : Table'
tt_is = //"• Input exactly 40 symbols, nothing more or less." +
     "• Total characters cannot exceed 4096." +
     "\n• Use comma as delimiter without any space." +
     "\n• Eg: 'EXCHANGE:SYMBOL_A,EXCHANGE:SYMBOL_B'"

string i_symbols = input.text_area(
 defval='NSE:ADANIPOWER,NSE:ARVIND,NSE:ASHOKA,NSE:BANKINDIA,NSE:BLS,NSE:BOMDYEING,NSE:CUB,NSE:DBL,NSE:DELTACORP,NSE:ENGINERSIN,NSE:GIPCL,NSE:GMDCLTD,NSE:GPPL,NSE:HINDCOPPER,NSE:INDIACEM,NSE:INOXWIND,NSE:IPL,NSE:IRCON,NSE:ITI,NSE:JAMNAAUTO,NSE:JKTYRE,NSE:KESORAMIND,NSE:LEMONTREE,NSE:MOIL,NSE:MRPL,NSE:NLCINDIA,NSE:ONMOBILE,NSE:PFC,NSE:PPLPHARMA,NSE:PTC,NSE:RAILTEL,NSE:RCF,NSE:RVNL,NSE:SHRIRAMPPS,NSE:TI,NSE:WELCORP,NSE:L_TFH,NSE:WOCKPHARMA,NSE:ZOMATO',
 title="Paste Symbols", tooltip=tt_is, group=g_tb)

float i_va_above = input.float(defval=0, title='VA % Between', minval=0, maxval=100, inline='1', group=g_tb)
float i_va_below = input.float(defval=3, title='', minval=0, maxval=100, inline='1', group=g_tb)

float i_ltp_above = input.float(defval=-10, title='LTP % Between', inline='2', group=g_tb)
float i_ltp_below = input.float(defval=10, title='', inline='2', group=g_tb)


int i_tbl_disp_rows = input.int(defval=15, title='Display Rows', minval=0, maxval=100, group=g_tb)
string i_tbl_position = input.string(defval=position.bottom_left, title='Position', options=[position.top_left, position.top_center, position.top_right, position.middle_left, position.middle_center, position.middle_right, position.bottom_left, position.bottom_center, position.bottom_right], group=g_tb)
string i_tbl_text_size = input.string(defval=size.small, title='Size', options=[size.auto, size.tiny, size.small, size.normal, size.large, size.huge], group=g_tb)

color i_tbl_neu_col = input.color(defval=#B2B5BE, title='Color', group=g_tb)

//_____________________________ Menu Screener Table End

//_______________________ Get Symbols Start

// Acknowledgement & Reference
// Trader: 'allanster'
// Indicator Title: 'How To Input CSV List Of Symbol Data Used For Screener'
// Indicator Link: 'https://www.tradingview.com/script/KfqHqHUH-How-To-Input-CSV-List-Of-Symbol-Data-Used-For-Screener/'

feed(back) =>                                             // extract tickerid and decrement list of ticker IDs
    loop  = back                                          // declare string variable to hold content list
    getT  = string(na)                                    // declare string variable to hold tickerid
    if str.length(loop) == 0                              // if list is empty
        getT := string(na)                                // assign na to tickerid variable
        loop := string(na)                                // assign na to list of ticker Ids variable
    else                                                  // else extract first tickerid
        getP  = nz(str.pos(loop, ','), str.length(loop))  // get position of first comma or last character
        getT := str.substring(loop, 0, getP)              // get tickerid in first position of list
        loop := str.replace(loop, getT + ',', '')         // clear tickerid + delimiter character from list
    [getT, loop]                                          // return tickerid in first position & truncated list

[tid_001, out_001] = feed(i_symbols), [tid_002, out_002] = feed(out_001), [tid_003, out_003] = feed(out_002), [tid_004, out_004] = feed(out_003),
[tid_005, out_005] = feed(out_004), [tid_006, out_006] = feed(out_005), [tid_007, out_007] = feed(out_006), [tid_008, out_008] = feed(out_007),
[tid_009, out_009] = feed(out_008), [tid_010, out_010] = feed(out_009), [tid_011, out_011] = feed(out_010), [tid_012, out_012] = feed(out_011),
[tid_013, out_013] = feed(out_012), [tid_014, out_014] = feed(out_013), [tid_015, out_015] = feed(out_014), [tid_016, out_016] = feed(out_015),
[tid_017, out_017] = feed(out_016), [tid_018, out_018] = feed(out_017), [tid_019, out_019] = feed(out_018), [tid_020, out_020] = feed(out_019),
[tid_021, out_021] = feed(out_020), [tid_022, out_022] = feed(out_021), [tid_023, out_023] = feed(out_022), [tid_024, out_024] = feed(out_023),
[tid_025, out_025] = feed(out_024), [tid_026, out_026] = feed(out_025), [tid_027, out_027] = feed(out_026), [tid_028, out_028] = feed(out_027),
[tid_029, out_029] = feed(out_028), [tid_030, out_030] = feed(out_029), [tid_031, out_031] = feed(out_030), [tid_032, out_032] = feed(out_031),
[tid_033, out_033] = feed(out_032), [tid_034, out_034] = feed(out_033), [tid_035, out_035] = feed(out_034), [tid_036, out_036] = feed(out_035),
[tid_037, out_037] = feed(out_036), [tid_038, out_038] = feed(out_037), [tid_039, out_039] = feed(out_038), [tid_040, out_040] = feed(out_039)

//_______________________ Get Symbols End

// _____________________________ Screener Start

// Acknowledgement & Reference
// Trader: 'MUQWISHI'
// Indicator Title: 'Candlestick Patterns Screener [By MUQWISHI]'
// Indicator Link: 'https://www.tradingview.com/script/xiWQuGOq-Candlestick-Patterns-Screener-By-MUQWISHI/'

// Function for Screener Indicator Calculation

screener_condition = va_percent > i_va_above and va_percent <= i_va_below and poc_percent <= i_ltp_below and poc_percent >= i_ltp_above

truncate(number, decimals) =>
    factor = math.pow(10, decimals)
    int(number * factor) / factor

indicator_calculation() =>
    // Initialize variables
    percent = float(na)
    _time = int(na)
    pchg = float(na)

    if screener_condition
        percent := truncate(va_percent, 2)
        _time := time
        pchg := truncate(poc_percent, 2)

    [_time, percent, pchg]

// Function to format time
format_time(x) =>
    timezone = syminfo.timezone
    timeframe.isintraday ? str.format_time(x, "HH:mm  dd-MM-yyyy", timezone) : str.format_time(x, "dd-MM-yyyy", timezone)

// Function to extract symbol name
symbol(s) => 
    array.get(str.split(s, ":"), 1)

// Matrix setup
var matrix = matrix.new<string>(0, 4, na)

// Function to add rows to the matrix
mtxFun(symbol, _time, percent, pchg) =>
    matrix.add_row(matrix, 0, array.from(symbol, _time, percent, pchg))

// Screener function to collect data
screener(s) =>
    sym = ticker.modify(s, syminfo.session)
    [_time, percent, pchg] = request.security(sym, timeframe.period, indicator_calculation())

    // Check if the signal is not na and the time matches
    if _time == time
        mtxFun(symbol(s), format_time(_time), str.tostring(percent), str.tostring(pchg))

// Call Screener function for multiple symbols
screener(tid_001), screener(tid_002), screener(tid_003), screener(tid_004), screener(tid_005), screener(tid_006), screener(tid_007),
screener(tid_008), screener(tid_009), screener(tid_010), screener(tid_011), screener(tid_012), screener(tid_013), screener(tid_014),
screener(tid_015), screener(tid_016), screener(tid_017), screener(tid_018), screener(tid_019), screener(tid_020), screener(tid_021),
screener(tid_022), screener(tid_023), screener(tid_024), screener(tid_025), screener(tid_026), screener(tid_027), screener(tid_028),
screener(tid_029), screener(tid_030), screener(tid_031), screener(tid_032), screener(tid_033), screener(tid_034), screener(tid_035),
screener(tid_036), screener(tid_037), screener(tid_038), screener(tid_039), screener(tid_040)

// Trim excess rows in the matrix
if matrix.rows(matrix) > i_tbl_disp_rows
    while matrix.rows(matrix) > i_tbl_disp_rows
        matrix.remove_row(matrix, matrix.rows(matrix)-1)

// Plot Table
// Create table with specified properties
var table tbl = table.new(position=i_tbl_position, columns=4, rows=102, border_width=1)

tt_tbl = "Time: Signal generation time.\n" +
     "% VAHL: Percentage between VAH & VAL.\n" +
     "% LTP: Percentage change from POC mid to LTP."

// Function to populate cells in the table
cell(col, row, txt, color) => 
    table.cell(tbl, col, row, text = txt, text_color = color, text_halign=text.align_left, bgcolor = color.new(color, 80), text_size=i_tbl_text_size, tooltip=tt_tbl)

// Check if it's the last bar
if barstate.islast
    // Clear existing data in the table
    table.clear(tbl, 0, 0, 3, 101)

    // Set headers for the table
    cell(0, 0, "Symbol", i_tbl_neu_col)
    cell(1, 0, "Time",   i_tbl_neu_col)
    cell(2, 0, "% VAHL" ,  i_tbl_neu_col)
    cell(3, 0, "% LTP" ,  i_tbl_neu_col)

    j = 1
    // Populate table with matrix data
    if matrix.rows(matrix) > 0
        for i = 0 to matrix.rows(matrix) - 1
            // Populate cells in the table
            cell(0, j, matrix.get(matrix, i, 0), i_tbl_neu_col)
            cell(1, j, matrix.get(matrix, i, 1), i_tbl_neu_col)
            cell(2, j, matrix.get(matrix, i, 2), i_tbl_neu_col)
            cell(3, j, matrix.get(matrix, i, 3), i_tbl_neu_col)

            j += 1

// _____________________________ Screener End
// _____________________________ Code End

Overview

Market Profile with Screener visualizes the Point of Control (POC) and Value Area boundaries using dynamic box drawings. An integrated multi-symbol screener table displays symbol metrics, filtering assets based on price relative to Value Area and Last Traded Price (LTP) percentages. Settings allow customization of session timeframe, TPO percentage, visual colors, transparency, and symbol lists.

Details

Published by

ArunKBhaskar on GitHub

Type

Indicator, Pine Script v5

Draws

On the price chart

Category

Support & resistance, Screeners & dashboards, Sessions & time

Markets

Stocks

Timeframes

M15-H1, H4 and above

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.

Topics

pinescripttradingview

Settings

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

SettingTypeDefaultVariable
Timeframestring5Di_session_timeframe
TPO %float0.7i_percent_of_tpo
Show Lastint1i_sessions
Point of Controlcolor#EA738Di_poc_col
Value Areacolor#89ABE3i_va_col
Opencolorcolor.silveri_open_col
Transparencyint100i_mp_transp
Paste SymbolstextNSE:ADANIPOWER,NSE:ARVIND,NSE:ASHOKA,NSE:BANKINDIA,NSE:BLS,Ni_symbols
VA % Betweenfloat0i_va_above
i_va_belowfloat3i_va_below
LTP % Betweenfloat-10i_ltp_above
i_ltp_belowfloat10i_ltp_below
Show all 16 settings
SettingTypeDefaultVariable
Display Rowsint15i_tbl_disp_rows
Positionstringposition.bottom_lefti_tbl_position
Sizestringsize.smalli_tbl_text_size
Colorcolor#B2B5BEi_tbl_neu_col
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

257 stars

This indicator overlays an intraday SPX and ES chart with a midnight session range, regular-trading-hours opening levels, and a VWAP projection box. It draws the midnight high, mid, and low, flags edge rejections within an absolute tolerance, and plots optiona

Indicator v6 TrendSupport & resistance
Updated 6 weeks ago · None stated GitHub repository of SPX Midnight Box + Snag Logic

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

Session Edge Probabilities

by TraderOracle
61 stars

Session Edge Probabilities tracks eight session-based trading rules using statistical probabilities evaluated on historical chart data. It utilizes a fixed calculation timeframe to evaluate opening ranges, midnight levels, afternoon reversal windows, and price

Indicator v6 Sessions & timeScreeners & dashboards
Updated 9 days ago · None stated GitHub repository of Session Edge Probabilities
56 stars

This indicator marks forex trading sessions and opening ranges on the price chart. It can draw Sydney, Tokyo, Frankfurt, London, and New York session boxes or five- and fifteen-minute opening ranges, plus an optional opening channel and a day-open range. Day r

Indicator v5 Sessions & timeSupport & resistance Repaints
Updated 2 months ago · None stated GitHub repository of Day Trading Booster by DGT

4H Candle Curves

by TamaraKGreen
46 stars

4H Candle Curves highlights 4-hour trading sessions based on New York time by overlaying customizable colored boxes directly on the main price chart. It divides 4-hour sessions with quarter separator lines at one-hour intervals and places name labels at the mi

Indicator v6 Sessions & timeScreeners & dashboards
Updated 7 weeks ago · None stated GitHub repository of 4H Candle Curves

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