garbage_collection_and_utilitiesGarbage Collection and Utilities is a library that offers a set of functions designed for efficient management of various types of arrays. This library provides garbage collection utilities to remove and delete excess elements, and also includes utilities for checking the size of arrays. It's particularly useful for developers who want to manage labels, lines, polylines, boxes, linefills, chart points, floats, integers, booleans, and strings efficiently within their scripts.
Both  dump  and  trim  act on the array  backwards . This means that for  trim , the elements that will be left start from 0. If you want the most recent element to be left after trim, you must use  unshift(). 
 Garbage Collection: 
 
 Functions to remove and delete excess elements from various types of arrays.
 Useful for freeing up memory and keeping the arrays within desired size limits.
 
 Size Checking: 
 
 Functions to check if arrays are larger than a specified size.
 Helps in ensuring that arrays have enough elements before performing operations.
 
 Supported Types: 
Compatible with a wide range of array types, including labels, lines, polylines, boxes, linefills, chart points, floats, integers, booleans, and strings.
 Usage: 
The  dump  methods are ideal for clearing out unwanted elements from arrays, while the  trim  methods allow for more refined control over the size of arrays.
The  ready  methods enable you to verify if arrays have the required number of elements before proceeding with further operations.
Library   "garbage_collection_and_utilities" 
Provides garbage collection utilities for managing and trimming various types of arrays, and utilities to check if an array is of a specific size. Included types are: labels, lines, polylines, boxes, linefills, chart points, floats, integers, booleans, and strings.
 method ready(self, size) 
  Checks if an array of labels is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of lines is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of polylines is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of boxes is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of linefills is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of chart points is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of floats is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of integers is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of booleans is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method ready(self, size) 
  Checks if an array of strings is larger than a specified size
  Namespace types: array
  Parameters:
     self (array) 
     size (int) : The minimum size of the array
  Returns: A boolean indicating whether the array is ready
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of labels
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of lines
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of polylines
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of boxes
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of linefills
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of chart points
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of floats
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of integers
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of booleans
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method dump(self, max_size, trigger) 
  Removes and deletes excess elements from an array of strings
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     trigger (bool) : A condition to trigger the dumping process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of labels
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of lines
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of polylines
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of boxes
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of linefills
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of chart points
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of floats
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of integers
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of booleans
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
 method trim(self, max_size, min_size, trigger) 
  Removes excess elements and trims an array of strings
  Namespace types: array
  Parameters:
     self (array) 
     max_size (int) : The maximum size of the array
     min_size (int) : The minimum size of the array
     trigger (bool) : A condition to trigger the trimming process
  Returns: void
Display
Order Block Refiner [TradingFinder]🔵 Introduction 
The "Refinement" feature allows you to adjust the width of the order block according to your strategy. There are two modes, "Aggressive" and "Defensive," in the "Order Block Refine". The difference between "Aggressive" and "Defensive" lies in the width of the order block. 
For risk-averse traders, the "Defensive" mode is suitable as it provides a lower loss limit and a greater reward-to-risk ratio. For risk-taking traders, the "Aggressive" mode is more appropriate. These traders prefer to enter trades at higher prices, and this mode, which has a wider order block width, is more suitable for this group of individuals.
 Important :
One of the advantages of using this library is increased code accuracy. Not only does it have the capability to create order blocks, but you can also simply define the condition for order block creation (true/false) and "bar_index," and you'll find the primary range without applying any filters.
🟣 Order Block Refinement Algorithm 
The order block ranges are filtered in two stages. In the first stage, the "Open," "High," "Low," and "Close" of the current order block candle, its two or three previous candles, and one subsequent candle (if available) are examined. In this stage, minimum and maximum distances are calculated, and logical range filters are applied.
In the second stage, two modes, "Aggressive" and "Defensive," are calculated.
For the "Defensive" mode, the width of these ranges is compared with the "ATR" (Average True Range) of period 55, and if they are smaller than "ATR" or 1 to more than 4 times "ATR," the width of the range is reduced from 0 to 80 percent. 
For the "Aggressive" mode, you get the same output as the first filter, which usually has a wider width than the "Defensive" mode.
• Order Block Refiner : Off 
  
• Order Block Refiner : On / "Aggressive Mode" 
   
• Order Block Refiner : On / "Defensive Mode" 
  
🔵 How to Use 
 OBRefiner(string OBType, string OBRefine, string RefineMethod, bool TriggerCondition, int Index) =>
Parameters:
•	OBType (string)
•	OBRefine (string)
•	RefineMethod (string)
•	TriggerCondition (bool)
•	Index (int) 
To add "Order Block Refiner Library", you must first add the following code to your script.
 import TFlab/OrderBlockRefiner_TradingFinder/1 
 OBType : This parameter receives 2 inputs. If the order block you want to "Refine" is of type demand, you should enter "Demand," and if it's of type supply, you should enter "Supply."
 OBRefine : Set to "On" if you want the "Refine" operation to be performed. Otherwise, set to "Off."
 RefineMethod : This input receives 2 modes, "Aggressive" and "Defensive." You can switch between these modes according to your needs.
 TriggerCondition : Enter the condition with which the order block is formed in this parameter.
 Index : Enter the "bar_index" of the candle where the order block is formed in this parameter.
🟣 Function Outputs 
This function has 6 outputs: "bar_index" at the beginning of the "Distal" line, "bar_index+1" at the end of the "Distal" line, "Price" at the "Distal" line, "bar_index" at the beginning of the "Proximal" line, "bar_index+1" at the end of the "Proximal" line, and "Price" at the "Proximal" line, which can be used to draw order blocks.
 Sample :
  = Refiner.OBRefiner('Demand', 'Off', 'Aggressive',BuMChMain_Trigger,  BuMChMain_Index)
if BuMChMain_Trigger
    BuMChHlineMain := line.new(BuMChMain_Xp1 , BuMChMain_Yp12 , bar_index , BuMChMain_Yp12, color = color.black , style = line.style_dotted)
    BuMChLlineMain := line.new(BuMChMain_Xd1 , BuMChMain_Yd12 , bar_index , BuMChMain_Yd12, color = color.black , style = line.style_dotted)
    BuMChFilineMain := linefill.new(BuMChHlineMain ,BuMChLlineMain , color = color.rgb(76, 175, 80 , 75 ) ) 
Alert Sender Library [TradingFinder]Library   "AlertSenderLibrary_TradingFinder" 
🔵 Introduction 
The "Alert Sender Library" is a management and production program for "Alert Messages" that enables the creation of unique messages for any type of signal generated by indicators or strategies.
These messages include the direction of the signal, symbol, time frame, the date and time the condition was triggered, prices related to the signal, and a personal message from you. To make better and more optimal use of this "library", you should carefully study " Key Features" and "How to Use".
🔵 Key Features 
 Automatic Detection of Appropriate Type :
Using two parameters, "AlertType" and "DetectionType", which you must enter at the beginning into the "AlertSender" function, the type of the alert message is determined. 
For example, if you select one of the "DetectionType"s such as "Order Block Signal", "Signal", and "Setup", your alert type will be chosen based on "Long" and "Short". Whether it's "Long" or "Short" depends on the "AlertType" you have set to either "Bullish" or "Bearish".
 Automatic Symbol Detection :
Whenever you add an alert for a specific symbol, if you want the name of that symbol to be in your message text, you must manually write the name of the symbol in your message. One of the capabilities of the "Alert Sender" is the automatic detection of the symbol and adding it to the message text.
 Automatic Time Frame Detection :
When adding your alert, the "Alert Sender" detects the time frame of the symbol you intend to add the alert for and adds it to the text. This feature is very practical and can prevent traders from making mistakes. 
For example, a trader might add alerts for a specific symbol using a specific indicator in different time frames, taking the main signal in the 1-hour time frame and only a confirmation signal in the 15-minute time frame. This feature helps to identify in which time frame the signal is set.
 Detection of Date and Time When the Signal is Triggered :
You can have the date and time at the moment the message is sent. This feature has various uses. For example, if you use the Webhook URL feature to send messages to a Telegram channel, there might be issues with alert delivery on your server, causing delays, and you might receive the message when it has lost its validity.
 With this feature, you can match the sending time of the message from TradingView with the receipt time in your messenger and detect if there is a delay in message delivery.
 Important :
You can also set the Time Zone you wish to receive the date and time based on.
 Display of "Key Prices" :
Key prices can vary based on the type of signals. For example, when the "DetectionType" is in "Order Block Signal" mode, the key prices are the "Distal" and "Proximal" prices. Or if the "DetectionType" is in "Setup" mode, the key prices are "Entry", "Stop Loss", and "Take Profit".
 Receipt of Personal "Messages" :
You can enter your personal message using "input.string" or "input.text_area" in addition to the messages that are automatically created.
 Beautiful and Functional Display of Messages :
