Home > database >  Pine Script not drawing boxes
Pine Script not drawing boxes

Time:10-31

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

CodePudding user response:

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

  • Related