Fredo Corleone
Fredo Corleone

Reputation: 572

Pine Script not drawing boxes

I'm making a free VPVR which is supposedly better than those that are currently available for free.

I've noticed that if I increase the number of histograms, then the graph doesn't show some of those histograms.

enter image description here

This first image is with 27 histograms.

enter image description here

This second image is with 34 histograms.

I'm sure values are there because I can see the bars being offsetted (look the second picture):

  1. Why it doesn't draw those bars?
  2. How can I solve this?

I already tried with lines and it does the same. It's as if there's a limit, if I remove one of the two box.new call I hit this limit to > 54 histograms.

Follows the script that I'm currently working on:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Fr3d0C0rl30n3

//@version=4
study("Fr3d0's Volume Profile Visible Range", "VPVR", overlay=true)

DEFAULT_COLOR = color.new(color.gray, 0)
BUY_COLOR = color.new(color.green, 0)
SELL_COLOR = color.new(color.red, 0)
SPECIAL_COLOR = color.new(color.yellow, 0)
TIME_UNIT = time - time[1]

numOfBars = input(100, 'Number of bars', minval=20, maxval=500)
rangeHigh = highest(high, numOfBars)
rangeLow = lowest(low, numOfBars)
rangeHeight = rangeHigh - rangeLow

numOfHistograms = input(50, 'Number of histograms', minval=20, maxval=50)
widestHistogramWidth = input(50, 'Width of the PoC', minval=20, maxval=100)
histogramHeight = rangeHeight / numOfHistograms

histogramLowList = array.new_float(numOfHistograms, na)
histogramHighList = array.new_float(numOfHistograms, na)
histogramPriceList = array.new_float(numOfHistograms, 0.0)

histogramBuyVolumeList = array.new_float(numOfHistograms, 0.0)
histogramSellVolumeList = array.new_float(numOfHistograms, 0.0)
histogramVolumePercentageList = array.new_float(numOfHistograms, 0.0)

histogramIsPOCList = array.new_bool(numOfHistograms, false)

if barstate.islast

    // Define lows and highs of the histograms
    for i = 0 to numOfHistograms - 1
        histogramLow = rangeLow + histogramHeight * i
        histogramHigh = rangeLow + histogramHeight * (i + 1)
        array.set(histogramLowList, i, histogramLow)
        array.set(histogramHighList, i, histogramHigh)
        array.set(histogramPriceList, i, (histogramLow + histogramHigh) / 2)
        
    // Assign bar's volumes to histograms
    for i = 0 to numOfBars - 1
        currentBarHeight = high[i] - low[i]
        currentBuyVolume = iff((high[i] == low[i]), 0, volume[i] * (close[i] - low[i]) / currentBarHeight)
        currentSellVolume = iff((high[i] == low[i]), 0, volume[i] * (high[i] - close[i]) / currentBarHeight)
        
        // Define the percentages of the current volume to give to histograms
        for j = 0 to numOfHistograms - 1
            histogramLow = array.get(histogramLowList, j)
            histogramHigh = array.get(histogramHighList, j)
            target = max(histogramHigh, high[i]) - min(histogramLow, low[i])
                   - (max(histogramHigh, high[i]) - min(histogramHigh, high[i]))
                   - (max(histogramLow, low[i]) - min(histogramLow, low[i]))
            histogramVolumePercentage = target / currentBarHeight
            
            histogramBuyVolume = array.get(histogramBuyVolumeList, j)
            histogramSellVolume = array.get(histogramSellVolumeList, j)
            
            // If there is at least one histogram affected
            // then divide the current volume by the number of histograms affected
            if histogramVolumePercentage > 0
                array.set(histogramBuyVolumeList, j, histogramBuyVolume + currentBuyVolume * histogramVolumePercentage)
                array.set(histogramSellVolumeList, j, histogramSellVolume + currentSellVolume * histogramVolumePercentage)
    
    // Find the histogram with the highest volume
    highestHistogramVolume = 0.0
    for i = 0 to numOfHistograms - 1
        histogramBuyVolume = array.get(histogramBuyVolumeList, i)
        histogramSellVolume = array.get(histogramSellVolumeList, i)
        histogramVolume = histogramBuyVolume + histogramSellVolume
        highestHistogramVolume := max(highestHistogramVolume, histogramVolume)
    
    // Mark the Point of Control
    for i = 0 to numOfHistograms - 1
        histogramVolume = array.get(histogramBuyVolumeList, i) + array.get(histogramSellVolumeList, i)
        if histogramVolume == highestHistogramVolume
            array.set(histogramIsPOCList, i, true)
    
    // Draw top and bottom of the range considered
    line.new(time[numOfBars], rangeHigh, time_close, rangeHigh, xloc=xloc.bar_time, color=DEFAULT_COLOR, width = 2)
    line.new(time[numOfBars], rangeLow, time_close, rangeLow, xloc=xloc.bar_time, color=DEFAULT_COLOR, width = 2)
    
    // Draw histograms and highlight the Point of Control
    for i = 0 to numOfHistograms - 1
        histogramLow = array.get(histogramLowList, i)
        histogramHigh = array.get(histogramHighList, i)
        histogramBuyVolume = array.get(histogramBuyVolumeList, i)
        histogramSellVolume = array.get(histogramSellVolumeList, i)
        histogramVolume = histogramBuyVolume + histogramSellVolume
        histogramWidth = widestHistogramWidth * histogramVolume / highestHistogramVolume
        histogramBuyWidth = floor(histogramWidth * histogramBuyVolume / histogramVolume)
        histogramSellWidth = floor(histogramWidth * histogramSellVolume / histogramVolume)
        isPOC = array.get(histogramIsPOCList, i)
        
        // Draw buy and send histograms
        box.new(left=bar_index + 1, top=histogramHigh, right=bar_index + 1 + histogramBuyWidth, bottom=histogramLow, bgcolor=BUY_COLOR, border_color=isPOC ? SPECIAL_COLOR : color.new(color.black, 80))
        box.new(left=bar_index + 1 + histogramBuyWidth, top=histogramHigh, right=bar_index + 1 + histogramBuyWidth + histogramSellWidth, bottom=histogramLow, bgcolor=SELL_COLOR, border_color=isPOC ? SPECIAL_COLOR : color.new(color.black, 80))

Thanks, Fredo

Upvotes: 0

Views: 712

Answers (1)

rumpypumpydumpy
rumpypumpydumpy

Reputation: 3823

For lines, labels and boxes, if you require more than the available default limit of 50, you need to set the study/strategy() parameters for them eg

study("My study", max_lines_count = 500, max_boxes_count = 500, max_labels_count = 500)

The max limits are 500.

https://www.tradingview.com/pine-script-reference/v4/#fun_study

Upvotes: 2

Related Questions