The titles of messages sent by "AlertSender" are displayed using related emojis to prevent mistakes due to visual errors, enhancing beauty.
  
  
🔵 How to Use 
🟣 Familiarity with Function and Parameters 
 AlertSender(Condition, Alert, AlertName, AlertType, DetectionType, SetupData, Frequency, UTC, MoreInfo, Message, o, h, l, c, Entry, TP, SL, Distal, Proximal)
 Parameters:
  - Condition (bool)
  - Alert (string)
  - AlertName (string)
  - AlertType (string)
  - DetectionType (string)
  - SetupData (string)
  - Frequency (string)
  - UTC (string)
  - MoreInfo (string)
  - Message (string)
  - o (float)
  - h (float)
  - l (float)
  - c (float)
  - Entry (float)
  - TP (float)
  - SL (float)
  - Distal (float)
  - Proximal (float) 
To add "Alert Sender Library", you must first add the following code to your script.
 import TFlab/AlertSenderLibrary_TradingFinder/1 
🟣 Parameters 
 "Condition" : This parameter is a Boolean. You need to set it based on the condition that, when met (or fired), you want to receive an alert. The output should be either "true" or "false".
 "Alert" : This parameter accepts one of two inputs, "On" or "Off". If set to "On", the alarm is active; if "Off", the alarm is deactivated. This input is useful when you have numerous alerts in an indicator or strategy and need to activate only a few of them. "Alert" is a string parameter.
 Alert = input.string('On', 'Alert',  , 'If you turn on the Alert, you can receive alerts and notifications after setting the "Alert".', group = 'Alert') 
 "AlertName" : This is a string parameter where you can enter the name you choose for your alert.
 AlertName = input.string('Order Blocks Finder  ', 'Alert Name', group = 'Alert') 
 "AlertType" : The inputs for this parameter are "Bullish" or "Bearish". If the condition selected in the "Condition" parameter is of a bullish bias, you should set this parameter to "Bullish", and if the condition is of a bearish bias, it should be set to "Bearish". "AlertType" is a string parameter.
 "DetectionType" : This parameter's predefined inputs include "Order Block Signal", "Signal", "Setup", and "Analysis". You may provide other inputs, but some functionalities, like "Key Price", might be lost. "DetectionType" is a string parameter.
 "SetupData" : 
If "DetectionType" is set to "Setup", you must specify "SetupData" as either "Basic" or "Full". In "Basic" mode, only the "Entry" price needs to be defined in the function, and "TP" (Take Profit) and "SL" (Stop Loss) can be any number or NA. In "Full" mode, you need to define "Entry", "SL", and "TP". "Setup" is a string parameter.
 "Frequency" : This string parameter defines the announcement frequency. Choices include: "All" (activates the alert every time the function is called), "Once Per Bar" (activates the alert only on the first call within the bar), and "Once Per Bar Close" (the alert is activated only by a call at the last script execution of the real-time bar upon closing). The default setting is "Once per Bar".
 Frequency = input.string('Once Per Bar', 'Message Frequency',  , 'The triggering frequency. Possible values are: All (all function calls trigger the alert), Once Per Bar (the first function call during the bar triggers the alert), Per Bar Close (the function call triggers the alert only when it occurs during the last script iteration of the real-time bar, when it closes). The default is alert.freq_once_per_bar.', group = 'Alert') 
 "UTC" : With this parameter, you can set the Time Zone for the date and time of the alert's dispatch. "UTC" is a string parameter and can be set as "UTC-4", "UTC+1", "UTC+9", or any other Time Zone.
 UTC = input.string('UTC', 'Show Alert time by Time Zone', group = 'Alert') 
 "MoreInfo" : This parameter can take one of two inputs, "On" or "Off", which are strings. Additional information, including "Time" and "Key Price", is included. If set to "On", this information is received; if "Off", it is not displayed in the sent message.
 MoreInfo = input.string('On', 'Display More Info',  , group = 'Alert') 
 "Message" : This parameter captures the user's personal message through an input and displays it at the end of the sent message. It is a string input.
 MessageBull = input.text_area('Long Position', 'Long Signal Message', group = 'Alert') MessageBear = input.text_area('Short Position', 'Short Signal Message', group = 'Alert') 
 "o"  (Open Price): A floating-point number representing the opening price of the candle. This input is necessary when the "DetectionType" is set to "Signal". Otherwise, it can be any number or "na".
 "h"  (High Price): A float variable for the highest price of the candle. Required when "DetectionType" is "Signal"; in other cases, any number or "na" is acceptable.
 "l"  (Low Price): A float representing the lowest price of the candle. This field must be filled if "DetectionType" is "Signal". If not, it can be any number or "na".
 "c"  (Close Price): A floating-point variable indicating the closing price of the candle. Needed for "Signal" type detections; otherwise, it can take any value or "na".
 "Entry" : A float variable indicating the entry price into a trading setup. This is relevant when "DetectionType" is in "Setup" mode. In other scenarios, it can be any number or "na". It denotes the price at which the trade setup is entered.
 "TP"  (Take Profit): A float that is necessary when "DetectionType" is "Setup" and "SetupData" is "Full". Otherwise, it can be any number or "na". It signifies the price target for taking profits in a trading setup.
 "SL"  (Stop Loss): A float required when "DetectionType" is "Setup" and "SetupData" is "Full". It can be any number or "na" in other cases. This value represents the price at which a stop loss is set to limit losses.
 "Distal" : A float important for "Order Block Signal" detection. It can be any number or "na" if not in use. This variable indicates the price reaching the distal line of an order block.
 "Proximal" : A float needed for "Order Block Signal" detection mode. It can take any value or "na" otherwise. It marks the price reaching the proximal line of an order block.
footpint_drovingLibrary   "footpint_droving" 
methods for printing all footprint objects
 method print_droving(foot_bar, sup) 
  printing all footprint objects
  Namespace types: footprint_type.Footprint_bar
  Parameters:
     foot_bar (Footprint_bar type from dboichenko/footprint_type/1) : instance of Footprint_bar type
     sup (Support_objects type from dboichenko/footprint_type/1) : instance of Support_objects type
  Returns: Void.
footprint_typeLibrary   "footprint_type" 
Contains all types for calculating and rendering footprints
 Inputs 
  Inputs objects
  Fields:
     inbalance_percent (series int) : percentage coefficient to determine the Imbalance of price levels
     stacked_input (series int) : minimum number of consecutive Imbalance levels required to draw extended lines
     show_summary_footprint (series bool) : bool input for show summary footprint
     procent_volume_area (series int) : definition size Value area
     show_vah (series bool) : bool input for show VAH
     show_poc (series bool) : bool input for show POC
     show_val (series bool) : bool input for show VAL
     color_vah (series color) : color VAH line
     color_poc (series color) : color POC line
     color_val (series color) : color VAL line
     show_volume_profile (series bool) 
     new_imbalance_cond (series bool) : bool input for setup alert on new imbalance buy and sell
     new_imbalance_line_cond (series bool) : bool input for setup alert on new imbalance line buy and sell
     stop_past_imbalance_line_cond (series bool) : bool input for setup alert on stop past imbalance line buy and sell
 Constants 
  Constants all Constants objects
  Fields:
     imbalance_high_char (series string) : char for printing buy imbalance
     imbalance_low_char (series string) : char for printing sell imbalance
     color_title_sell (series color) : color for footprint sell
     color_title_buy (series color) : color for footprint buy
     color_line_sell (series color) : color for sell line
     color_line_buy (series color) : color for buy line
     color_title_none (series color) : color None
 Calculation_data 
  Calculation_data data for calculating
  Fields:
     detail_open (array) : array open from calculation timeframe
     detail_high (array) : array high from calculation timeframe
     detail_low (array) : array low from calculation timeframe
     detail_close (array) : array close from calculation timeframe
     detail_vol (array) : array volume from calculation timeframe
     previos_detail_close (array) : array close  from calculation timeframe
     isBuyVolume (series bool) : attribute previosly bar buy or sell
 Footprint_row 
  Footprint_row objects one footprint row
  Fields:
     price (series float) : row price
     buy_vol (series float) : buy volume
     sell_vol (series float) : sell volume
     imbalance_buy (series bool) : attribute buy inbalance
     imbalance_sell (series bool) : attribute sell imbalance
     buy_vol_box (series box) : for ptinting buy volume
     sell_vol_box (series box) : for printing sell volume
     buy_vp_box (series box) : for ptinting volume profile buy
     sell_vp_box (series box) : for ptinting volume profile sell
     row_line (series label) : for ptinting row price
     empty (series bool) : = true attribute row with zero volume buy and zero volume sell
 Value_area 
  Value_area objects for calculating and printing Value area
  Fields:
     vah_price (series float) : VAH price
     poc_price (series float) : POC price
     val_price (series float) : VAL price
     vah_label (series label) : label for VAH
     poc_label (series label) : label for POC
     val_label (series label) : label for VAL
     vah_line (series line) : line for VAH
     poc_level (series line) : line for POC
     val_line (series line) : line for VAL
 Imbalance_line_var_object 
  Imbalance_line_var_object var objects printing and calculation imbalance line
  Fields:
     cum_buy_line (array) : line array for saving all history buy imbalance line
     cum_sell_line (array) : line array for saving all history sell imbalance line
 Imbalance_line 
  Imbalance_line objects printing and calculation imbalance line
  Fields:
     buy_price_line (array) : float array for saving buy imbalance price level
     sell_price_line (array) : float array for saving sell imbalance price level
     var_imba_line (Imbalance_line_var_object) : var objects this type
 Footprint_info_var_object 
  Footprint_info_var_object var objects for info printing
  Fields:
     cum_delta (series float) : var delta volume
     cum_total (series float) : var total volume
     cum_buy_vol (series float) : var buy volume
     cum_sell_vol (series float) : var sell volume
     cum_info (series table) : table for ptinting
 Footprint_info 
  Footprint_info objects for info printing
  Fields:
     var_info (Footprint_info_var_object) : var objects this type
     total (series label) : total volume
     delta (series label) : delta volume
     summary_label (series label) : label for ptinting
 Footprint_bar 
  Footprint_bar all objects one bar with footprint
  Fields:
     foot_rows (array) : objects one row footprint
     val_area (Value_area) : objects Value area
     imba_line (Imbalance_line) : objects imbalance line
     info (Footprint_info) : objects info - table,label and their variable
     row_size (series float) : size rows
     total_vol (series float) : total volume one footprint bar
     foot_buy_vol (series float) : buy volume one footprint bar
     foot_sell_vol (series float) : sell volume one footprint bar
     foot_max_price_vol (map) : map with one value - price row with max volume buy + sell
     calc_data (Calculation_data) : objects with detail data from calculation resolution
 Support_objects 
  Support_objects support object for footprint calculation
  Fields:
     consts (Constants) : all consts objects
     inp (Inputs) : all input objects
     bar_index_show_condition (series bool) : calculation bool value for show all objects footprint
     row_line_color (series color) : calculation value - color for row price
