Smart Money Index (SMI)Smart money index (SMI) or smart money flow index is a technical analysis indicator demonstrating investors sentiment.
The index was invented and popularized by money manager Don Hays. The indicator is based on intra-day price patterns.
The main idea is that the majority of traders (emotional, news-driven) overreact at the beginning of the trading day
because of the overnight news and economic data. There is also a lot of buying on market orders and short covering at the opening.
Smart, experienced investors start trading closer to the end of the day having the opportunity to evaluate market performance.
Therefore, the basic strategy is to bet against the morning price trend and bet with the evening price trend. The SMI may be calculated
for many markets and market indices (S&P 500, DJIA, etc.)
The SMI sends no clear signal whether the market is bullish or bearish. There are also no fixed absolute or relative readings signaling
about the trend. Traders need to look at the SMI dynamics relative to that of the market. If, for example, SMI rises sharply when the
market falls, this fact would mean that smart money is buying, and the market is to revert to an uptrend soon. The opposite situation
is also true. A rapidly falling SMI during a bullish market means that smart money is selling and that market is to revert to a downtrend
soon. The SMI is, therefore, a trend-based indicator.
Some analysts use the smart money index to claim that precious metals such as gold will continually maintain value in the future.
스크립트에서 "index"에 대해 찾기
Market Facilitation Index (MFI) The Market Facilitation Index is an indicator that relates price range to
volume and measures the efficency of price movement. Use the indicator to
determine if the market is trending. If the Market Facilitation Index increased,
then the market is facilitating trade and is more efficient, implying that the
market is trending. If the Market Facilitation Index decreased, then the market
is becoming less efficient, which may indicate a trading range is developing that
may be a trend reversal.
Relative Volatility Index The RVI is a modified form of the relative strength index (RSI).
The original RSI calculation separates one-day net changes into
positive closes and negative closes, then smoothes the data and
normalizes the ratio on a scale of zero to 100 as the basis for the
formula. The RVI uses the same basic formula but substitutes the
10-day standard deviation of the closing prices for either the up
close or the down close. The goal is to create an indicator that
measures the general direction of volatility. The volatility is
being measured by the 10-days standard deviation of the closing prices.
MASS Index The Mass Index was designed to identify trend reversals by measuring
the narrowing and widening of the range between the high and low prices.
As this range widens, the Mass Index increases; as the range narrows
the Mass Index decreases.
The Mass Index was developed by Donald Dorsey.
Indicators: Traders Dynamic Index, HLCTrends and Trix Ribbon1) Trix Ribbon
===============================================================
This was built on request. Many Stock/FX traders overlay multiple Trix lines to form the ribbon, this indicator makes it easy.
Also, optionally this can plot a BollingerBand on Trix_1.
More info on Trix:
stockcharts.com
2) High/Low/Close Trend Indicator
===============================================================
Simple indicator using EMAs of H/L/C. If blue line is above the red line, the trend is up, else down. Keep an eye on the zero line too.
3) Traders Dynamic Index
===============================================================
This hybrid indicator helps to decipher and monitor market conditions related to trend direction, market strength, and market volatility.
TDI has the following components:
* Green line = RSI Price line
* Red line = Trade Signal line
* Blue lines = Volatility Bands
* Orange line = Market Base Line
Trend Direction - Immediate and Overall:
----------------------------------------------------
* Immediate = Green over Red...price action is moving up.
Red over Green...price action is moving down.
* Overall = Orange line trends up and down generally between the lines 32 & 68. Watch for Orange line to bounces off these lines for market reversal. Trade long when price is above the Orange line, and trade short when price is below.
Market Strength & Volatility - Immediate and Overall:
----------------------------------------------------
* Immediate = Green Line - Strong = Steep slope up or down.
Weak = Moderate to Flat slope.
* Overall = Blue Lines - When expanding, market is strong and trending. When constricting, market is weak and in a range. When the Blue lines are extremely tight in a narrow range, expect an economic announcement or other market condition to spike the market.
Entry conditions:
----------------------------------------------------
* Scalping - Long = Green over Red,
Short = Red over Green
* Active - Long = Green over Red & Orange lines
Short = Red over Green & Orange lines
* Moderate - Long = Green over Red, Orange, & 50 lines
Short= Red over Green, Green below Orange & 50 line
Exit conditions:
----------------------------------------------------
If Green crosses either Blue lines, consider exiting when the Green line crosses back over the Blue line.
* Long = Green crosses below Red
* Short = Green crosses above Red
More info on a complete system using TDI:
www.forexmt4.com
Indicators: Constance Brown Composite Index & RSI+AvgsI am a big fan of Constance Brown. Her book "Technical Analysis for Trading Professionals" is an absolute classic (get the 2nd edition).
I have included here 2 of the indicators she uses in all her charts.
Composite Index
----------------------------------------
This is a formula Ms Brown developed (Cardwell may not agree!) to identify divergence failures with in the RSI. This also highlights the horizontal support levels with in the indicator area.
This index removes the normalization range restrictions in RSI. This means it is not bound with in 0-100 range. Also, this has embedded momentum calculation in it.
The fine nuances of this indicator are not documented well enough, if you find some good documentation, do let me know. Always use this with RSI (like the next one).
RSI+Avgs
----------------------------------------
This is plain 14 period RSI with a 9-period EMA and 45-period SMA overlaid.
Dynamic Momentum Index (DMI) This indicator plots Dynamic Momentum Index indicator. The Dynamic Momentum
Index (DMI) was developed by Tushar Chande and Stanley Kroll. The indicator
is covered in detail in their book The New Technical Trader.
The DMI is identical to Welles Wilder`s Relative Strength Index except the
number of periods is variable rather than fixed. The variability of the time
periods used in the DMI is controlled by the recent volatility of prices.
The more volatile the prices, the more sensitive the DMI is to price changes.
In other words, the DMI will use more time periods during quiet markets, and
less during active markets. The maximum time periods the DMI can reach is 30
and the minimum is 3. This calculation method is similar to the Variable
Moving Average, also developed by Tushar Chande.
The advantage of using a variable length time period when calculating the RSI
is that it overcomes the negative effects of smoothing, which often obscure short-term moves.
The volatility index used in controlling the time periods in the DMI is based
on a calculation using a five period standard deviation and a ten period average
of the standard deviation.
12&50 RSI + %R2/50 RSI+ %R is a PineScript indicator that combines two popular technical indicators, the Relative Strength Index (RSI) and the Williams %R. The indicator plots two lines, K and D, which represent the smoothed moving averages of the RSI. It also plots the RSI with a 60-period length and the Williams %R with a 21-period length. The indicator can be used to identify overbought and oversold conditions, as well as potential reversals.
Here are some of the key features of the script:
It uses two different RSI lengths to provide a more comprehensive view of the market.
It plots the Williams %R, which can be used to identify overbought and oversold conditions.
It includes overbought and oversold levels to help traders identify potential entry and exit points.
Index MeterThis is a currency index strength meter.
Plots Dollar index by default.
Switch between other indexes of the same pair you are trading.
Exotic pairs included.
This indicator helps you understand the broad dynamic strength of the currency as calculated from numerous other pairs as opposed to just the pair you are trading, giving you the advantage of anticipating a real turn in the market when other strength indicators are giving false turn signals.
You need a good understanding of trading with the help of indexes.
For those needing exotic pair indexes, this indicator will help you.
Index Futures vs Cash ArbitrageThis indicator measures the statistical spread between major stock index futures and their corresponding cash indices (e.g., ES vs SPX, NQ vs NDX) using Z-score normalization. It automatically detects commonly traded index pairs (S&P 500, Nasdaq, Dow Jones, Russell 2000) and calculates a smoothed spread between futures and spot prices. A Z-score is then derived from this spread to highlight potential overpricing or underpricing conditions.
Traders can use customizable thresholds to identify mean-reversion opportunities where the futures contract may be temporarily overvalued or undervalued relative to the index. The histogram highlights the direction of the Z-score (green = futures > index, red = futures < index), while built-in alerts notify users of key threshold breaches or zero-line crosses.
This tool is designed for discretionary traders, pairs traders, or anyone exploring statistical arbitrage strategies between futures and spot markets. It is not a buy/sell signal by itself and should be used with additional confluence or risk management techniques.
Index Adaptive Keltner Channels [DW]This study is an experiment in adaptive filtering. The process in this study was inspired by KAMA and ZLEMA filtering techniques.
First, data is given an optional modification for lag reduction.
Then, an adaptive filter of your choice is calculated. There are 6 different adaptive filters to choose from in this study:
-Commodity Channel Index Adaptive Moving Average (CCIAMA)
-Relative Strength Index Adaptive Moving Average (RSIAMA)
-%R Adaptive Moving Average (%RAMA)
-Klinger Volume Oscillator Adaptive Moving Average (KVOAMA)
-Money Flow Index Adaptive Moving Average (MFIAMA)
-Correlation Coefficient Adaptive Moving Average (CCAMA)
Next, ATR is calculated using the specified adaptive filter.
A set of ranges is calculated by multiplying ATR by the square root of the sampling period, then dividing it by 2 and 4.
And Finally, the ranges are added to and subtracted from the adaptive filter to generate the channels.
Custom bar colors are included. The formula for the color scheme is based on filter direction and price.
Index Vs Futures v4.0 (dashed edition)Generalized script of
Originally designed for bitcoin, but can be used to compare between futures and index (or any two symbol expressions).
Conventions:
- green background := futures deviates 'way above' index
- red background := futures deviates 'way below' index
Index OverlayNote: use this indicator only with New York Timezone + you need to understand ICT concepts already, this indicator simplifies the chart work.
Also, in this script I added some open-source scripts from creators here on tradingview, but I forgot to annotate their names...
If you recognize your script, please text me and I'll add your credits.
features
- displays Midnight and Sunday open lines
- day separation (from midnight)
- FVGs
- VWAP (calculated from midnight open)
- daily labels
- TDH & TDL (liquidity)
- trading time window (from 9:30 to 12:00 ny time)
HOW TO USE
Combined with daily bias, the idea is to wait for 9:30 to open, and then wait for a liquidation of TDH (plotted in blue) or TDL (in red).
Once it happens, you can look for ICT buy / sell model, ideally in the 5m TF.
Index of indexxesHi, this is pretty straight forward. This is the DXY equivalent of NDX, SPX, RUT, DJ. It's a full index of the US market.
You can play with the weights, drag and drop, let's say SPX and see how SPX performs compared to the four major indexxes.
Index VolumeIf you need to put the index volume on either the Nasdaq Composite ( NASX) or NYSE ( NYA ), this will do it for you. Enjoy!
v1.1: Updated script so volume color matches bar color, based on previous close.
Index VolumeIf you need to put the index volume on either the Nasdaq Composite (NASX) or NYSE (NYA), this will do it for you. Enjoy!
National Financial Conditions Index (NFCI)This is one of the most important macro indicators in my trading arsenal due to its reliability across different market regimes. I'm excited to share this with the TradingView community because this Federal Reserve data is not only completely free but extraordinarily useful for portfolio management and risk assessment.
**Important Disclaimers**: Be aware that some NFCI components are updated only monthly but carry significant weighting in the composite index. Additionally, the Fed occasionally revises historical NFCI data, so historical backtests should be interpreted with some caution. Nevertheless, this remains a crucial leading indicator for financial stress conditions.
---
## What is the National Financial Conditions Index?
The National Financial Conditions Index (NFCI) is a comprehensive measure of financial stress and liquidity conditions developed by the Federal Reserve Bank of Chicago. This indicator synthesizes over 100 financial market variables into a single, interpretable metric that captures the overall state of financial conditions in the United States (Brave & Butters, 2011).
**Key Principle**: When the NFCI is positive, financial conditions are tighter than average; when negative, conditions are looser than average. Values above +1.0 historically coincide with financial crises, while values below -1.0 often signal bubble-like conditions.
## Scientific Foundation & Research
The NFCI methodology is grounded in extensive academic research:
### Core Research Foundation
- **Brave, S., & Butters, R. A. (2011)**. "Monitoring financial stability: A financial conditions index approach." *Economic Perspectives*, 35(1), 22-43.
- **Hatzius, J., Hooper, P., Mishkin, F. S., Schoenholtz, K. L., & Watson, M. W. (2010)**. "Financial conditions indexes: A fresh look after the financial crisis." *US Monetary Policy Forum Report*, No. 23.
- **Kliesen, K. L., Owyang, M. T., & Vermann, E. K. (2012)**. "Disentangling diverse measures: A survey of financial stress indexes." *Federal Reserve Bank of St. Louis Review*, 94(5), 369-397.
### Methodological Validation
The NFCI employs Principal Component Analysis (PCA) to extract common factors from financial market data, following the methodology established by **English, W. B., Tsatsaronis, K., & Zoli, E. (2005)** in "Assessing the predictive power of measures of financial conditions for macroeconomic variables." The index has been validated through extensive academic research (Koop & Korobilis, 2014).
## NFCI Components Explained
This indicator provides access to all five official NFCI variants:
### 1. **Main NFCI**
The primary composite index incorporating all financial market sectors. This serves as the main signal for portfolio allocation decisions.
### 2. **Adjusted NFCI (ANFCI)**
Removes the influence of credit market disruptions to focus on non-credit financial stress. Particularly useful during banking crises when credit markets may be impaired but other financial conditions remain stable.
### 3. **Credit Sub-Index**
Isolates credit market conditions including corporate bond spreads, commercial paper rates, and bank lending standards. Important for assessing corporate financing stress.
### 4. **Leverage Sub-Index**
Measures systemic leverage through margin requirements, dealer financing, and institutional leverage metrics. Useful for identifying leverage-driven market stress.
### 5. **Risk Sub-Index**
Captures market-based risk measures including volatility, correlation, and tail risk indicators. Provides indication of risk appetite shifts.
## Practical Trading Applications
### Portfolio Allocation Framework
Based on the academic research, the NFCI can be used for portfolio positioning:
**Risk-On Positioning (NFCI declining):**
- Consider increasing equity exposure
- Reduce defensive positions
- Evaluate growth-oriented sectors
**Risk-Off Positioning (NFCI rising):**
- Consider reducing equity exposure
- Increase defensive positioning
- Favor large-cap, dividend-paying stocks
### Academic Validation
According to **Oet, M. V., Eiben, R., Bianco, T., Gramlich, D., & Ong, S. J. (2011)** in "The financial stress index: Identification of systemic risk conditions," financial conditions indices like the NFCI provide early warning capabilities for systemic risk conditions.
**Illing, M., & Liu, Y. (2006)** demonstrated in "Measuring financial stress in a developed country: An application to Canada" that composite financial stress measures can be useful for predicting economic downturns.
## Advanced Features of This Implementation
### Dynamic Background Coloring
- **Green backgrounds**: Risk-On conditions - potentially favorable for equity investment
- **Red backgrounds**: Risk-Off conditions - time for defensive positioning
- **Intensity varies**: Based on deviation from trend for nuanced risk assessment
### Professional Dashboard
Real-time analytics table showing:
- Current NFCI level and interpretation (TIGHT/LOOSE/NEUTRAL)
- Individual sub-index readings
- Change analysis
- Portfolio guidance (Risk On/Risk Off)
### Alert System
Professional-grade alerts for:
- Risk regime changes
- Extreme stress conditions (NFCI > 1.0)
- Bubble risk warnings (NFCI < -1.0)
- Major trend reversals
## Optimal Usage Guidelines
### Best Timeframes
- **Daily charts**: Recommended for intermediate-term positioning
- **Weekly charts**: Suitable for longer-term portfolio allocation
- **Intraday**: Less effective due to weekly update frequency
### Complementary Indicators
For enhanced analysis, combine NFCI signals with:
- **VIX levels**: Confirm stress readings
- **Credit spreads**: Validate credit sub-index signals
- **Moving averages**: Determine overall market trend context
- **Economic surprise indices**: Gauge fundamental backdrop
### Position Sizing Considerations
- **Extreme readings** (|NFCI| > 1.0): Consider higher conviction positioning
- **Moderate readings** (|NFCI| 0.3-1.0): Standard position sizing
- **Neutral readings** (|NFCI| < 0.3): Consider reduced conviction
## Important Limitations & Considerations
### Data Frequency Issues
**Critical Warning**: While the main NFCI updates weekly (typically Wednesdays), some underlying components update monthly. Corporate bond indices and commercial paper rates, which carry significant weight, may cause delayed reactions to current market conditions.
**Component Update Schedule:**
- **Weekly Updates**: Main NFCI composite, most equity volatility measures
- **Monthly Updates**: Corporate bond spreads, commercial paper rates
- **Quarterly Updates**: Banking sector surveys
- **Impact**: Significant portion of index weight may lag current conditions
### Historical Revisions
The Federal Reserve occasionally revises NFCI historical data as new information becomes available or methodologies are refined. This means backtesting results should be interpreted cautiously, and the indicator works best for forward-looking analysis rather than precise historical replication.
### Market Regime Dependency
The NFCI effectiveness may vary across different market regimes. During extended sideways markets or regime transitions, signals may be less reliable. Consider combining with trend-following indicators for optimal results.
**Bottom Line**: Use NFCI for medium-term portfolio positioning guidance. Trust the directional signals while remaining aware of data revision risks and update frequency limitations. This indicator is particularly valuable during periods of financial stress when reliable guidance is most needed.
---
**Data Source**: Federal Reserve Bank of Chicago
**Update Frequency**: Weekly (typically Wednesdays)
**Historical Coverage**: 1973-present
**Cost**: Free (public Fed data)
*This indicator is for educational and analytical purposes. Always conduct your own research and risk assessment before making investment decisions.*
## References
Brave, S., & Butters, R. A. (2011). Monitoring financial stability: A financial conditions index approach. *Economic Perspectives*, 35(1), 22-43.
English, W. B., Tsatsaronis, K., & Zoli, E. (2005). Assessing the predictive power of measures of financial conditions for macroeconomic variables. *BIS Papers*, 22, 228-252.
Hatzius, J., Hooper, P., Mishkin, F. S., Schoenholtz, K. L., & Watson, M. W. (2010). Financial conditions indexes: A fresh look after the financial crisis. *US Monetary Policy Forum Report*, No. 23.
Illing, M., & Liu, Y. (2006). Measuring financial stress in a developed country: An application to Canada. *Bank of Canada Working Paper*, 2006-02.
Kliesen, K. L., Owyang, M. T., & Vermann, E. K. (2012). Disentangling diverse measures: A survey of financial stress indexes. *Federal Reserve Bank of St. Louis Review*, 94(5), 369-397.
Koop, G., & Korobilis, D. (2014). A new index of financial conditions. *European Economic Review*, 71, 101-116.
Oet, M. V., Eiben, R., Bianco, T., Gramlich, D., & Ong, S. J. (2011). The financial stress index: Identification of systemic risk conditions. *Federal Reserve Bank of Cleveland Working Paper*, 11-30.
AltCoin & MemeCoin Index Correlation [Eddie_Bitcoin]🧠 Philosophy of the Strategy
The AltCoin & MemeCoin Index Correlation Strategy by Eddie_Bitcoin is a carefully engineered trend-following system built specifically for the highly volatile and sentiment-driven world of altcoins and memecoins.
This strategy recognizes that crypto markets—especially niche sectors like memecoins—are not only influenced by individual price action but also by the relative strength or weakness of their broader sector. Hence, it attempts to improve the reliability of trading signals by requiring alignment between a specific coin’s trend and its sector-wide index trend.
Rather than treating each crypto asset in isolation, this strategy dynamically incorporates real-time dominance metrics from custom indices (OTHERS.D and MEME.D) and combines them with local price action through dual exponential moving average (EMA) crossovers. Only when both the asset and its sector are moving in the same direction does it allow for trade entries—making it a confluence-based system rather than a single-signal strategy.
It supports risk-aware capital allocation, partial exits, configurable stop loss and take profit levels, and a scalable equity-compounding model.
✅ Why did I choose OTHERS.D and MEME.D as reference indices?
I selected OTHERS.D and MEME.D because they offer a sector-focused view of crypto market dynamics, especially relevant when trading altcoins and memecoins.
🔹 OTHERS.D tracks the market dominance of all cryptocurrencies outside the top 10 by market cap.
This excludes not only BTC and ETH, but also major stablecoins like USDT and USDC, making it a cleaner indicator of risk appetite across true altcoins.
🔹 This is particularly useful for detecting "Altcoin Season"—periods where capital rotates away from Bitcoin and flows into smaller-cap coins.
A rising OTHERS.D often signals the start of broader altcoin rallies.
🔹 MEME.D, on the other hand, captures the speculative behavior of memecoin segments, which are often driven by retail hype and social media activity.
It's perfect for timing momentum shifts in high-risk, high-reward tokens.
By using these indices, the strategy aligns entries with broader sector trends, filtering out noise and increasing the probability of catching true directional moves, especially in phases of capital rotation and altcoin risk-on behavior.
📐 How It Works — Core Logic and Execution Model
At its heart, this strategy employs dual EMA crossover detection—one pair for the asset being traded and one pair for the selected market index.
A trade is only executed when both EMA crossovers agree on the direction. For example:
Long Entry: Coin's fast EMA > slow EMA and Index's fast EMA > slow EMA
Short Entry: Coin's fast EMA < slow EMA and Index's fast EMA < slow EMA
You can disable the index filter and trade solely based on the asset’s trend just to make a comparison and see if improves a classic EMA crossover strategy.
Additionally, the strategy includes:
- Adaptive position sizing, based on fixed capital or current equity (compound mode)
- Take Profit and Stop Loss in percentage terms
- Smart partial exits when trend momentum fades
- Date filtering for precise backtesting over specific timeframes
- Real-time performance stats, equity tracking, and visual cues on chart
⚙️ Parameters & Customization
🔁 EMA Settings
Each EMA pair is customizable:
Coin Fast EMA: Default = 47
Coin Slow EMA: Default = 50
Index Fast EMA: Default = 47
Index Slow EMA: Default = 50
These control the sensitivity of the trend detection. A wider spread gives smoother, slower entries; a narrower spread makes it more responsive.
🧭 Index Reference
The correlation mechanism uses CryptoCap sector dominance indexes:
OTHERS.D: Dominance of all coins EXCLUDING Top 10 ones
MEME.D: Dominance of all Meme coins
These are dynamically calculated using:
OTHERS_D = OTHERS_cap / TOTAL_cap * 100
MEME_D = MEME_cap / TOTAL_cap * 100
You can select:
Reference Index: OTHERS.D or MEME.D
Or disable the index reference completely (Don't Use Index Reference)
💰 Position Sizing & Risk Management
Two capital allocation models are supported:
- Fixed % of initial capital (default)
- Compound profits, which scales positions as equity grows
Settings:
- Compound profits?: true/false
- % of equity: Between 1% and 200% (default = 10%)
This is critical for users who want to balance growth with risk.
🎯 Take Profit / Stop Loss
Customizable thresholds determine automatic exits:
- TakeProfit: Default = 99999 (disabled)
- StopLoss: Default = 5 (%)
These exits are percentage-based and operate off the entry price vs. current close.
📉 Trend Weakening Exit (Scale Out)
If the position is in profit but the trend weakens (e.g., EMA color signals trend loss), the strategy can partially close a configurable portion of the position:
- Scale Position on Weak Trend?: true/false
- Scaled Percentage: % to close (default = 65%)
This feature is useful for preserving profits without exiting completely.
📆 Date Filter
Useful for segmenting performance over specific timeframes (e.g., bull vs bear markets):
- Filter Date Range of Backtest: ON/OFF
- Start Date and End Date: Custom time range
OTHER PARAMETERS EXPLANATION (Strategy "Properties" Tab):
- Initial Capital is set to 100 USD
- Commission is set to 0.055% (The ones I have on Bybit)
- Slippage is set to 3 ticks
- Margin (short and long) are set to 0.001% to avoid "overspending" your initial capital allocation
📊 Visual Feedback and Debug Tools
📈 EMA Trend Visualization
The slow EMA line is dynamically color-coded to visually display the alignment between the asset trend and the index trend:
Lime: Coin and index both bullish
Teal: Only coin bullish
Maroon: Only index bullish
Red: Both bearish
This allows for immediate visual confirmation of current trend strength.
💬 Real-Time PnL Labels
When a trade closes, a label shows:
Previous trade return in % (first value is the effective PL)
Green background for profit, Red for losses.
📑 Summary Table Overlay
This table appears in a corner of the chart (user-defined) and shows live performance data including:
Trade direction (yellow long, purple short)
Emojis: 💚 for current profit, 😡 for current loss
Total number of trades
Win rate
Max drawdown
Duration in days
Current trade profit/loss (absolute and %)
Cumulative PnL (absolute and %)
APR (Annualized Percentage Return)
Each metric is color-coded:
Green for strong results
Yellow/orange for average
Red/maroon for poor performance
You can select where this appears:
Top Left
Top Right
Bottom Left
Bottom Right (default)
📚 Interpretation of Key Metrics
Equity Multiplier: How many times initial capital has grown (e.g., “1.75x”)
Net Profit: Total gains including open positions
Max Drawdown: Largest peak-to-valley drop in strategy equity
APR: Annualized return calculated based on equity growth and days elapsed
Win Rate: % of profitable trades
PnL %: Percentage profit on the most recent trade
🧠 Advanced Logic & Safety Features
🛑 “Don’t Re-Enter” Filter
If a trade is closed due to StopLoss without a confirmed reversal, the strategy avoids re-entering in that same direction until conditions improve. This prevents false reversals and repetitive losses in sideways markets.
🧷 Equity Protection
No new trades are initiated if equity falls below initial_capital / 30. This avoids overleveraging or continuing to trade when capital preservation is critical.
Keep in mind that past results in no way guarantee future performance.
Eddie Bitcoin
Bloomberg Financial Conditions Index (Proxy)The Bloomberg Financial Conditions Index (BFCI): A Proxy Implementation
Financial conditions indices (FCIs) have become essential tools for economists, policymakers, and market participants seeking to quantify and monitor the overall state of financial markets. Among these measures, the Bloomberg Financial Conditions Index (BFCI) has emerged as a particularly influential metric. Originally developed by Bloomberg L.P., the BFCI provides a comprehensive assessment of stress or ease in financial markets by aggregating various market-based indicators into a single, standardized value (Hatzius et al., 2010).
The original Bloomberg Financial Conditions Index synthesizes approximately 50 different financial market variables, including money market indicators, bond market spreads, equity market valuations, and volatility measures. These variables are normalized using a Z-score methodology, weighted according to their relative importance to overall financial conditions, and then aggregated to produce a composite index (Carlson et al., 2014). The resulting measure is centered around zero, with positive values indicating accommodative financial conditions and negative values representing tighter conditions relative to historical norms.
As Angelopoulou et al. (2014) note, financial conditions indices like the BFCI serve as forward-looking indicators that can signal potential economic developments before they manifest in traditional macroeconomic data. Research by Adrian et al. (2019) demonstrates that deteriorating financial conditions, as measured by indices such as the BFCI, often precede economic downturns by several months, making these indices valuable tools for predicting changes in economic activity.
Proxy Implementation Approach
The implementation presented in this Pine Script indicator represents a proxy of the original Bloomberg Financial Conditions Index, attempting to capture its essential features while acknowledging several significant constraints. Most critically, while the original BFCI incorporates approximately 50 financial variables, this proxy version utilizes only six key market components due to data accessibility limitations within the TradingView platform.
These components include:
Equity market performance (using SPY as a proxy for S&P 500)
Bond market yields (using TLT as a proxy for 20+ year Treasury yields)
Credit spreads (using the ratio between LQD and HYG as a proxy for investment-grade to high-yield spreads)
Market volatility (using VIX directly)
Short-term liquidity conditions (using SHY relative to equity prices as a proxy)
Each component is transformed into a Z-score based on log returns, weighted according to approximated importance (with weights derived from literature on financial conditions indices by Brave and Butters, 2011), and aggregated into a composite measure.
Differences from the Original BFCI
The methodology employed in this proxy differs from the original BFCI in several important ways. First, the variable selection is necessarily limited compared to Bloomberg's comprehensive approach. Second, the proxy relies on ETFs and publicly available indices rather than direct market rates and spreads used in the original. Third, the weighting scheme, while informed by academic literature, is simplified compared to Bloomberg's proprietary methodology, which may employ more sophisticated statistical techniques such as principal component analysis (Kliesen et al., 2012).
These differences mean that while the proxy BFCI captures the general direction and magnitude of financial conditions, it may not perfectly replicate the precision or sensitivity of the original index. As Aramonte et al. (2013) suggest, simplified proxies of financial conditions indices typically capture broad movements in financial conditions but may miss nuanced shifts in specific market segments that more comprehensive indices detect.
Practical Applications and Limitations
Despite these limitations, research by Arregui et al. (2018) indicates that even simplified financial conditions indices constructed from a limited set of variables can provide valuable signals about market stress and future economic activity. The proxy BFCI implemented here still offers significant insight into the relative ease or tightness of financial conditions, particularly during periods of market stress when correlations among financial variables tend to increase (Rey, 2015).
In practical applications, users should interpret this proxy BFCI as a directional indicator rather than an exact replication of Bloomberg's proprietary index. When the index moves substantially into negative territory, it suggests deteriorating financial conditions that may precede economic weakness. Conversely, strongly positive readings indicate unusually accommodative financial conditions that might support economic expansion but potentially also signal excessive risk-taking behavior in markets (López-Salido et al., 2017).
The visual implementation employs a color gradient system that enhances interpretation, with blue representing neutral conditions, green indicating accommodative conditions, and red signaling tightening conditions—a design choice informed by research on optimal data visualization in financial contexts (Few, 2009).
References
Adrian, T., Boyarchenko, N. and Giannone, D. (2019) 'Vulnerable Growth', American Economic Review, 109(4), pp. 1263-1289.
Angelopoulou, E., Balfoussia, H. and Gibson, H. (2014) 'Building a financial conditions index for the euro area and selected euro area countries: what does it tell us about the crisis?', Economic Modelling, 38, pp. 392-403.
Aramonte, S., Rosen, S. and Schindler, J. (2013) 'Assessing and Combining Financial Conditions Indexes', Finance and Economics Discussion Series, Federal Reserve Board, Washington, D.C.
Arregui, N., Elekdag, S., Gelos, G., Lafarguette, R. and Seneviratne, D. (2018) 'Can Countries Manage Their Financial Conditions Amid Globalization?', IMF Working Paper No. 18/15.
Brave, S. and Butters, R. (2011) 'Monitoring financial stability: A financial conditions index approach', Economic Perspectives, Federal Reserve Bank of Chicago, 35(1), pp. 22-43.
Carlson, M., Lewis, K. and Nelson, W. (2014) 'Using policy intervention to identify financial stress', International Journal of Finance & Economics, 19(1), pp. 59-72.
Few, S. (2009) Now You See It: Simple Visualization Techniques for Quantitative Analysis. Analytics Press, Oakland, CA.
Hatzius, J., Hooper, P., Mishkin, F., Schoenholtz, K. and Watson, M. (2010) 'Financial Conditions Indexes: A Fresh Look after the Financial Crisis', NBER Working Paper No. 16150.
Kliesen, K., Owyang, M. and Vermann, E. (2012) 'Disentangling Diverse Measures: A Survey of Financial Stress Indexes', Federal Reserve Bank of St. Louis Review, 94(5), pp. 369-397.
López-Salido, D., Stein, J. and Zakrajšek, E. (2017) 'Credit-Market Sentiment and the Business Cycle', The Quarterly Journal of Economics, 132(3), pp. 1373-1426.
Rey, H. (2015) 'Dilemma not Trilemma: The Global Financial Cycle and Monetary Policy Independence', NBER Working Paper No. 21162.
ATR Strength Index~~~~~~~ATRRSI~~~~~~~~~
Understanding the ATR Strength IndexThe "ATR Strength Index" (ATR SI) is a custom technical indicator derived by applying the calculation methodology of the Relative Strength Index (RSI) to the values of the Average True Range (ATR).
While the standard RSI measures the momentum of price changes, the ATR SI measures the momentum of volatility itself, as represented by the ATR.It is important to note that this is not a standard, widely recognised indicator like the traditional RSI or ATR.
It's a custom construction designed to provide a different perspective on market dynamics – specifically, the speed and magnitude of changes in volatility.
How it is Calculated
The calculation of the ATR Strength Index follows the same steps as the standard RSI, but the input data is the ATR value for each period, rather than the price.Let ATRi be the Average True Range value for the current period i.Let ATRi−1 be the Average True Range value for the previous period i−1.Calculate the period-over-period change in ATR:ΔATRi=ATRi−ATRi−1Separate ATR Gains and ATR Losses:If ΔATRi>0, then ATR,Gaini=ΔATRi and ATR,Lossi=0.If ΔATRi<0, then ATR,Gaini=0 and ATR,Lossi=∣ΔATRi∣.If ΔATRi=0, then ATR,Gaini=0 and ATR,Lossi=0.Calculate the Smoothed Average ATR Gain and Average ATR Loss over a specified lookback period (let's call this the "RSI Length" or n).
This typically uses a smoothing method similar to Wilder's original RSI calculation (a modified moving average or exponential moving average).Average,ATR,Gainn=Smoothed Average of ATR,Gain over n periodsAverage,ATR,Lossn=Smoothed Average of ATR,Loss over n periodsCalculate the ATR Relative Strength (ATR RS):ATR,RSn=Average,ATR,LossnAverage,ATR,GainnCalculate the ATR Strength Index:ATR,SIn=100−1+ATR,RSn100The resulting index oscillates between 0 and 100, just like the standard RSI.
How to Use It
Interpreting the ATR Strength Index focuses on the momentum of volatility rather than price momentum:High Values (e.g., above 70): Indicate that volatility (as measured by ATR) has been increasing rapidly over the chosen period.
This could suggest a market transitioning from a period of low volatility to high volatility, potentially preceding or accompanying strong directional price moves or increased choppiness.Low Values (e.g., below 30): Indicate that volatility has been decreasing rapidly.
This could suggest a market transitioning from high volatility to low volatility, potentially entering a period of consolidation or ranging price action.Midline (50): Represents a balance between increasing and decreasing volatility momentum.Divergence: You could potentially look for divergence between the ATR value itself and the ATR Strength Index. For example, if ATR is making higher highs but the ATR SI is making lower highs, it might suggest that while volatility is still increasing, the speed of that increase is slowing down. The interpretation and reliability of such divergence would need careful testing.
This indicator is best used as a supplementary tool to gain insight into the underlying volatility dynamics of the market, rather than as a primary signal generator for price direction.
It can help in understanding the current market environment – whether volatility is picking up or dying down – which can inform the suitability of different trading strategies (e.g., trend-following strategies might be more effective when volatility momentum is high, while range-bound strategies might suit periods of low volatility momentum).
Uniqueness
The ATR Strength Index is unique because it applies a momentum oscillator's logic (RSI) to a volatility indicator's output (ATR).Standard RSI: Focuses on the directional force of price movements.Standard ATR: Measures the amount of volatility, regardless of direction.ATR Strength Index: Measures the speed and direction of change in volatility.
It provides a perspective that neither the standard RSI nor ATR offers on their own – a quantified measure of how quickly the market's choppiness or range is expanding or contracting. This can be valuable for traders who incorporate volatility analysis into their decision-making process.In summary, the ATR Strength Index is a custom indicator that adapts the RSI calculation to measure the momentum of volatility, offering a unique view on market dynamics by showing how rapidly volatility is increasing or decreasing.
Bar Index & TimeLibrary to convert a bar index to a timestamp and vice versa.
Utilizes runtime memory to store the 𝚝𝚒𝚖𝚎 and 𝚝𝚒𝚖𝚎_𝚌𝚕𝚘𝚜𝚎 values of every bar on the chart (and optional future bars), with the ability of storing additional custom values for every chart bar.
█ PREFACE
This library aims to tackle some problems that pine coders (from beginners to advanced) often come across, such as:
I'm trying to draw an object with a 𝚋𝚊𝚛_𝚒𝚗𝚍𝚎𝚡 that is more than 10,000 bars into the past, but this causes my script to fail. How can I convert the 𝚋𝚊𝚛_𝚒𝚗𝚍𝚎𝚡 to a UNIX time so that I can draw visuals using xloc.bar_time ?
I have a diagonal line drawing and I want to get the "y" value at a specific time, but line.get_price() only accepts a bar index value. How can I convert the timestamp into a bar index value so that I can still use this function?
I want to get a previous 𝚘𝚙𝚎𝚗 value that occurred at a specific timestamp. How can I convert the timestamp into a historical offset so that I can use 𝚘𝚙𝚎𝚗 ?
I want to reference a very old value for a variable. How can I access a previous value that is older than the maximum historical buffer size of 𝚟𝚊𝚛𝚒𝚊𝚋𝚕𝚎 ?
This library can solve the above problems (and many more) with the addition of a few lines of code, rather than requiring the coder to refactor their script to accommodate the limitations.
█ OVERVIEW
The core functionality provided is conversion between xloc.bar_index and xloc.bar_time values.
The main component of the library is the 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 object, created via the 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊() function which basically stores the 𝚝𝚒𝚖𝚎 and 𝚝𝚒𝚖𝚎_𝚌𝚕𝚘𝚜𝚎 of every bar on the chart, and there are 3 more overloads to this function that allow collecting and storing additional data. Once a 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 object is created, use any of the exported methods:
Methods to convert a UNIX timestamp into a bar index or bar offset:
𝚝𝚒𝚖𝚎𝚜𝚝𝚊𝚖𝚙𝚃𝚘𝙱𝚊𝚛𝙸𝚗𝚍𝚎𝚡(), 𝚐𝚎𝚝𝙽𝚞𝚖𝚋𝚎𝚛𝙾𝚏𝙱𝚊𝚛𝚜𝙱𝚊𝚌𝚔()
Methods to retrieve the stored data for a bar index:
𝚝𝚒𝚖𝚎𝙰𝚝𝙱𝚊𝚛𝙸𝚗𝚍𝚎𝚡(), 𝚝𝚒𝚖𝚎𝙲𝚕𝚘𝚜𝚎𝙰𝚝𝙱𝚊𝚛𝙸𝚗𝚍𝚎𝚡(), 𝚟𝚊𝚕𝚞𝚎𝙰𝚝𝙱𝚊𝚛𝙸𝚗𝚍𝚎𝚡(), 𝚐𝚎𝚝𝙰𝚕𝚕𝚅𝚊𝚛𝚒𝚊𝚋𝚕𝚎𝚜𝙰𝚝𝙱𝚊𝚛𝙸𝚗𝚍𝚎𝚡()
Methods to retrieve the stored data at a number of bars back (i.e., historical offset):
𝚝𝚒𝚖𝚎(), 𝚝𝚒𝚖𝚎𝙲𝚕𝚘𝚜𝚎(), 𝚟𝚊𝚕𝚞𝚎()
Methods to retrieve all the data points from the earliest bar (or latest bar) stored in memory, which can be useful for debugging purposes:
𝚐𝚎𝚝𝙴𝚊𝚛𝚕𝚒𝚎𝚜𝚝𝚂𝚝𝚘𝚛𝚎𝚍𝙳𝚊𝚝𝚊(), 𝚐𝚎𝚝𝙻𝚊𝚝𝚎𝚜𝚝𝚂𝚝𝚘𝚛𝚎𝚍𝙳𝚊𝚝𝚊()
Note: the library's strong suit is referencing data from very old bars in the past, which is especially useful for scripts that perform its necessary calculations only on the last bar.
█ USAGE
Step 1
Import the library. Replace with the latest available version number for this library.
//@version=6
indicator("Usage")
import n00btraders/ChartData/
Step 2
Create a 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 object to collect data on every bar. Do not declare as `var` or `varip`.
chartData = ChartData.collectChartData() // call on every bar to accumulate the necessary data
Step 3
Call any method(s) on the 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 object. Do not modify its fields directly.
if barstate.islast
int firstBarTime = chartData.timeAtBarIndex(0)
int lastBarTime = chartData.time(0)
log.info("First `time`: " + str.format_time(firstBarTime) + ", Last `time`: " + str.format_time(lastBarTime))
█ EXAMPLES
• Collect Future Times
The overloaded 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊() functions that accept a 𝚋𝚊𝚛𝚜𝙵𝚘𝚛𝚠𝚊𝚛𝚍 argument can additionally store time values for up to 500 bars into the future.
//@version=6
indicator("Example `collectChartData(barsForward)`")
import n00btraders/ChartData/1
chartData = ChartData.collectChartData(barsForward = 500)
var rectangle = box.new(na, na, na, na, xloc = xloc.bar_time, force_overlay = true)
if barstate.islast
int futureTime = chartData.timeAtBarIndex(bar_index + 100)
int lastBarTime = time
box.set_lefttop(rectangle, lastBarTime, open)
box.set_rightbottom(rectangle, futureTime, close)
box.set_text(rectangle, "Extending box 100 bars to the right. Time: " + str.format_time(futureTime))
• Collect Custom Data
The overloaded 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊() functions that accept a 𝚟𝚊𝚛𝚒𝚊𝚋𝚕𝚎𝚜 argument can additionally store custom user-specified values for every bar on the chart.
//@version=6
indicator("Example `collectChartData(variables)`")
import n00btraders/ChartData/1
var map variables = map.new()
variables.put("open", open)
variables.put("close", close)
variables.put("open-close midpoint", (open + close) / 2)
variables.put("boolean", open > close ? 1 : 0)
chartData = ChartData.collectChartData(variables = variables)
var fgColor = chart.fg_color
var table1 = table.new(position.top_right, 2, 9, color(na), fgColor, 1, fgColor, 1, true)
var table2 = table.new(position.bottom_right, 2, 9, color(na), fgColor, 1, fgColor, 1, true)
if barstate.isfirst
table.cell(table1, 0, 0, "ChartData.value()", text_color = fgColor)
table.cell(table2, 0, 0, "open ", text_color = fgColor)
table.merge_cells(table1, 0, 0, 1, 0)
table.merge_cells(table2, 0, 0, 1, 0)
for i = 1 to 8
table.cell(table1, 0, i, text_color = fgColor, text_halign = text.align_left, text_font_family = font.family_monospace)
table.cell(table2, 0, i, text_color = fgColor, text_halign = text.align_left, text_font_family = font.family_monospace)
table.cell(table1, 1, i, text_color = fgColor)
table.cell(table2, 1, i, text_color = fgColor)
if barstate.islast
for i = 1 to 8
float open1 = chartData.value("open", 5000 * i)
float open2 = i < 3 ? open : -1
table.cell_set_text(table1, 0, i, "chartData.value(\"open\", " + str.tostring(5000 * i) + "): ")
table.cell_set_text(table2, 0, i, "open : ")
table.cell_set_text(table1, 1, i, str.tostring(open1))
table.cell_set_text(table2, 1, i, open2 >= 0 ? str.tostring(open2) : "Error")
• xloc.bar_index → xloc.bar_time
The 𝚝𝚒𝚖𝚎 value (or 𝚝𝚒𝚖𝚎_𝚌𝚕𝚘𝚜𝚎 value) can be retrieved for any bar index that is stored in memory by the 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 object.
//@version=6
indicator("Example `timeAtBarIndex()`")
import n00btraders/ChartData/1
chartData = ChartData.collectChartData()
if barstate.islast
int start = bar_index - 15000
int end = bar_index - 100
// line.new(start, close, end, close) // !ERROR - `start` value is too far from current bar index
start := chartData.timeAtBarIndex(start)
end := chartData.timeAtBarIndex(end)
line.new(start, close, end, close, xloc.bar_time, width = 10)
• xloc.bar_time → xloc.bar_index
Use 𝚝𝚒𝚖𝚎𝚜𝚝𝚊𝚖𝚙𝚃𝚘𝙱𝚊𝚛𝙸𝚗𝚍𝚎𝚡() to find the bar that a timestamp belongs to.
If the timestamp falls in between the close of one bar and the open of the next bar,
the 𝚜𝚗𝚊𝚙 parameter can be used to determine which bar to choose:
𝚂𝚗𝚊𝚙.𝙻𝙴𝙵𝚃 - prefer to choose the leftmost bar (typically used for closing times)
𝚂𝚗𝚊𝚙.𝚁𝙸𝙶𝙷𝚃 - prefer to choose the rightmost bar (typically used for opening times)
𝚂𝚗𝚊𝚙.𝙳𝙴𝙵𝙰𝚄𝙻𝚃 (or 𝚗𝚊) - copies the same behavior as xloc.bar_time uses for drawing objects
//@version=6
indicator("Example `timestampToBarIndex()`")
import n00btraders/ChartData/1
startTimeInput = input.time(timestamp("01 Aug 2025 08:30 -0500"), "Session Start Time")
endTimeInput = input.time(timestamp("01 Aug 2025 15:15 -0500"), "Session End Time")
chartData = ChartData.collectChartData()
if barstate.islastconfirmedhistory
int startBarIndex = chartData.timestampToBarIndex(startTimeInput, ChartData.Snap.RIGHT)
int endBarIndex = chartData.timestampToBarIndex(endTimeInput, ChartData.Snap.LEFT)
line1 = line.new(startBarIndex, 0, startBarIndex, 1, extend = extend.both, color = color.new(color.green, 60), force_overlay = true)
line2 = line.new(endBarIndex, 0, endBarIndex, 1, extend = extend.both, color = color.new(color.green, 60), force_overlay = true)
linefill.new(line1, line2, color.new(color.green, 90))
// using Snap.DEFAULT to show that it is equivalent to drawing lines using `xloc.bar_time` (i.e., it aligns to the same bars)
startBarIndex := chartData.timestampToBarIndex(startTimeInput)
endBarIndex := chartData.timestampToBarIndex(endTimeInput)
line.new(startBarIndex, 0, startBarIndex, 1, extend = extend.both, color = color.yellow, width = 3)
line.new(endBarIndex, 0, endBarIndex, 1, extend = extend.both, color = color.yellow, width = 3)
line.new(startTimeInput, 0, startTimeInput, 1, xloc.bar_time, extend.both, color.new(color.blue, 85), width = 11)
line.new(endTimeInput, 0, endTimeInput, 1, xloc.bar_time, extend.both, color.new(color.blue, 85), width = 11)
• Get Price of Line at Timestamp
The pine script built-in function line.get_price() requires working with bar index values. To get the price of a line in terms of a timestamp, convert the timestamp into a bar index or offset.
//@version=6
indicator("Example `line.get_price()` at timestamp")
import n00btraders/ChartData/1
lineStartInput = input.time(timestamp("01 Aug 2025 08:30 -0500"), "Line Start")
chartData = ChartData.collectChartData()
var diagonal = line.new(na, na, na, na, force_overlay = true)
if time <= lineStartInput
line.set_xy1(diagonal, bar_index, open)
if barstate.islastconfirmedhistory
line.set_xy2(diagonal, bar_index, close)
if barstate.islast
int timeOneWeekAgo = timenow - (7 * timeframe.in_seconds("1D") * 1000)
// Note: could also use `timetampToBarIndex(timeOneWeekAgo, Snap.DEFAULT)` and pass the value directly to `line.get_price()`
int barsOneWeekAgo = chartData.getNumberOfBarsBack(timeOneWeekAgo)
float price = line.get_price(diagonal, bar_index - barsOneWeekAgo)
string formatString = "Time 1 week ago: {0,number,#}\n - Equivalent to {1} bars ago\n\n𝚕𝚒𝚗𝚎.𝚐𝚎𝚝_𝚙𝚛𝚒𝚌𝚎(): {2,number,#.##}"
string labelText = str.format(formatString, timeOneWeekAgo, barsOneWeekAgo, price)
label.new(timeOneWeekAgo, price, labelText, xloc.bar_time, style = label.style_label_lower_right, size = 16, textalign = text.align_left, force_overlay = true)
█ RUNTIME ERROR MESSAGES
This library's functions will generate a custom runtime error message in the following cases:
𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊() is not called consecutively, or is called more than once on a single bar
Invalid 𝚋𝚊𝚛𝚜𝙵𝚘𝚛𝚠𝚊𝚛𝚍 argument in the 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊() function
Invalid 𝚟𝚊𝚛𝚒𝚊𝚋𝚕𝚎𝚜 argument in the 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊() function
Invalid 𝚕𝚎𝚗𝚐𝚝𝚑 argument in any of the functions that accept a number of bars back
Note: there is no runtime error generated for an invalid 𝚝𝚒𝚖𝚎𝚜𝚝𝚊𝚖𝚙 or 𝚋𝚊𝚛𝙸𝚗𝚍𝚎𝚡 argument in any of the functions. Instead, the functions will assign 𝚗𝚊 to the returned values.
Any other runtime errors are due to incorrect usage of the library.
█ NOTES
• Function Descriptions
The library source code uses Markdown for the exported functions. Hover over a function/method call in the Pine Editor to display formatted, detailed information about the function/method.
//@version=6
indicator("Demo Function Tooltip")
import n00btraders/ChartData/1
chartData = ChartData.collectChartData()
int barIndex = chartData.timestampToBarIndex(timenow)
log.info(str.tostring(barIndex))
• Historical vs. Realtime Behavior
Under the hood, the data collector for this library is declared as `var`. Because of this, the 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 object will always reflect the latest available data on realtime updates. Any data that is recorded for historical bars will remain unchanged throughout the execution of a script.
//@version=6
indicator("Demo Realtime Behavior")
import n00btraders/ChartData/1
var map variables = map.new()
variables.put("open", open)
variables.put("close", close)
chartData = ChartData.collectChartData(variables)
if barstate.isrealtime
varip float initialOpen = open
varip float initialClose = close
varip int updateCount = 0
updateCount += 1
float latestOpen = open
float latestClose = close
float recordedOpen = chartData.valueAtBarIndex("open", bar_index)
float recordedClose = chartData.valueAtBarIndex("close", bar_index)
string formatString = "# of updates: {0}\n\n𝚘𝚙𝚎𝚗 at update #1: {1,number,#.##}\n𝚌𝚕𝚘𝚜𝚎 at update #1: {2,number,#.##}\n\n"
+ "𝚘𝚙𝚎𝚗 at update #{0}: {3,number,#.##}\n𝚌𝚕𝚘𝚜𝚎 at update #{0}: {4,number,#.##}\n\n"
+ "𝚘𝚙𝚎𝚗 stored in memory: {5,number,#.##}\n𝚌𝚕𝚘𝚜𝚎 stored in memory: {6,number,#.##}"
string labelText = str.format(formatString, updateCount, initialOpen, initialClose, latestOpen, latestClose, recordedOpen, recordedClose)
label.new(bar_index, close, labelText, style = label.style_label_left, force_overlay = true)
• Collecting Chart Data for Other Contexts
If your use case requires collecting chart data from another context, avoid directly retrieving the 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 object as this may exceed memory limits .
//@version=6
indicator("Demo Return Calculated Results")
import n00btraders/ChartData/1
timeInput = input.time(timestamp("01 Sep 2025 08:30 -0500"), "Time")
var int oneMinuteBarsAgo = na
// !ERROR - Memory Limits Exceeded
// chartDataArray = request.security_lower_tf(syminfo.tickerid, "1", ChartData.collectChartData())
// oneMinuteBarsAgo := chartDataArray.last().getNumberOfBarsBack(timeInput)
// function that returns calculated results (a single integer value instead of an entire `ChartData` object)
getNumberOfBarsBack() =>
chartData = ChartData.collectChartData()
chartData.getNumberOfBarsBack(timeInput)
calculatedResultsArray = request.security_lower_tf(syminfo.tickerid, "1", getNumberOfBarsBack())
oneMinuteBarsAgo := calculatedResultsArray.size() > 0 ? calculatedResultsArray.last() : na
if barstate.islast
string labelText = str.format("The selected timestamp occurs 1-minute bars ago", oneMinuteBarsAgo)
label.new(bar_index, hl2, labelText, style = label.style_label_left, size = 16, force_overlay = true)
• Memory Usage
The library's convenience and ease of use comes at the cost of increased usage of computational resources. For simple scripts, using this library will likely not cause any issues with exceeding memory limits. But for large and complex scripts, you can reduce memory issues by specifying a lower 𝚌𝚊𝚕𝚌_𝚋𝚊𝚛𝚜_𝚌𝚘𝚞𝚗𝚝 amount in the indicator() or strategy() declaration statement.
//@version=6
// !ERROR - Memory Limits Exceeded using the default number of bars available (~20,000 bars for Premium plans)
//indicator("Demo `calc_bars_count` parameter")
// Reduce number of bars using `calc_bars_count` parameter
indicator("Demo `calc_bars_count` parameter", calc_bars_count = 15000)
import n00btraders/ChartData/1
map variables = map.new()
variables.put("open", open)
variables.put("close", close)
variables.put("weekofyear", weekofyear)
variables.put("dayofmonth", dayofmonth)
variables.put("hour", hour)
variables.put("minute", minute)
variables.put("second", second)
// simulate large memory usage
chartData0 = ChartData.collectChartData(variables)
chartData1 = ChartData.collectChartData(variables)
chartData2 = ChartData.collectChartData(variables)
chartData3 = ChartData.collectChartData(variables)
chartData4 = ChartData.collectChartData(variables)
chartData5 = ChartData.collectChartData(variables)
chartData6 = ChartData.collectChartData(variables)
chartData7 = ChartData.collectChartData(variables)
chartData8 = ChartData.collectChartData(variables)
chartData9 = ChartData.collectChartData(variables)
log.info(str.tostring(chartData0.time(0)))
log.info(str.tostring(chartData1.time(0)))
log.info(str.tostring(chartData2.time(0)))
log.info(str.tostring(chartData3.time(0)))
log.info(str.tostring(chartData4.time(0)))
log.info(str.tostring(chartData5.time(0)))
log.info(str.tostring(chartData6.time(0)))
log.info(str.tostring(chartData7.time(0)))
log.info(str.tostring(chartData8.time(0)))
log.info(str.tostring(chartData9.time(0)))
if barstate.islast
result = table.new(position.middle_right, 1, 1, force_overlay = true)
table.cell(result, 0, 0, "Script Execution Successful ✅", text_size = 40)
█ EXPORTED ENUMS
Snap
Behavior for determining the bar that a timestamp belongs to.
Fields:
LEFT : Snap to the leftmost bar.
RIGHT : Snap to the rightmost bar.
DEFAULT : Default `xloc.bar_time` behavior.
Note: this enum is used for the 𝚜𝚗𝚊𝚙 parameter of 𝚝𝚒𝚖𝚎𝚜𝚝𝚊𝚖𝚙𝚃𝚘𝙱𝚊𝚛𝙸𝚗𝚍𝚎𝚡().
█ EXPORTED TYPES
Note: users of the library do not need to worry about directly accessing the fields of these types; all computations are done through method calls on an object of the 𝙲𝚑𝚊𝚛𝚝𝙳𝚊𝚝𝚊 type.
Variable
Represents a user-specified variable that can be tracked on every chart bar.
Fields:
name (series string) : Unique identifier for the variable.
values (array) : The array of stored values (one value per chart bar).
ChartData
Represents data for all bars on a chart.
Fields:
bars (series int) : Current number of bars on the chart.
timeValues (array) : The `time` values of all chart (and future) bars.
timeCloseValues (array) : The `time_close` values of all chart (and future) bars.
variables (array) : Additional custom values to track on all chart bars.
█ EXPORTED FUNCTIONS
collectChartData()
Collects and tracks the `time` and `time_close` value of every bar on the chart.
Returns: `ChartData` object to convert between `xloc.bar_index` and `xloc.bar_time`.
collectChartData(barsForward)
Collects and tracks the `time` and `time_close` value of every bar on the chart as well as a specified number of future bars.
Parameters:
barsForward (simple int) : Number of future bars to collect data for.
Returns: `ChartData` object to convert between `xloc.bar_index` and `xloc.bar_time`.
collectChartData(variables)
Collects and tracks the `time` and `time_close` value of every bar on the chart. Additionally, tracks a custom set of variables for every chart bar.
Parameters:
variables (simple map) : Custom values to collect on every chart bar.
Returns: `ChartData` object to convert between `xloc.bar_index` and `xloc.bar_time`.
collectChartData(barsForward, variables)
Collects and tracks the `time` and `time_close` value of every bar on the chart as well as a specified number of future bars. Additionally, tracks a custom set of variables for every chart bar.
Parameters:
barsForward (simple int) : Number of future bars to collect data for.
variables (simple map) : Custom values to collect on every chart bar.
Returns: `ChartData` object to convert between `xloc.bar_index` and `xloc.bar_time`.
█ EXPORTED METHODS
method timestampToBarIndex(chartData, timestamp, snap)
Converts a UNIX timestamp to a bar index.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
timestamp (series int) : A UNIX time.
snap (series Snap) : A `Snap` enum value.
Returns: A bar index, or `na` if unable to find the appropriate bar index.
method getNumberOfBarsBack(chartData, timestamp)
Converts a UNIX timestamp to a history-referencing length (i.e., number of bars back).
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
timestamp (series int) : A UNIX time.
Returns: A bar offset, or `na` if unable to find a valid number of bars back.
method timeAtBarIndex(chartData, barIndex)
Retrieves the `time` value for the specified bar index.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
barIndex (int) : The bar index.
Returns: The `time` value, or `na` if there is no `time` stored for the bar index.
method time(chartData, length)
Retrieves the `time` value of the bar that is `length` bars back relative to the latest bar.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
length (series int) : Number of bars back.
Returns: The `time` value `length` bars ago, or `na` if there is no `time` stored for that bar.
method timeCloseAtBarIndex(chartData, barIndex)
Retrieves the `time_close` value for the specified bar index.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
barIndex (series int) : The bar index.
Returns: The `time_close` value, or `na` if there is no `time_close` stored for the bar index.
method timeClose(chartData, length)
Retrieves the `time_close` value of the bar that is `length` bars back from the latest bar.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
length (series int) : Number of bars back.
Returns: The `time_close` value `length` bars ago, or `na` if there is none stored.
method valueAtBarIndex(chartData, name, barIndex)
Retrieves the value of a custom variable for the specified bar index.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
name (series string) : The variable name.
barIndex (series int) : The bar index.
Returns: The value of the variable, or `na` if that variable is not stored for the bar index.
method value(chartData, name, length)
Retrieves a variable value of the bar that is `length` bars back relative to the latest bar.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
name (series string) : The variable name.
length (series int) : Number of bars back.
Returns: The value `length` bars ago, or `na` if that variable is not stored for the bar index.
method getAllVariablesAtBarIndex(chartData, barIndex)
Retrieves all custom variables for the specified bar index.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
barIndex (series int) : The bar index.
Returns: Map of all custom variables that are stored for the specified bar index.
method getEarliestStoredData(chartData)
Gets all values from the earliest bar data that is currently stored in memory.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
Returns: A tuple:
method getLatestStoredData(chartData, futureData)
Gets all values from the latest bar data that is currently stored in memory.
Namespace types: ChartData
Parameters:
chartData (series ChartData) : The `ChartData` object.
futureData (series bool) : Whether to include the future data that is stored in memory.
Returns: A tuple: