Pine Script® empowers traders and developers to build sophisticated trading strategies and indicators by enabling access to data beyond the current chart’s context. One of its most powerful capabilities is the ability to retrieve data from alternative symbols, timeframes, financial reports, economic indicators, and even external repositories. This deep dive explores the request.* family of functions—essential tools for any advanced Pine Script developer.
Whether you're analyzing multi-timeframe trends, calculating cross-asset correlations, or incorporating fundamental data into technical systems, understanding these functions is crucial. We'll explore their core mechanics, common parameters, practical use cases, and best practices to avoid pitfalls like repainting and lookahead bias.
Core Functions for External Data Access
The request.* namespace in Pine Script provides a suite of functions designed to fetch data from diverse sources:
request.security(): Retrieves data from another symbol or timeframe.request.security_lower_tf(): Accesses intrabar (lower timeframe) data with full granularity.request.currency_rate(): Converts values between currencies using daily exchange rates.request.dividends(),request.splits(),request.earnings(): Fetch corporate event data.request.financial(): Pulls financial statements and metrics via FactSet integration.request.economic(): Retrieves macroeconomic and industry-level data.request.seed(): Imports data from a user-maintained GitHub repository.
These functions enable a new dimension of analysis—moving beyond single-symbol, single-timeframe logic to create truly adaptive and intelligent trading scripts.
👉 Discover how to integrate real-time market data into your strategies
Common Characteristics Across Request Functions
Despite their varied purposes, all request.* functions share key behavioral traits that influence how they interact with historical and live market data.
Behavior and Execution Model
Each request.* call fetches a dataset from a defined context—typically a symbol and timeframe—and evaluates an expression across that data. For example:
float dailySlope = request.security("AMEX:SPY", "1D", ta.linreg(hl2, 20, 0) - ta.linreg(hl2, 20, 1))This line calculates the 20-bar linear regression slope of the hl2 price on SPY’s daily chart, regardless of the script’s current timeframe.
Scripts can make up to 40 unique request.* calls. Repeated calls with identical arguments reuse cached results, improving efficiency without consuming additional limits.
Handling Gaps in Data: The gaps Parameter
When retrieving higher-timeframe data on a lower-timeframe chart, values are only updated at specific intervals. The gaps parameter controls whether missing values return na or carry forward the last known value.
barmerge.gaps_on: Returnsnawhen no new data is available.barmerge.gaps_off(default): Fills gaps with the last confirmed value.
For example:
float filled = request.security(syminfo.tickerid, "60", close, gaps=barmerge.gaps_off)
float gapped = request.security(syminfo.tickerid, "60", close, gaps=barmerge.gaps_on)Using gaps=off ensures continuity in plots and calculations during backtesting and live trading.
Managing Invalid Symbols: ignore_invalid_symbol
Setting ignore_invalid_symbol=true prevents runtime errors when requesting data for invalid tickers. Instead of crashing, the function returns na, allowing graceful fallbacks:
float shares = request.financial(tickerId, "TOTAL_SHARES_OUTSTANDING", "FQ", ignore_invalid_symbol=true)This is essential for reusable scripts that may run on assets without financial reporting (e.g., forex or crypto).
Currency Conversion: The currency Parameter
Values retrieved from different markets can be automatically converted to a target currency:
float revenueUSD = request.financial("JP:7203", "REVENUE", "FY", currency=currency.USD)Conversion uses the previous day’s exchange rate from major markets, ensuring realistic valuation across global assets.
Avoiding Lookahead Bias: The lookahead Parameter
Lookahead determines whether future data leaks into historical bars—a critical concern for strategy integrity.
barmerge.lookahead_off(default): Prevents access to future bars.barmerge.lookahead_on: Allows future data—only safe when offsetting expressions (e.g.,high[1]).
Misuse can lead to repainting, where indicator values change after the bar closes. Always offset expressions when using lookahead:
float htfHigh = request.security(syminfo.tickerid, "240", high[1], lookahead=barmerge.lookahead_on)This ensures consistent behavior between real-time and historical data.
Dynamic Requests in Pine Script v6
Pine Script v6 enables dynamic requests by default—allowing request.* calls to accept changing ("series") arguments and execute within loops, conditionals, and user-defined functions.
Series Arguments for Adaptive Logic
You can dynamically switch symbols or timeframes:
string symbol = bar_index % 100 < 50 ? "AAPL" : "MSFT"
float price = request.security(symbol, timeframe.period, close)However, all required contexts must be accessed during historical processing. Real-time bars cannot initiate new data requests.
Execution in Local Scopes
Dynamic requests work inside loops:
for sym in symbols
float vol = request.security("OANDA:" + sym, timeframe.period, volume)
volumes.push(vol)But the expression must be loop-invariant—it cannot depend on loop variables.
Nested and Library-Based Requests
Functions in libraries can safely use request.* calls if expressions don’t depend on parameters. Nested requests allow context inheritance:
string info1 = request.security("", "", syminfo.tickerid + "_" + timeframe.period)
string info2 = request.security("NASDAQ:AAPL", "240", info1) // Executes in AAPL/240 contextDisabling dynamic requests (dynamic_requests=false) breaks this behavior, treating nested calls as static value passes.
Understanding Data Feeds and Synchronization
TradingView sources data from multiple feeds:
- Intraday (for <1D timeframes)
- End-of-Day (EOD)
- Realtime (may be delayed)
- Extended hours
Important considerations:
- EOD volume may include off-exchange trades not visible intraday.
- Price discrepancies between EOD and intraday feeds are common in equities.
- EOD feeds exclude extended session activity.
- Requested data aligns with the chart’s time axis, meaning gaps appear when comparing assets with different trading hours (e.g., BTCUSD on an SPY chart).
Deep Dive: request.security()
This function is the cornerstone of multi-context analysis.
Timeframe Flexibility
Retrieve data from any timeframe:
float weeklyMA = request.security(syminfo.tickerid, "1W", ta.sma(close, 50))For lower timeframes, prefer request.security_lower_tf() due to limitations in intrabar sampling.
Requestable Data Types
The expression parameter supports:
- Built-in variables (
close,volume) - Function outputs (
ta.rsi()) - Tuples (multiple return values)
- Collections (arrays, maps)
- User-defined types
- Chart points (for drawing tools)
Example: Multi-Timeframe Moving Average Ribbon
int length = input.int(20)
float chartAvg = ta.sma(ohlc4, length)
float htfAvg = request.security(syminfo.tickerid, "240", ta.sma(ohlc4, length))
plot(chartAvg)
plot(htfAvg)👉 Build smarter indicators using multi-source market intelligence
Leveraging request.security_lower_tf() for Intraday Precision
Use this function to access granular intrabar data:
array intrabarCloses = request.security_lower_tf(syminfo.tickerid, "5", close)
float avgIntraClose = array.avg(intrabarCloses)It returns an array of all available lower-timeframe bars within each chart bar—ideal for volume profiling, tick analysis, or microstructure studies.
Frequently Asked Questions
Q: What happens if I exceed the 40-request limit?
A: The script will fail to compile. Optimize by reusing calls and avoiding redundancy.
Q: Why does my indicator repaint on historical bars?
A: Likely due to improper lookahead usage. Always offset expressions (e.g., close[1]) when using lookahead=on.
Q: Can I use request.financial() with cryptocurrencies?
A: No—financial data is only available for equities and ETFs with published reports.
Q: How often is economic data updated?
A: Typically at the end of the trading day based on official releases.
Q: Does request.currency_rate() support all currency pairs?
A: It uses major exchange rates; obscure pairs may be derived via cross-currency spreads.
Q: Can I request data from a private GitHub repo with request.seed()?
A: No—only public repositories are supported.
Final Thoughts
Mastering Pine Script’s request.* functions unlocks advanced analytical capabilities—from multi-asset correlation engines to hybrid technical-fundamental systems. By understanding parameters like gaps, lookahead, and currency, you ensure accuracy and integrity in both backtesting and live trading environments.
As markets evolve, so should your tools. Leverage these functions responsibly to build robust, forward-looking strategies that stand the test of time.
👉 Start building powerful trading algorithms with real-time data integration