ZigZag Library [TradingFinder]🔵 Introduction  
The "Zig Zag" indicator is an analytical tool that emerges from pricing changes. Essentially, it connects consecutive high and low points in an oscillatory manner. This method helps decipher price changes and can also be useful in identifying traditional patterns. 
By sifting through partial price changes, "Zig Zag" can effectively pinpoint price fluctuations within defined time intervals.
🔵 Key Features 
1. Drawing the Zig Zag based on Pivot points :
The algorithm is based on pivots that operate consecutively and alternately (switch between high and low swing). In this way, zigzag lines are connected from a swing high to a swing low and from a swing low to a swing high.
Also, with a very low probability, it is possible to have both low pivots and high pivots in one candle. In these cases, the algorithm tries to make the best decision to make the most suitable choice.
You can control what period these decisions are based on through the "PiPe" parameter.
  
2.Naming and labeling each pivot based on its position as "Higher High" (HH), "Lower Low" (LL), "Higher Low" (HL), and "Lower High" (LH).
Additionally, classic patterns such as HH, LH, LL, and HL can be recognized. All traders analyzing financial markets using classic patterns and Elliot Waves can benefit from the "zigzag" indicator to facilitate their analysis.
" HH ": When the price is higher than the previous peak (Higher High). 
" HL ": When the price is higher than the previous low (Higher Low). 
" LH ": When the price is lower than the previous peak (Lower High). 
" LL ": When the price is lower than the previous low (Lower Low). 
  
🔵 How to Use  
First, you can add the library to your code as shown in the example below.
 import TFlab/ZigZagLibrary_TradingFinder/1 as ZZ 
 Function "ZigZag" Parameters :
🟣 Logical Parameters 
1. HIGH : You should place the "high" value here. High is a float variable.
2. LOW : You should place the "low" value here. Low is a float variable.
3. BAR_INDEX : You should place the "bar_index" value here. Bar_index is an integer variable.
4. PiPe : The desired pivot period for plotting Zig Zag is placed in this parameter. For example, if you intend to draw a Zig Zag with a Swing Period of 5, you should input 5. 
PiPe is an integer variable.
 Important : 
Apart from the "PiPe" indicator, which is part of the customization capabilities of this indicator, you can create a multi-time frame mode for the indicator using 3 parameters "High", "Low" and "BAR_INDEX". In this way, instead of the data of the current time frame, use the data of other time frames.
Note that it is better to use the current time frame data, because using the multi-time frame mode is associated with challenges that may cause bugs in your code.
  
🟣 Setting Parameters 
5. SHOW_LINE : It's a boolean variable. When true, the Zig Zag line is displayed, and when false, the Zig Zag line display is disabled.
6. STYLE_LINE : In this variable, you can determine the style of the Zig Zag line. You can input one of the 3 options: line.style_solid, line.style_dotted, line.style_dashed. STYLE_LINE is a constant string variable.
7. COLOR_LINE : This variable takes the input of the line color.
8. WIDTH_LINE : The input for this variable is a number from 1 to 3, which is used to adjust the thickness of the line that draws the Zig Zag. WIDTH_LINE is an integer variable.
9. SHOW_LABEL : It's a boolean variable. When true, labels are displayed, and when false, label display is disabled.
10. COLOR_LABEL : The color of the labels is set in this variable.
11. SIZE_LABEL : The size of the labels is set in this variable. You should input one of the following options: size.auto, size.tiny, size.small, size.normal, size.large, size.huge.
12. Show_Support : It's a boolean variable that, when true, plots the last support line, and when false, disables its plotting.
13. Show_Resistance : It's a boolean variable that, when true, plots the last resistance line, and when false, disables its plotting.
 Suggestion : 
You can use the following code snippet to import Zig Zag into your code for time efficiency.
 //import Library
import TFlab/ZigZagLibrary_TradingFinder/1 as ZZ
// Input and Setting
// Zig Zag Line
ShZ = input.bool(true , 'Show Zig Zag Line', group = 'Zig Zag') //Show Zig Zag
PPZ = input.int(5 ,'Pivot Period Zig Zag Line' , group = 'Zig Zag') //Pivot Period Zig Zag
ZLS = input.string(line.style_dashed , 'Zig Zag Line Style' , options =  , group = 'Zig Zag' )
//Zig Zag Line Style
ZLC = input.color(color.rgb(0, 0, 0) , 'Zig Zag Line Color' , group = 'Zig Zag')  //Zig Zag Line Color
ZLW = input.int(1 , 'Zig Zag Line Width' , group = 'Zig Zag')//Zig Zag Line Width 
// Label
ShL = input.bool(true , 'Label', group = 'Label') //Show Label 
LC =  input.color(color.rgb(0, 0, 0) , 'Label Color' , group = 'Label')//Label Color
LS =  input.string(size.tiny , 'Label size' , options =  , group = 'Label' )//Label size
Show_Support= input.bool(false, 'Show Last Support',
 tooltip = 'Last Support' , group = 'Support and Resistance')
Show_Resistance = input.bool(false, 'Show Last Resistance',
 tooltip = 'Last Resistance' , group = 'Support and Resistance')
//Call Function
ZZ.ZigZag(high ,low ,bar_index ,PPZ , ShZ ,ZLS , ZLC, ZLW ,ShL , LC , LS , Show_Support , Show_Resistance ) 
MTF TREND-PANEL-(AS) 
0). INTRODUCTION: "MTF TREND-PANEL-(AS)" is a technical tool for traders who often perform multi-timeframe analysis.
This simple tool is meant for traders who wish to monitor and keep track of trend directions simultaneously on various timeframes, ranging from 1MIN to 3MONTHS (or other - 'DIFF')
script enhances decision-making efficiency and provides a clearer picture of market condition by integrating multiple timeframe analysis into a single panel.
1). WARNING!:
-script doesn't make any calculations on its own really but is more of a tool for traders to remember what is happening on other time frames
- use tooltips to navigate settings easier
2). MAIN OPTIONS:
- Keeps track of up to 7 timeframes. (NUMBER of TimeFrames setting, from 1-7)
- Customizable Display: Choose to display nothing, upward/downward arrows, or a range indication for each timeframe.
- timeframe options: '1-MIN','5-MIN','15-MIN','30-MIN','1H','4H','1D','1W','1M','3M','DIFF'
- Color Coding: Define your preferred colors for each timeframe
- set position of the table and size of text (Position/text)
- Personal Touch: Add your own trading maxim or motto for inspiration to show up when SHOW TEXT is turned on
3. )OPTIONS:
-NUMBER of TimeFrames setting: from 1-7 - how many rows to show
-SHOW TABLE: Toggle to display or hide the trend table panel.
-SHOW TEXT: Show or hide your personalized trading maxim.
-SHOW TREND: Enable to display trend direction arrows.
-SHOW_CLRS: Turn on to activate color coding for each timeframe.
-position/text size for table
-settings for each timeframe:color,time,trend
-place to type ur own text
5). How to Use the Script:
-After adding the script to your chart, use the 'NUMBER of TimeFrames' setting to select how many timeframes you want to track (1 to 7).
-Customize the appearance of each timeframe row using the color and arrow options.
-For trend analysis, the script offers arrows to indicate upward, downward, or ranging markets.
-decide what trend dominates particular TF (using other tools  - script does not calculate trend on its own )
- mark trends on panel to keep track of all TF
-Enable or disable various features like the table panel, trader maxim, and color coding using the ON/OFF options.
6). just in case:
- ask me anything about the code
-don't be shy to report any bugs or offer improvements of any kind.
- originally created for @ict_whiz and made public at his request
Material Design ColorsThis library provides a standard set of colors defined in Material Design 2.0.
🔵 API
Step 1: Import this library.
 
