This Pine Script identifies and displays weekly naked Points of Control (nPOCs) on a TradingView chart. An nPOC represents a Point of Control (POC) from a previous week that has not been revisited by price action in subsequent weeks. These nPOCs are extended to the right as horizontal lines, indicating potential support or resistance levels.
#### Script Overview
1. **Indicator Declaration:** ```pinescript //version=5 indicator("Weekly nPOCs", overlay=true) ``` - The script is defined as a version 5 Pine Script. - The `indicator` function sets the script's name ("Weekly nPOCs") and specifies that the indicator should be overlaid on the price chart (`overlay=true`).
2. **Function to Calculate POC:** ```pinescript f_poc(_hl2, _vol) => var float[] vol_profile = na if (na(vol_profile)) vol_profile := array.new_float(100, 0.0)
_bin_size = (high - low) / 100 for i = 0 to 99 if _hl2 >= low + i * _bin_size and _hl2 < low + (i + 1) * _bin_size array.set(vol_profile, i, array.get(vol_profile, i) + _vol)
max_volume = array.max(vol_profile) poc_index = array.indexof(vol_profile, max_volume) poc_price = low + poc_index * _bin_size + _bin_size / 2 poc_price ``` - The function `f_poc` calculates the Point of Control (POC) for a given period. - It takes two parameters: `_hl2` (the average of the high and low prices) and `_vol` (volume). - A volume profile array (`vol_profile`) is initialized to store volume data across different price bins. - The price range between the high and low is divided into 100 bins (`_bin_size`). - The function iterates over each bin, accumulating the volumes for prices within each bin. - The bin with the maximum volume is identified as the POC (`poc_price`).
3. **Variables to Store Weekly Data:** ```pinescript var float poc = na var float prev_poc = na var line[] poc_lines = na if na(poc_lines) poc_lines := array.new_line(0) ``` - `poc` stores the current week's POC. - `prev_poc` stores the previous week's POC. - `poc_lines` is an array to store lines representing nPOCs. The array is initialized if it is `na` (not initialized).
4. **Calculate Weekly POC:** ```pinescript is_new_week = ta.change(time('W')) != 0 if (is_new_week) prev_poc := poc poc := f_poc(hl2, volume) if not na(prev_poc) line new_poc_line = line.new(x1=bar_index, y1=prev_poc, x2=bar_index + 100, y2=prev_poc, color=color.red, width=2) label.new(x=bar_index, y=prev_poc, text="nPOC", style=label.style_label_down, color=color.red, textcolor=color.white) array.push(poc_lines, new_poc_line) ``` - `is_new_week` checks if the current bar is the start of a new week using the `ta.change(time('W'))` function. - If it's a new week, the previous week's POC is stored in `prev_poc`, and the current week's POC is calculated using `f_poc`. - If `prev_poc` is not `na`, a new line (`new_poc_line`) representing the nPOC is created, extending it to the right (for 100 bars). - A label is created at the `prev_poc` level, marking it as "nPOC". - The new line is added to the `poc_lines` array.
5. **Remove Old Lines:** ```pinescript if array.size(poc_lines) > 52 line.delete(array.shift(poc_lines)) ``` - This section ensures that only the last 52 weeks of nPOCs are kept to avoid cluttering the chart. - If the `poc_lines` array contains more than 52 lines, the oldest line is deleted using `array.shift`.
6. **Plot the Current Week's POC as a Reference:** ```pinescript plot(poc, title="Current Weekly POC", color=color.blue, linewidth=2, style=plot.style_line) ``` - The current week's POC is plotted as a blue line on the chart for reference.
#### Summary
This script calculates and identifies weekly Points of Control (POCs) and marks them as nPOCs if they remain untouched by subsequent price action. These nPOCs are displayed as horizontal lines extending to the right, providing traders with potential support or resistance levels. The script also manages the number of lines plotted to maintain a clear and uncluttered chart.