Library "ZenLibrary" A collection of custom tools & utility functions commonly used with my scripts.
getDecimals() Calculates how many decimals are on the quote price of the current market Returns: The current decimal places on the market quote price
truncate(float, float) Truncates (cuts) excess decimal places Parameters: float: _number The number to truncate float: _decimalPlaces (default=2) The number of decimal places to truncate to Returns: The given _number truncated to the given _decimalPlaces
toWhole(float) Converts pips into whole numbers Parameters: float: _number The pip number to convert into a whole number Returns: The converted number
toPips(float) Converts whole numbers back into pips Parameters: float: _number The whole number to convert into pips Returns: The converted number
av_getPositionSize(float, float, float, float) Calculates OANDA forex position size for AutoView based on the given parameters Parameters: float: _balance The account balance to use float: _risk The risk percentage amount (as a whole number - eg. 1 = 1% risk) float: _stopPoints The stop loss distance in POINTS (not pips) float: _conversionRate The conversion rate of our account balance currency Returns: The calculated position size (in units - only compatible with OANDA)
getMA(int, string) Gets a Moving Average based on type Parameters: int: _length The MA period string: _maType The type of MA Returns: A moving average with the given parameters
getEAP(float) Performs EAP stop loss size calculation (eg. ATR >= 20.0 and ATR < 30, returns 20) Parameters: float: _atr The given ATR to base the EAP SL calculation on Returns: The EAP SL converted ATR size
barsAboveMA(int, float) Counts how many candles are above the MA Parameters: int: _lookback The lookback period to look back over float: _ma The moving average to check Returns: The bar count of how many recent bars are above the MA
barsBelowMA(int, float) Counts how many candles are below the MA Parameters: int: _lookback The lookback period to look back over float: _ma The moving average to reference Returns: The bar count of how many recent bars are below the EMA
barsCrossedMA(int, float) Counts how many times the EMA was crossed recently Parameters: int: _lookback The lookback period to look back over float: _ma The moving average to reference Returns: The bar count of how many times price recently crossed the EMA
getPullbackBarCount(int, int) Counts how many green & red bars have printed recently (ie. pullback count) Parameters: int: _lookback The lookback period to look back over int: _direction The color of the bar to count (1 = Green, -1 = Red) Returns: The bar count of how many candles have retraced over the given lookback & direction
getBodySize() Gets the current candle's body size (in POINTS, divide by 10 to get pips) Returns: The current candle's body size in POINTS
getTopWickSize() Gets the current candle's top wick size (in POINTS, divide by 10 to get pips) Returns: The current candle's top wick size in POINTS
getBottomWickSize() Gets the current candle's bottom wick size (in POINTS, divide by 10 to get pips) Returns: The current candle's bottom wick size in POINTS
getBodyPercent() Gets the current candle's body size as a percentage of its entire size including its wicks Returns: The current candle's body size percentage
isHammer(float, bool) Checks if the current bar is a hammer candle based on the given parameters Parameters: float: _fib (default=0.382) The fib to base candle body on bool: _colorMatch (default=false) Does the candle need to be green? (true/false) Returns: A boolean - true if the current bar matches the requirements of a hammer candle
isStar(float, bool) Checks if the current bar is a shooting star candle based on the given parameters Parameters: float: _fib (default=0.382) The fib to base candle body on bool: _colorMatch (default=false) Does the candle need to be red? (true/false) Returns: A boolean - true if the current bar matches the requirements of a shooting star candle
isDoji(float, bool) Checks if the current bar is a doji candle based on the given parameters Parameters: float: _wickSize (default=2) The maximum top wick size compared to the bottom (and vice versa) bool: _bodySize (default=0.05) The maximum body size as a percentage compared to the entire candle size Returns: A boolean - true if the current bar matches the requirements of a doji candle
isBullishEC(float, float, bool) Checks if the current bar is a bullish engulfing candle Parameters: float: _allowance (default=0) How many POINTS to allow the open to be off by (useful for markets with micro gaps) float: _rejectionWickSize (default=disabled) The maximum rejection wick size compared to the body as a percentage bool: _engulfWick (default=false) Does the engulfing candle require the wick to be engulfed as well? Returns: A boolean - true if the current bar matches the requirements of a bullish engulfing candle
isBearishEC(float, float, bool) Checks if the current bar is a bearish engulfing candle Parameters: float: _allowance (default=0) How many POINTS to allow the open to be off by (useful for markets with micro gaps) float: _rejectionWickSize (default=disabled) The maximum rejection wick size compared to the body as a percentage bool: _engulfWick (default=false) Does the engulfing candle require the wick to be engulfed as well? Returns: A boolean - true if the current bar matches the requirements of a bearish engulfing candle
timeFilter(string, bool) Determines if the current price bar falls inside the specified session Parameters: string: _sess The session to check bool: _useFilter (default=false) Whether or not to actually use this filter Returns: A boolean - true if the current bar falls within the given time session
dateFilter(int, int) Determines if this bar's time falls within date filter range Parameters: int: _startTime The UNIX date timestamp to begin searching from int: _endTime the UNIX date timestamp to stop searching from Returns: A boolean - true if the current bar falls within the given dates
dayFilter(bool, bool, bool, bool, bool, bool, bool) Checks if the current bar's day is in the list of given days to analyze Parameters: bool: _monday Should the script analyze this day? (true/false) bool: _tuesday Should the script analyze this day? (true/false) bool: _wednesday Should the script analyze this day? (true/false) bool: _thursday Should the script analyze this day? (true/false) bool: _friday Should the script analyze this day? (true/false) bool: _saturday Should the script analyze this day? (true/false) bool: _sunday Should the script analyze this day? (true/false) Returns: A boolean - true if the current bar's day is one of the given days
atrFilter(float, float) Checks the current bar's size against the given ATR and max size Parameters: float: _atr (default=ATR 14 period) The given ATR to check float: _maxSize The maximum ATR multiplier of the current candle Returns: A boolean - true if the current bar's size is less than or equal to _atr x _maxSize
fillCell(table, int, int, string, string, color, color) This updates the given table's cell with the given values Parameters: table: _table The table ID to update int: _column The column to update int: _row The row to update string: _title The title of this cell string: _value The value of this cell color: _bgcolor The background color of this cell color: _txtcolor The text color of this cell Returns: A boolean - true if the current bar falls within the given dates
Versionsinformation
⋅
v2: - Fixed time session filter (it was not working as intended)
Versionsinformation
⋅
v3: - Removed underscore from "_x" parameter names to be consistent with Pine's inbuilt function parameter naming convention - Removed inbuilt ATR call from function scope in atrFilter() so that it is guaranteed to be calculated properly on every tick (regardless of which scope you place the atrFilter() call in your script) - Added getPctChange() function - returns the % change between two values over a lookback period - Cannot remove MA calls from function scope of getMA() in library scripts due to length parameter being dynamic, so make sure to ALWAYS call that function on every calculation (ie. in your main script scope - just as you would with regular inbuilt MA() functions)
Versionsinformation
⋅
v4
Changes: - Changed barsBelowMA and barsAboveMA to use ma instead of current ma value - Changed timeFilter() to barInSession() - returns true if bar is inside given time session - Added barOutSession() - returns true if bar is outside given time session - Added isInsideBar() and isOutsideBar() candle pattern functions - Added bearFib() and bullFib() fibonacci functions - Added getEAP2() function - returns an alternative ATR stop loss formula to the getEAP() function
Added: bullFib(priceLow, priceHigh, fibRatio) Calculates a bullish fibonacci value Parameters: priceLow: The lowest price point priceHigh: The highest price point fibRatio: The fibonacci % ratio to calculate Returns: The fibonacci value of the given ratio between the two price points
bearFib(priceLow, priceHigh, fibRatio) Calculates a bearish fibonacci value Parameters: priceLow: The lowest price point priceHigh: The highest price point fibRatio: The fibonacci % ratio to calculate Returns: The fibonacci value of the given ratio between the two price points
isInsideBar() Detects inside bars Returns: Returns true if the current bar is an inside bar
isOutsideBar() Detects outside bars Returns: Returns true if the current bar is an outside bar
barInSession(string, bool) Determines if the current price bar falls inside the specified session Parameters: string: sess The session to check bool: useFilter (default=true) Whether or not to actually use this filter Returns: A boolean - true if the current bar falls within the given time session
barOutSession(string, bool) Determines if the current price bar falls outside the specified session Parameters: string: sess The session to check bool: useFilter (default=true) Whether or not to actually use this filter Returns: A boolean - true if the current bar falls outside the given time session
Removed: timeFilter(string, bool) Determines if the current price bar falls inside the specified session
Versionsinformation
⋅
Forgot to include export keyword for new getEAP2() function. 🤦♂️
Versionsinformation
⋅
v6
Added: getPipSize() Calculates the pip size of the current market Returns: The pip size for the current market
Changed: Improved toWhole() and toPips() function formula to work better across FX/Crypto/Stocks Fixed bug with barsCrossedMA (it based count on crosses of current MA value instead of MA value for each previous bar)
Versionsinformation
⋅
v7
Updated: getPipSize(multiplier) Calculates the pip size of the current market Parameters: multiplier (int) - The mintick point multiplier (1 by default, 10 for FX/Crypto/CFD if default of 1 is used - only override if your market requires it) Returns: The pip size for the current market
Hi Matt, do you build custom tools for people ? I am looking to get something built , happy to pay , not sure where to start. Thank you
RovKar
⋅
Thanks, Matthew for sharing your library, it is awesome all your code stuff.
ZenAndTheArtOfTrading
⋅
@RovKar, Thanks for the coins mate! You're more than welcome, good luck with your trading :)
MrPaolinoVr
⋅
thank you for you work !
ZenAndTheArtOfTrading
⋅
@MrPaolinoVr, you're welcome my friend, thanks for the coins!
aTanker
⋅
great stuff man !!
ZenAndTheArtOfTrading
⋅
@aTanker, Hey thanks man! Appreciate that :) good luck with your trading
Jinrekisha
⋅
Hi Matthew, thanks for the YouTube video and the library, both very useful 👍🏼 I'm using the `dayofweek` function in my strategy. I noticed
Jinrekisha
⋅
@ZenAndTheArtOfTrading I was meant to say: I'm using the `dayofweek` function in my strategy. I noticed it's based on the exchange time rather than my time. If I colour the background of any day of the week, it starts at 5am instead of midnight. How can I tune this up to my time zone ? Thanks
ZenAndTheArtOfTrading
⋅
@Jinrekisha, Hey mate! Thanks for the coins I appreciate it. To be honest I'm not 100% sure how you could tune the function to work based on your timezone, although I'm sure it's possible with some creative coding. I'll need to think about this one and get back to you if I can think of a solution or find an existing example in the TradingView script library