import algotraderdev/material/1
// remember to check the latest version of this library and replace the 1 above.
 
Step 2: Get the color you like. Check the source code or the screenshot above to see all the supported colors.
 
material.red()
 
Each color function (except for `black()` and `white()`) accepts an optional `variant` parameter. You can choose any of 50, 100, 200, 300, 400, 500, 600, 700, 800, and 900. By default, 500 is chosen if this parameter is not provided.
LineWrapperLibrary   "LineWrapper" 
Wrapper Type for Line. Useful when you want to store the line details without drawing them. Can also be used in scnearios where you collect lines to be drawn and draw together towards the end.
 method draw(this) 
  draws line as per the wrapper object contents
  Namespace types: Line
  Parameters:
     this (Line) : (series Line) Line object.
  Returns: current Line object
 method draw(this) 
  draws lines as per the wrapper object array
  Namespace types: Line 
  Parameters:
     this (Line ) : (series array) Array of Line object.
  Returns: current Array of Line objects
 method update(this) 
  updates or redraws line as per the wrapper object contents
  Namespace types: Line
  Parameters:
     this (Line) : (series Line) Line object.
  Returns: current Line object
 method update(this) 
  updates or redraws lines as per the wrapper object array
  Namespace types: Line 
  Parameters:
     this (Line ) : (series array) Array of Line object.
  Returns: current Array of Line objects
 method delete(this) 
  Deletes the underlying line drawing object
  Namespace types: Line
  Parameters:
     this (Line) : (series Line) Line object.
  Returns: Current Line object
 method get_price(this, bar) 
  get line price based on bar
  Namespace types: Line
  Parameters:
     this (Line) : (series Line) Line object.
     bar (int) : (series/int) bar at which line price need to be calculated
  Returns: line price at given bar.
 Line 
  Line Wrapper object
  Fields:
     p1 (chart.point) 
     p2 (chart.point) 
     xloc (series string) : (series string) See description of x1 argument. Possible values: xloc.bar_index and xloc.bar_time. Default is xloc.bar_index.
     extend (series string) : (series string) If extend=extend.none, draws segment starting at point (x1, y1) and ending at point (x2, y2). If extend is equal to extend.right or extend.left, draws a ray starting at point (x1, y1) or (x2, y2), respectively. If extend=extend.both, draws a straight line that goes through these points. Default value is extend.none.
     color (series color) : (series color) Line color.
     style (series string) : (series string) Line style. Possible values: line.style_solid, line.style_dotted, line.style_dashed, line.style_arrow_left, line.style_arrow_right, line.style_arrow_both.
     width (series int) : (series int) Line width in pixels.
     obj (series line) : line object
TTB_TableBuilderLibrary   "TTB_TableBuilder" 
A helper library to make it simpler to create tables in pinescript
 DefaultDarkStyle() 
 method Size(this, width, height) 
  Change the size (width, height) of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     width (int) 
     height (int) 
  Returns: Cell
 method Size(this, width, height) 
  Change the width of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     width (int) 
     height (int) 
  Returns: Row
 method Width(this, width) 
  Change the width of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     width (int) 
  Returns: Cell
 method Width(this, width) 
  Change the width of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     width (int) 
  Returns: Row
 method Height(this, height) 
  Change the height of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     height (int) 
  Returns: Cell
 method Height(this, height) 
  Change the height of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     height (int) 
  Returns: Row
 method Text(this, text_) 
  Change the text of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     text_ (string) 
  Returns: Cell
 method Text(this, c0, c1, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29) 
  Set text
  Namespace types: Row
  Parameters:
     this (Row) 
     c0 (string) : ... c29
     c1 (string) 
     c3 (string) 
     c4 (string) 
     c5 (string) 
     c6 (string) 
     c7 (string) 
     c8 (string) 
     c9 (string) 
     c10 (string) 
     c11 (string) 
     c12 (string) 
     c13 (string) 
     c14 (string) 
     c15 (string) 
     c16 (string) 
     c17 (string) 
     c18 (string) 
     c19 (string) 
     c20 (string) 
     c21 (string) 
     c22 (string) 
     c23 (string) 
     c24 (string) 
     c25 (string) 
     c26 (string) 
     c27 (string) 
     c28 (string) 
     c29 (string) 
  Returns: Row
 method TextSize(this, text_size) 
  Change the text size of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     text_size (string) 
  Returns: Cell
 method TextSize(this, text_size) 
  Set text size
  Namespace types: Row
  Parameters:
     this (Row) 
     text_size (string) 
  Returns: Row
 method TextColor(this, c) 
  Change the text color of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     c (color) 
  Returns: Cell
 method TextColor(this, text_color) 
  Change the text color of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     text_color (color) 
  Returns: Row
 method Bg(this, c) 
  Change the background color of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     c (color) 
  Returns: Cell
 method Bg(this, bg) 
  Change the background color of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     bg (color) 
  Returns: Row
 method Font(this, text_font_family) 
  Change the font family of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     text_font_family (string) 
  Returns: Cell
 method Font(this, text_font_family) 
  Change the width of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     text_font_family (string) 
  Returns: Row
 method AlignH(this, halign) 
  Change the horizontal align of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     halign (string) 
  Returns: Cell
 method AlignH(this, halign) 
  Change the horizontal align of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     halign (string) 
  Returns: Cell
 method AlignV(this, valign) 
  Change the vertical align of the table cell.
  Namespace types: Cell
  Parameters:
     this (Cell) 
     valign (string) 
  Returns: Cell
 method AlignV(this, valign) 
  Change the vertical of all cells in that row
  Namespace types: Row
  Parameters:
     this (Row) 
     valign (string) 
  Returns: Cell
 method C(this, column) 
  Get the cell corresponding to the column number
  Namespace types: Row
  Parameters:
     this (Row) 
     column (int) 
  Returns: Cell
 method C(this, column, row) 
  Namespace types: Table
  Parameters:
     this (Table) 
     column (int) 
     row (int) 
 method R(this, row) 
  Namespace types: Table
  Parameters:
     this (Table) 
     row (int) 
 method Style(this, style) 
  Namespace types: Table
  Parameters:
     this (Table) 
     style (TableStyle) 
 method Position(this, position) 
  Namespace types: Table
  Parameters:
     this (Table) 
     position (string) 
 new(position, columns, rows, style) 
  Parameters:
     position (string) 
     columns (int) 
     rows (int) 
     style (TableStyle) 
 CellStyle 
  Fields:
     text_color (series__color) 
     text_halign (series__string) 
     text_valign (series__string) 
     text_size (series__integer) 
     bgcolor (series__color) 
     tooltip (series__string) 
     text_font_family (series__string) 
 TableStyle 
  Fields:
     bgcolor (series__color) 
     frame_color (series__color) 
     frame_width (series__integer) 
     border_color (series__color) 
     border_width (series__integer) 
     default_cell_style (|CellStyle|#OBJ) 
 Cell 
  Fields:
     ref (series__table) 
     column (series__integer) 
     row (series__integer) 
 Row 
  Fields:
     ref (series__table) 
     row (series__integer) 
     cells (array__|Cell|#OBJ) 
 Table 
  Fields:
     body (series__table) 
     rows (array__|Row|#OBJ)
Mad_FibonacciboxLibrary   "Mad_Fibonaccibox" 
This library is designed to create and manage multiple Fibonacci boxes, which are graphical representations based on the inputs.
-----------------
exports:
 f_fib_calc(_Fibonacci_box, _itemnumber) 
  fibonacci calc.
@description This function block uses the levels and paramters set into the type_fibonacci_box(levels) and fills the corresponding array of prices.
  Parameters:
     _Fibonacci_box (type_Fibonacci_box ) 
     _itemnumber (int) 
  Returns: returns a type_Fibonacci_box with the filled data
 f_fib_draw(_Fibonacci_box, _itemnumber) 
  fibonacci draw.
@description This function block uses the levels, prices and paramters set into the type_fibonacci_box(levels) and draws the fib on the chart
  Parameters:
     _Fibonacci_box (type_Fibonacci_box ) 
     _itemnumber (int) 
  Returns: returns lines labels and fills on the chart, no data returns
 type_level 
  s for defining a lines and texts of a fibonacci box
  Fields:
     level (series float) 
     price (series float) 
     drawline (series bool) 
     linewidth (series int) 
     linetype (series string) 
     fiblinecolor (series color) 
     drawlabel (series string) 
     labeltext (series string) 
     textshift (series int) 
     fibtextcolor (series color) 
     fibtextsize (series string) 
     transp (series int) 
 type_fill 
  s for defining the fills of a fibonaccibox
  Fields:
     partner_A (series int) 
     partner_B (series int) 
     fill_color (series color) 
     transp (series int) 
 type_Fibonacci_box 
  s for defining a fibonacci box
  Fields:
     bottom_price (series float) 
     top_price (series float) 
     StartBar (series int) 
     StopBar (series int) 
     levels (type_level ) 
     fills (type_fill ) 
     ChartisLog (series bool) 
     fibreverse (series bool) 
     fibdrawreverse (series bool) 
     decimals_price (series int) 
     decimals_percent (series int) 
     drawlines (series bool) 
     drawlabels (series bool) 
     drawfills (series bool) 
     draw_biginfo (series bool) 
     biginfo_textshift (series int) 
     rangeinfo_location (series int) 
     rangeinfo_color (series color) 
     rangeinfo_textsize (series string) 
     line_array (line ) 
     linefill_array (linefill ) 
     label_array (label )
GuageLibrary   "Gauge" 
The gauge library utilizes a  gaugeParams  object, encapsulating crucial parameters for gauge creation. Essential attributes include  num   (the measured value) ,  min   (the minimum value equating to 100% on the gauge's minimum scale) , and  max   (the maximum value equating to 100% on the gauge's maximum scale) . The  size  attribute  (defaulting to 10)  splits the scale into increments, each representing 100% divided by the specified size.
The  num  value dynamically shifts within the gauge based on its percentage move from the mathematical average between  min  and  max . When  num  is below the average, the minimum portion of the scale activates, displaying the appropriate percentage based on the distance from the average to the minimum. The same principle applies when  num  exceeds the average. The 100% scale is reached at either end when  num  equals  min  or  max .
The library offers full customization, allowing users to configure color schemes, labels, and titles. The gauge can be displayed either vertically  (default)  or horizontally. The colors employ a gradient, adapting based on the number's movement. Overall, the gauge library provides a flexible and comprehensive tool for visualizing and interpreting numerical values within a specified range.
TableUtilsLibrary   "TableUtils" 
Collection of table utility functions
 getTablePositionByLabel(tablePosition) 
  Return the position for the table by given label. Useful if you want to control the position of the table with a pine script input selector that use a more human friendly labels
  Parameters:
     tablePosition (string) : (string) Label of the table position. Possible values are: "Top left", "Top right", "Bottom left", "Bottom right", "Middle left", "Middle right"
  Returns: the position for the table by given label. Useful if you want to control the position of the table with a pine script input selector that use a more human friendly labels
TouchedLibrary   "Touched" 
 Breakout(zone, lookback) 
  Tells if the zone has been broken on the current bar.
  Parameters:
     zone (Zone) : The definitiin of the zone.
     lookback (int) : How many bars to look back.
  Returns: a Touch object that tells if the zone has been broken up or down.
 FalseBreakout(zone, lookback) 
  Tells if the zone has a false breakout on the current bar.
  Parameters:
     zone (Zone) : The definitiin of the zone.
     lookback (int) : How many bars to look back.
  Returns: a Touch object that tells if the zone has had a false breakout up or down.
 Retest(zone, lookback) 
  Tells if the zone has been retested on the current bar.
  Parameters:
     zone (Zone) : The definitiin of the zone.
     lookback (int) : How many bars to look back.
  Returns: a Touch object that tells if the zone has been retested up or down.
 Zone 
  Fields:
     High (series__float) 
     Low (series__float) 
     BaseTime (series__integer) 
 Touch 
  Fields:
     Up (series__bool) 
     Down (series__bool)
StrategyDashboardLibrary ”StrategyDashboard”
Hey, everybody!
I haven’t done anything here for a long time, I need to get better ^^.
In my strategies, so far private, but not about that, I constantly use dashboards, which clearly show how my strategy is working out.
Of course, you can also find a number of these parameters in the standard strategy window, but I prefer to display everything on the screen, rather than digging through a bunch of boxes and dropdowns.
At the moment I am using 2 dashboards, which I would like to share with you.
1. monthly(isShow)
this is a dashboard with the breakdown of profit by month in per cent. That is, it displays how much percentage you made or lost in a particular month, as well as for the year as a whole.
Parameters:
  isShow (bool) - determine allowance to display or not.
2. total(isShow)
The second dashboard displays more of the standard strategy information, but in a table format. Information from the series “number of consecutive losers, number of consecutive wins, amount of earnings per day, etc.”.
Parameters:
  isShow (bool) - determine allowance to display or not.
Since I prefer the dark theme of the interface, now they are adapted to it, but in the near future for general convenience I will add the ability to adapt to light.
The same goes for the colour scheme, now it is adapted to the one I use in my strategies (because the library with more is made by cutting these dashboards from my strategies), but will also make customisable part.
If you have any wishes, feel free to write in the comments, maybe I can implement and add them in the next versions.
Statistics TableStrategy Statistics 
This library will add a table with statistics from your strategy. With this library, you won't have to switch to your strategy tester tab to view your results and positions.
 Usage: 
You can choose whether to set the table by input fields by adding the below code to your strategy or replace the parameters with the ones you would like to use manually.
 
// Statistics table options.
statistics_table_enabled = input.string(title='Show a table with statistics', defval='YES', options= , group='STATISTICS')
statistics_table_position = input.string(title='Position', defval='RIGHT', options= , group='STATISTICS')
statistics_table_margin = input.int(title='Table Margin', defval=10, minval=0, maxval=100, step=1, group='STATISTICS')
statistics_table_transparency = input.int(title='Cell Transparency', defval=20, minval=1, maxval=100, step=1, group='STATISTICS')
statistics_table_text_color = input.color(title='Text Color', defval=color.new(color.white, 0), group='STATISTICS')
statistics_table_title_cell_color = input.color(title='Title Cell Color', defval=color.new(color.gray, 80), group='STATISTICS')
statistics_table_cell_color = input.color(title='Cell Color', defval=color.new(color.purple, 0), group='STATISTICS')
// Statistics table init.
statistics.table(strategy.initial_capital, close, statistics_table_enabled, statistics_table_position, statistics_table_margin, statistics_table_transparency, statistics_table_text_color, statistics_table_title_cell_color, statistics_table_cell_color)
 
 Sample: 
If you are interested in the strategy used for this statistics table, you can browse the strategies on my profile.
TableLibrary   "Table" 
This library provides an easy way to convert arrays and matrixes of data into tables. There are a few different implementations of each function so you can get more or less control over the appearance of the tables. The basic rule of thumb is that all matrix rows must have the same number of columns, and if you are providing multiple arrays/matrixes to specify additional colors (background/text), they must have the same number of rows/columns as the data array. Finally, you do have the option of spanning cells across rows or columns with some special syntax in the data cell. Look at the examples to see how the arrays and matrixes need to be built before they can be used by the functions.
 floatArrayToCellArray(floatArray) 
  Helper function that converts a float array to a Cell array so it can be rendered with the fromArray function
  Parameters:
     floatArray (float ) : (array) the float array to convert to a Cell array.
  Returns: array The Cell array to return.
 stringArrayToCellArray(stringArray) 
  Helper function that converts a string array to a Cell array so it can be rendered with the fromArray function
  Parameters:
     stringArray (string ) : (array) the array to convert to a Cell array.
  Returns: array The Cell array to return.
 floatMatrixToCellMatrix(floatMatrix) 
  Helper function that converts a float matrix to a Cell matrix so it can be rendered with the fromMatrix function
  Parameters:
     floatMatrix (matrix) : (matrix) the float matrix to convert to a string matrix.
  Returns: matrix The Cell matrix to render.
 stringMatrixToCellMatrix(stringMatrix) 
  Helper function that converts a string matrix to a Cell matrix so it can be rendered with the fromMatrix function
  Parameters:
     stringMatrix (matrix) : (matrix) the string matrix to convert to a Cell matrix.
  Returns: matrix The Cell matrix to return.
 fromMatrix(CellMatrix, position, verticalOffset, transposeTable, textSize, borderWidth, tableNumRows, blankCellText) 
  Takes a CellMatrix and renders it as a table.
  Parameters:
     CellMatrix (matrix) : (matrix) The Cells to be rendered in a table
     position (string) : (string) Optional. The position of the table. Defaults to position.top_right
     verticalOffset (int) : (int) Optional. The vertical offset of the table from the top or bottom of the chart. Defaults to 0.
     transposeTable (bool) : (bool) Optional. Will transpose all of the data in the matrices before rendering. Defaults to false.
     textSize (string) : (string) Optional. The size of text to render in the table. Defaults to size.small.
     borderWidth (int) : (int) Optional. The width of the border between table cells. Defaults to 2.
     tableNumRows (int) : (int) Optional. The number of rows in the table. Not required, defaults to the number of rows in the provided matrix. If your matrix will have a variable number of rows, you must provide the max number of rows or the function will error when it attempts to set a cell value on a row that the table hadn't accounted for when it was defined.
     blankCellText (string) : (string) Optional. Text to use cells when adding blank rows for vertical offsetting.
 fromMatrix(dataMatrix, position, verticalOffset, transposeTable, textSize, borderWidth, tableNumRows, blankCellText) 
  Renders a float matrix as a table.
  Parameters:
     dataMatrix (matrix) : (matrix_float) The data to be rendered in a table
     position (string) : (string) Optional. The position of the table. Defaults to position.top_right
     verticalOffset (int) : (int) Optional. The vertical offset of the table from the top or bottom of the chart. Defaults to 0.
     transposeTable (bool) : (bool) Optional. Will transpose all of the data in the matrices before rendering. Defaults to false.
     textSize (string) : (string) Optional. The size of text to render in the table. Defaults to size.small.
     borderWidth (int) : (int) Optional. The width of the border between table cells. Defaults to 2.
     tableNumRows (int) : (int) Optional. The number of rows in the table. Not required, defaults to the number of rows in the provided matrix. If your matrix will have a variable number of rows, you must provide the max number of rows or the function will error when it attempts to set a cell value on a row that the table hadn't accounted for when it was defined.
     blankCellText (string) : (string) Optional. Text to use cells when adding blank rows for vertical offsetting.
 fromMatrix(dataMatrix, position, verticalOffset, transposeTable, textSize, borderWidth, tableNumRows, blankCellText) 
  Renders a string matrix as a table.
  Parameters:
     dataMatrix (matrix) : (matrix_string) The data to be rendered in a table
     position (string) : (string) Optional. The position of the table. Defaults to position.top_right
     verticalOffset (int) : (int) Optional. The vertical offset of the table from the top or bottom of the chart. Defaults to 0.
     transposeTable (bool) : (bool) Optional. Will transpose all of the data in the matrices before rendering. Defaults to false.
     textSize (string) : (string) Optional. The size of text to render in the table. Defaults to size.small.
     borderWidth (int) : (int) Optional. The width of the border between table cells. Defaults to 2.
     tableNumRows (int) : (int) Optional. The number of rows in the table. Not required, defaults to the number of rows in the provided matrix. If your matrix will have a variable number of rows, you must provide the max number of rows or the function will error when it attempts to set a cell value on a row that the table hadn't accounted for when it was defined.
     blankCellText (string) : (string) Optional. Text to use cells when adding blank rows for vertical offsetting.
 fromArray(dataArray, position, verticalOffset, transposeTable, textSize, borderWidth, blankCellText) 
  Renders a Cell array as a table.
  Parameters:
     dataArray (Cell ) : (array) The data to be rendered in a table
     position (string) : (string) Optional. The position of the table. Defaults to position.top_right
     verticalOffset (int) : (int) Optional. The vertical offset of the table from the top or bottom of the chart. Defaults to 0.
     transposeTable (bool) : (bool) Optional. Will transpose all of the data in the matrices before rendering. Defaults to false.
     textSize (string) : (string) Optional. The size of text to render in the table. Defaults to size.small.
     borderWidth (int) : (int) Optional. The width of the border between table cells. Defaults to 2.
     blankCellText (string) : (string) Optional. Text to use cells when adding blank rows for vertical offsetting.
 fromArray(dataArray, position, verticalOffset, transposeTable, textSize, borderWidth, blankCellText) 
  Renders a string array as a table.
  Parameters:
     dataArray (string ) : (array_string) The data to be rendered in a table
     position (string) : (string) Optional. The position of the table. Defaults to position.top_right
     verticalOffset (int) : (int) Optional. The vertical offset of the table from the top or bottom of the chart. Defaults to 0.
     transposeTable (bool) : (bool) Optional. Will transpose all of the data in the matrices before rendering. Defaults to false.
     textSize (string) : (string) Optional. The size of text to render in the table. Defaults to size.small.
     borderWidth (int) : (int) Optional. The width of the border between table cells. Defaults to 2.
     blankCellText (string) : (string) Optional. Text to use cells when adding blank rows for vertical offsetting.
 fromArray(dataArray, position, verticalOffset, transposeTable, textSize, borderWidth, blankCellText) 
  Renders a float array as a table.
  Parameters:
     dataArray (float ) : (array_float) The data to be rendered in a table
     position (string) : (string) Optional. The position of the table. Defaults to position.top_right
     verticalOffset (int) : (int) Optional. The vertical offset of the table from the top or bottom of the chart. Defaults to 0.
     transposeTable (bool) : (bool) Optional. Will transpose all of the data in the matrices before rendering. Defaults to false.
     textSize (string) : (string) Optional. The size of text to render in the table. Defaults to size.small.
     borderWidth (int) : (int) Optional. The width of the border between table cells. Defaults to 2.
     blankCellText (string) : (string) Optional. Text to use cells when adding blank rows for vertical offsetting.
 debug(message, position) 
  Renders a debug message in a table at the desired location on screen.
  Parameters:
     message (string) : (string) The message to render.
     position (string) : (string) Optional. The position of the debug message. Defaults to position.middle_right.
 Cell 
  Type for each cell's content and appearance
  Fields:
     content (series string) 
     bgColor (series color) 
     textColor (series color) 
     align (series string) 
     colspan (series int) 
     rowspan (series int)
UtilsLibrary   "Utils" 
A collection of convenience and helper functions for indicator and library authors on TradingView
 formatNumber(num) 
  My version of format number that doesn't have so many decimal places...
  Parameters:
     num (float) : (float) the number to be formatted
  Returns: (string) The formatted number
 getDateString(timestamp) 
  Convenience function returns timestamp in yyyy/MM/dd format.
  Parameters:
     timestamp (int) : (int) The timestamp to stringify
  Returns: (int) The date string
 getDateTimeString(timestamp) 
  Convenience function returns timestamp in yyyy/MM/dd hh:mm format.
  Parameters:
     timestamp (int) : (int) The timestamp to stringify
  Returns: (int) The date string
 getInsideBarCount() 
  Gets the number of inside bars for the current chart. Can also be passed to request.security to get the same for different timeframes.
  Returns: (int) The # of inside bars on the chart right now.
 getLabelStyleFromString(styleString, acceptGivenIfNoMatch) 
  Tradingview doesn't give you a nice way to put the label styles into a dropdown for configuration settings. So, I specify them in the following format:  . This function takes care of converting those custom strings back to the ones expected by tradingview scripts.
  Parameters:
     styleString (string) 
     acceptGivenIfNoMatch (bool) : (bool) If no match for styleString is found and this is true, the function will return styleString, otherwise it will return tradingview's preferred default
  Returns: (string) The string expected by tradingview functions
 getTime(hourNumber, minuteNumber) 
  Given an hour number and minute number, adds them together and returns the sum. To be used by getLevelBetweenTimes when fetching specific price levels during a time window on the day.
  Parameters:
     hourNumber (int) : (int) The hour number
     minuteNumber (int) : (int) The minute number
  Returns: (int) The sum of all the minutes
 getHighAndLowBetweenTimes(start, end) 
  Given a start and end time, returns the high or low price during that time window.
  Parameters:
     start (int) : The timestamp to start with (# of seconds)
     end (int) : The timestamp to end with (# of seconds)
  Returns: (float) The high or low value
 getPremarketHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the premarket high & low levels in a tuple.
  Returns: (tuple)  
 getAfterHoursHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the after hours high & low levels in a tuple.
  Returns: (tuple)  
 getOvernightHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the overnight high & low levels in a tuple.
  Returns: (tuple)  
 getNonRthHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the high & low levels for premarket, after hours and overnight in a tuple.
  Returns: (tuple)  
 getLineStyleFromString(styleString, acceptGivenIfNoMatch) 
  Tradingview doesn't give you a nice way to put the line styles into a dropdown for configuration settings. So, I specify them in the following format:  . This function takes care of converting those custom strings back to the ones expected by tradingview scripts.
  Parameters:
     styleString (string) : (string) Plain english (or TV Standard) version of the style string
     acceptGivenIfNoMatch (bool) : (bool) If no match for styleString is found and this is true, the function will return styleString, otherwise it will return tradingview's preferred default
  Returns: (string) The string expected by tradingview functions
 getPercentFromPrice(price) 
  Get the % the current price is away from the given price.
  Parameters:
     price (float) 
  Returns: (float) The % the current price is away from the given price.
 getPositionFromString(position) 
  Tradingview doesn't give you a nice way to put the positions into a dropdown for configuration settings. So, I specify them in the following format:  . This function takes care of converting those custom strings back to the ones expected by tradingview scripts.
  Parameters:
     position (string) : (string) Plain english position string
  Returns: (string) The string expected by tradingview functions
 getTimeframeOfChart() 
  Get the timeframe of the current chart for display
  Returns: (string) The string of the current chart timeframe
 getTimeNowPlusOffset(candleOffset) 
  Helper function for drawings that use xloc.bar_time to help you know the time offset if you want to place the end of the drawing out into the future. This determines the time-size of one candle and then returns a time n candleOffsets into the future.
  Parameters:
     candleOffset (int) : (int) The number of items to find singular/plural for.
  Returns: (int) The future time
 getVolumeBetweenTimes(start, end) 
  Given a start and end time, returns the sum of all volume across bars during that time window.
  Parameters:
     start (int) : The timestamp to start with (# of seconds)
     end (int) : The timestamp to end with (# of seconds)
  Returns: (float) The volume
 isToday() 
  Returns true if the current bar occurs on today's date.
  Returns: (bool) True if current bar is today
 padLabelString(labelText, labelStyle) 
  Pads a label string so that it appears properly in or not in a label. When label.style_none is used, this will make sure it is left-aligned instead of center-aligned. When any other type is used, it adds a single space to the right so there is padding against the right end of the label.
  Parameters:
     labelText (string) : (string) The string to be padded
     labelStyle (string) : (string) The style of the label being padded for.
  Returns: (string) The padded string
 plural(num, singular, plural) 
  Helps format a string for plural/singular. By default, if you only provide num, it will just return "s" for plural and nothing for singular (eg. plural(numberOfCats)). But you can optionally specify the full singular/plural words for more complicated nomenclature (eg. plural(numberOfBenches, 'bench', 'benches'))
  Parameters:
     num (int) : (int) The number of items to find singular/plural for.
     singular (string) : (string) The string to return if num is singular. Defaults to an empty string.
     plural (string) : (string) The string to return if num is plural. Defaults to 's' so you can just add 's' to the end of a word.
  Returns: (string) The singular or plural provided strings depending on the num provided.
 timeframeInSeconds(timeframe) 
  Get the # of seconds in a given timeframe. Tradingview's timeframe.in_seconds() expects a simple string, and we often need to use series string, so this is an alternative to get you the value you need.
  Parameters:
     timeframe (string) 
  Returns: (int) The number of secondsof that timeframe
 timeframeToString(tf) 
  Convert a timeframe string to a consistent standard.
  Parameters:
     tf (string) : (string) The timeframe string to convert
  Returns: (string) The standard format for the string, or the unchanged value if it is unknown.
Polyline PlusThis library introduces the `PolylinePlus` type, which is an enhanced version of the built-in PineScript `polyline`. It enables two features that are absent from the built-in type:
1. Developers can now efficiently add or remove points from the polyline. In contrast, the built-in `polyline` type is immutable, requiring developers to create a new instance of the polyline to make changes, which is cumbersome and incurs a significant performance penalty.
2. Each `PolylinePlus` instance can theoretically hold up to ~1M points, surpassing the built-in `polyline` type's limit of 10K points, as long as it does not exceed the memory limit of the PineScript runtime.
Internally, each `PolylinePlus` instance utilizes an array of `line`s and an array of `polyline`s. The `line`s array serves as a buffer to store lines formed by recently added points. When the buffer reaches its capacity, it flushes the contents and converts the lines into polylines. These polylines are expected to undergo fewer updates. This approach is similiar to the concept of "Buffered I/O" in file and network systems. By connecting the underlying lines and polylines, this library achieves an enhanced polyline that is dynamic, efficient, and capable of surpassing the maximum number of points imposed by the built-in polyline.
🔵  API 
Step 1: Import this library
 
import algotraderdev/polylineplus/1 as pp
// remember to check the latest version of this library and replace the 1 above.
 
Step 2: Initialize the `PolylinePlus` type.
 
var p = pp.PolylinePlus.new()
 
There are a few optional params that developers can specify in the constructor to modify the behavior and appearance of the polyline instance.
 
var p = pp.PolylinePlus.new(
  // If true, the drawing will also connect the first point to the last point, resulting in a closed polyline.
  closed = false,
  // Determines the field of the chart.point objects that the polyline will use for its x coordinates. Either xloc.bar_index (default), or xloc.bar_time.
  xloc = xloc.bar_index,
  // Color of the polyline. Default is blue.
  line_color = color.blue,
  // Style of the polyline. Default is line.style_solid.
  line_style = line.style_solid,
  // Width of the polyline. Default is 1.
  line_width = 1,
  // The maximum number of points that each built-in `polyline` instance can contain.
  // NOTE: this is not to be confused with the maximum of points that each `PolylinePlus` instance can contain.
  max_points_per_builtin_polyline = 10000,
  // The number of lines to keep in the buffer. If more points are to be added while the buffer is full, then all the lines in the buffer will be flushed into the poylines. 
  // The higher the number, the less frequent we'll need to // flush the buffer, and thus lead to better performance.
  // NOTE: the maximum total number of lines per chart allowed by PineScript is 500. But given there might be other places where the indicator or strategy are drawing lines outside this polyline context, the default value is 50 to be safe.
  lines_bffer_size = 50)
 
Step 3: Push / Pop Points
 
// Push a single point
p.push_point(chart.point.now())
// Push multiple points
chart.point  points = array.from(p1, p2, p3) // Where p1, p2, p3 are all chart.point type.
p.push_points(points)
// Pop point
p.pop_point()
// Resets all the points in the polyline.
p.set_points(points)
// Deletes the polyline.
p.delete()
 
🔵  Benchmark 
Below is a simple benchmark comparing the performance between `PolylinePlus` and the native `polyline` type for incrementally adding 10K points to a polyline.
 
import algotraderdev/polylineplus/2 as pp
var t1 = 0
var t2 = 0
if bar_index < 10000
    int start = timenow
    var p = pp.PolylinePlus.new(xloc = xloc.bar_time, closed = true)
    p.push_point(chart.point.now())
    t1 += timenow - start
    start := timenow
    var polyline pl = na
    var points = array.new()
    points.push(chart.point.now())
    if not na(pl)
        pl.delete()
    pl := polyline.new(points)
    t2 += timenow - start
if barstate.islast
    log.info('{0} {1}', t1, t2)
 
For this benchmark, `PolylinePlus` took ~300ms, whereas the native `polyline` type took ~6000ms.
We can also fine-tune the parameters for `PolylinePlus` to have a larger buffer size for `line`s and a smaller buffer for `polyline`s.
 
var p = pp.PolylinePlus.new(xloc = xloc.bar_time, closed = true, lines_buffer_size = 500, max_points_per_builtin_polyline = 1000)
 
With the above optimization, it only took `PolylinePlus` ~80ms to process the same 10K points, which is ~75x the performance compared to the native `polyline`.
lib_plot_composite_objectsLibrary   "lib_plot_composite_objects" 
library building on top of lib_plot_objects for composite objects such as Triangles and Polygons. heavily using chart.points
 method tostring(this, date_format) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
     date_format (simple string) 
 method tostring(this, date_format) 
  Namespace types: TriangleFill
  Parameters:
     this (TriangleFill) 
     date_format (simple string) 
 method tostring(this, date_format) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
     date_format (simple string) 
 method tostring(this, date_format) 
  Namespace types: PolygonFill
  Parameters:
     this (PolygonFill) 
     date_format (simple string) 
 method tostring(this, date_format) 
  Namespace types: Triangle 
  Parameters:
     this (Triangle ) 
     date_format (simple string) 
 method tostring(this, date_format) 
  Namespace types: Polygon 
  Parameters:
     this (Polygon ) 
     date_format (simple string) 
 method tostring(this, date_format) 
  Namespace types: TriangleFill 
  Parameters:
     this (TriangleFill ) 
     date_format (simple string) 
 method tostring(this, date_format) 
  Namespace types: PolygonFill 
  Parameters:
     this (PolygonFill ) 
     date_format (simple string) 
 method create_triangle(this, b, c, args) 
  Namespace types: chart.point
  Parameters:
     this (chart.point) 
     b (chart.point) 
     c (chart.point) 
     args (LineArgs type from robbatt/lib_plot_objects/32) 
 method create_triangle(this, c) 
  Namespace types: D.Line
  Parameters:
     this (Line type from robbatt/lib_plot_objects/32) 
     c (chart.point) 
 method create_polygon(points, args) 
  Namespace types: chart.point 
  Parameters:
     points (chart.point ) 
     args (LineArgs type from robbatt/lib_plot_objects/32) 
 method create_polygon(start, others, args) 
  Namespace types: chart.point
  Parameters:
     start (chart.point) 
     others (chart.point ) 
     args (LineArgs type from robbatt/lib_plot_objects/32) 
 method create_fill(this, fill_color) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
     fill_color (color) 
 method create_fill(this, fill_color) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
     fill_color (color) 
 method create_center_label(this, txt, args, tooltip) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
     txt (string) 
     args (LabelArgs type from robbatt/lib_plot_objects/32) 
     tooltip (string) 
 method create_label(this, txt, args, tooltip) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
     txt (string) 
     args (LabelArgs type from robbatt/lib_plot_objects/32) 
     tooltip (string) 
 method nz(this, default) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
     default (Triangle) 
 method nz(this, default) 
  Namespace types: TriangleFill
  Parameters:
     this (TriangleFill) 
     default (TriangleFill) 
 method nz(this, default) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
     default (Polygon) 
 method nz(this, default) 
  Namespace types: PolygonFill
  Parameters:
     this (PolygonFill) 
     default (PolygonFill) 
 method enqueue(id, item, max) 
  Namespace types: Triangle 
  Parameters:
     id (Triangle ) 
     item (Triangle) 
     max (int) 
 method enqueue(id, item, max) 
  Namespace types: Polygon 
  Parameters:
     id (Polygon ) 
     item (Polygon) 
     max (int) 
 method enqueue(id, item, max) 
  Namespace types: TriangleFill 
  Parameters:
     id (TriangleFill ) 
     item (TriangleFill) 
     max (int) 
 method enqueue(id, item, max) 
  Namespace types: PolygonFill 
  Parameters:
     id (PolygonFill ) 
     item (PolygonFill) 
     max (int) 
 method update(this, a, b, c) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
     a (chart.point) 
     b (chart.point) 
     c (chart.point) 
 method update(this, points) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
     points (chart.point ) 
 method delete(this) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
 method delete(this) 
  Namespace types: TriangleFill
  Parameters:
     this (TriangleFill) 
 method delete(this) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
 method delete(this) 
  Namespace types: PolygonFill
  Parameters:
     this (PolygonFill) 
 method delete(this) 
  Namespace types: Triangle 
  Parameters:
     this (Triangle ) 
 method delete(this) 
  Namespace types: TriangleFill 
  Parameters:
     this (TriangleFill ) 
 method delete(this) 
  Namespace types: Polygon 
  Parameters:
     this (Polygon ) 
 method delete(this) 
  Namespace types: PolygonFill 
  Parameters:
     this (PolygonFill ) 
 method draw(this, ab_args_override, ac_args_override, bc_args_override) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
     ab_args_override (LineArgs type from robbatt/lib_plot_objects/32) 
     ac_args_override (LineArgs type from robbatt/lib_plot_objects/32) 
     bc_args_override (LineArgs type from robbatt/lib_plot_objects/32) 
 method draw(this) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
 method draw(this) 
  Namespace types: TriangleFill
  Parameters:
     this (TriangleFill) 
 method draw(this) 
  Namespace types: PolygonFill
  Parameters:
     this (PolygonFill) 
 method draw(this) 
  Namespace types: Triangle 
  Parameters:
     this (Triangle ) 
 method draw(this) 
  Namespace types: TriangleFill 
  Parameters:
     this (TriangleFill ) 
 method draw(this) 
  Namespace types: Polygon 
  Parameters:
     this (Polygon ) 
 method draw(this) 
  Namespace types: PolygonFill 
  Parameters:
     this (PolygonFill ) 
 method apply_style(this, args) 
  Namespace types: Triangle
  Parameters:
     this (Triangle) 
     args (LineArgs type from robbatt/lib_plot_objects/32) 
 method apply_style(this, args) 
  Namespace types: Polygon
  Parameters:
     this (Polygon) 
     args (LineArgs type from robbatt/lib_plot_objects/32) 
 method apply_style(this, args) 
  Namespace types: Triangle 
  Parameters:
     this (Triangle ) 
     args (LineArgs type from robbatt/lib_plot_objects/32) 
 method apply_style(this, args) 
  Namespace types: Polygon 
  Parameters:
     this (Polygon ) 
     args (LineArgs type from robbatt/lib_plot_objects/32) 
 Triangle 
  Fields:
     a (chart.point) : first Corner
     b (chart.point) : second Corner
     c (chart.point) : third Corner
     args (LineArgs type from robbatt/lib_plot_objects/32) : Wrapper for reusable arguments for line.new()
     ab (Line type from robbatt/lib_plot_objects/32) 
     ac (Line type from robbatt/lib_plot_objects/32) 
     bc (Line type from robbatt/lib_plot_objects/32) 
 TriangleFill 
  Fields:
     triangle (Triangle) : The Triangle object
     plot (LineFill type from robbatt/lib_plot_objects/32) : The linefill object to be added and plotted via draw()
 Polygon 
  Fields:
     points (chart.point ) : array of points that make up the Polygon
     center (chart.point) : Center point of the Polygon, can be used for a label and will be center for PolygonFill
     args (LineArgs type from robbatt/lib_plot_objects/32) : Wrapper for reusable arguments for line.new()
     plot (Line  type from robbatt/lib_plot_objects/32) : An array of Lines that form Polygon Border
 PolygonFill 
  Fields:
     poly (Polygon) : the Polygon
     fill_color (series color) : The color used to fill the space between the lines.
     plot (TriangleFill )
printerLibrary   "printer" 
Printer Library, designed to streamline the process of printing data directly onto charts while offering advanced features for enhanced functionality.
For full documentation, please visit  faiyaz7283.github.io
Contrast Color LibraryThis lightweight library provides a utility method that analyzes any provided background color and automatically chooses the optimal black or white foreground color to ensure maximum visual contrast and readability.
🟠  Algorithm 
The library utilizes the HSP Color Model to calculate the brightness of the background color. The formula for this calculation is as follows:
 brightness = sqrt(0.299 * R^2 + 0.587 * G^2 + 0.114 * B^2 ) 
The library chooses black as the foreground color if the brightness exceeds the threshold (default 0.5), and white otherwise.
TradeLibrary   "Trade" 
A Trade Tracking Library
Monitor conditions with less code by using Arrays. When your conditions are met in chronologically, a signal is returned and the scanning starts again.
Create trades automatically with Stop Loss, Take Profit and Entry. The trades will automatically track based on the market movement and update when the targets are hit.
 
 Sample Usage 
Enter a buy trade when RSI crosses below 70 then crosses above 80 before it crosses 40.
 Note: If RSI crosses 40 before 80, No trade will be entered. 
 
rsi = ta.rsi(close, 21)
buyConditions = array.new_bool()
buyConditions.push(ta.crossunder(rsi, 70))
buyConditions.push(ta.crossover(rsi, 80))
buy = Trade.signal(buyConditions, ta.crossunder(rsi, 40))
trade = Trade.new(close-(100*syminfo.mintick), close +(200*syminfo.mintick), condition=buy)
plot(trade.takeprofit, "TP", style=plot.style_circles, linewidth=4, color=color.lime)
alertcondition(trade.tp_hit, "TP Hit")
 
 
 method signal(conditions, reset) 
  Signal Conditions
  Namespace types: bool 
  Parameters:
     conditions (bool ) 
     reset (bool) 
  Returns: Boolean: True when all the conditions have occured
 method update(this, stoploss, takeprofit, entry) 
  Update Trade Parameters
  Namespace types: Trade
  Parameters:
     this (Trade) 
     stoploss (float) 
     takeprofit (float) 
     entry (float) 
  Returns: nothing
 method clear(this) 
  Clear Trade Parameters
  Namespace types: Trade
  Parameters:
     this (Trade) 
  Returns: nothing
 method track(this, _high, _low) 
  Track Trade Parameters
  Namespace types: Trade
  Parameters:
     this (Trade) 
     _high (float) 
     _low (float) 
  Returns: nothing
 new(stoploss, takeprofit, entry, _high, _low, condition, update) 
  New Trade with tracking
  Parameters:
     stoploss (float) 
     takeprofit (float) 
     entry (float) 
     _high (float) 
     _low (float) 
     condition (bool) 
     update (bool) 
  Returns: a Trade with targets and updates if stoploss or takeprofit is hit
 new() 
  New Empty Trade
  Returns: an empty trade
 Trade 
  Fields:
     stoploss (series__float) 
     takeprofit (series__float) 
     entry (series__float) 
     sl_hit (series__bool) 
     tp_hit (series__bool) 
     open (series__integer)






















