{talib} is an R package for Technical Analysis (TA) and interactive financial charts. The package is a wrapper of TA-Lib and supports over 200 indicators, including candlestick patterns.
All functions in {talib} expect the input
x to be coercible to data.frame with columns
named according to OHLC-V conventions. The package ships with several
built-in datasets:
str(talib::BTC)
#> 'data.frame': 366 obs. of 5 variables:
#> $ open : num 42274 44185 44966 42863 44191 ...
#> $ high : num 44200 45918 45521 44799 44392 ...
#> $ low : num 42181 44152 40555 42651 42362 ...
#> $ close : num 44185 44966 42863 44191 44179 ...
#> $ volume: num 831 2076 2225 1791 2483 ...Column names must be lowercase: open,
high, low, close, and
volume. Names such as Close,
CLOSE, or Adj.Close will not be recognized. If
your data uses different names you have two options: rename the columns,
or remap them with the cols argument (see Column selection with
cols).
Different indicators use different subsets of the OHLC-V columns. The table below gives a rough guide:
| Indicator type | Default columns | Example |
|---|---|---|
| Univariate (most) | close |
RSI(), SMA(),
EMA() |
| High-Low based | high + low |
SAR(), AROON() |
| High-Low-Close | high + low + close |
STOCH(), CCI(),
ATR() |
| Full OHLC | open + high + low + close |
All candlestick patterns |
| Volume-based | volume (+ price columns) |
OBV(), AD(),
MFI() |
A data.frame that only contains high,
low, and close is perfectly valid input for
STOCH() or CCI()—columns that are not needed
are simply ignored.
Pass an OHLC-V object directly to any indicator function:
tail(
talib::bollinger_bands(talib::BTC)
)
#> UpperBand MiddleBand LowerBand
#> 2024-12-26 01:00:00 100487.38 96698.61 92909.83
#> 2024-12-27 01:00:00 100670.65 96512.96 92355.27
#> 2024-12-28 01:00:00 100632.13 96581.91 92531.69
#> 2024-12-29 01:00:00 99628.77 95576.60 91524.43
#> 2024-12-30 01:00:00 96403.53 94231.31 92059.09
#> 2024-12-31 01:00:00 95441.13 93774.23 92107.34All indicator functions follow the same S3 dispatch pattern, with
methods for data.frame, matrix,
numeric, and plotly. The return type matches
the input type:
Every indicator has a descriptive snake_case name and an uppercase alias that mirrors the TA-Lib C function name. Both are interchangeable:
NA valuesMost indicators require a minimum number of observations before they
can produce a value. This is called the lookback
period. The first lookback rows of the result will
be NA:
## SMA with n = 5 has a lookback of 4
head(
talib::SMA(talib::BTC, n = 5),
n = 7
)
#> SMA
#> 2024-01-01 01:00:00 NA
#> 2024-01-02 01:00:00 NA
#> 2024-01-03 01:00:00 NA
#> 2024-01-04 01:00:00 NA
#> 2024-01-05 01:00:00 44076.95
#> 2024-01-06 01:00:00 44038.77
#> 2024-01-07 01:00:00 43835.33The lookback is stored as an attribute on the result:
colsThe cols argument accepts a one-sided formula
(~) that selects which columns to use for the calculation.
Every indicator has a sensible default, but cols lets you
override it.
For indicators that operate on a single series (e.g.,
RSI, SMA), the default is ~close.
Pass a different column to calculate the indicator on that series
instead:
For indicators that require multiple columns, cols
remaps which columns are used. The order in the formula must match the
order expected by the indicator:
## Stochastic defaults to ~high + low + close;
## here we swap 'close' for 'open'
tail(
talib::STOCH(
talib::BTC,
cols = ~high + low + open
)
)
#> SlowK SlowD
#> 2024-12-26 01:00:00 71.97751 51.79551
#> 2024-12-27 01:00:00 74.68050 65.64619
#> 2024-12-28 01:00:00 49.96515 65.54105
#> 2024-12-29 01:00:00 29.80067 51.48210
#> 2024-12-30 01:00:00 23.91322 34.55968
#> 2024-12-31 01:00:00 26.81634 26.84341...Additional arguments are forwarded to model.frame().
This is useful for computing an indicator on a subset of the data:
## Bollinger Bands on the first 100 rows only
tail(
talib::BBANDS(
talib::BTC,
subset = 1:nrow(talib::BTC) %in% 1:100
)
)
#> UpperBand MiddleBand LowerBand
#> 2024-04-04 02:00:00 72605.20 68193.82 63782.44
#> 2024-04-05 02:00:00 70646.91 67502.88 64358.84
#> 2024-04-06 02:00:00 70087.36 67344.94 64602.52
#> 2024-04-07 02:00:00 70475.41 68122.29 65769.16
#> 2024-04-08 02:00:00 71820.87 69249.88 66678.89
#> 2024-04-09 02:00:00 71848.20 69372.65 66897.09na.bridgeReal-world data often contains missing values. By default
(na.bridge = FALSE), any NA in the input
propagates through the entire calculation, which can fill the result
with NAs.
Setting na.bridge = TRUE strips NA rows
before calculation, computes the indicator on the clean data, and then
re-inserts NAs at their original positions:
The stripped rows are restored in the output, so the result always has the same number of rows as the input:
Several indicators accept a Moving Average
specification for their smoothing component. MA functions such
as SMA(), EMA(), WMA(),
DEMA(), TEMA(), TRIMA(),
KAMA(), and T3() serve a dual purpose:
x: compute the Moving Average on
the data.x: return a specification (a
named list) that other indicators use internally.This specification can be passed to indicators like
bollinger_bands() or stochastic() to control
the type of smoothing:
## Bollinger Bands with an EMA(20) middle band
tail(
talib::bollinger_bands(
talib::BTC,
ma = talib::EMA(n = 20)
)
)
#> UpperBand MiddleBand LowerBand
#> 2024-12-26 01:00:00 104645.9 98186.94 91727.99
#> 2024-12-27 01:00:00 104677.9 97804.16 90930.38
#> 2024-12-28 01:00:00 104597.2 97548.60 90500.04
#> 2024-12-29 01:00:00 104577.9 97169.11 89760.28
#> 2024-12-30 01:00:00 104576.0 96736.62 88897.26
#> 2024-12-31 01:00:00 104478.2 96417.96 88357.68## Stochastic with WMA smoothing
tail(
talib::stochastic(
talib::BTC,
slowk = talib::WMA(n = 5),
slowd = talib::EMA(n = 3)
)
)
#> SlowK SlowD
#> 2024-12-26 01:00:00 62.93474 57.17934
#> 2024-12-27 01:00:00 52.56693 54.87313
#> 2024-12-28 01:00:00 43.17803 49.02558
#> 2024-12-29 01:00:00 27.93503 38.48031
#> 2024-12-30 01:00:00 19.49793 28.98912
#> 2024-12-31 01:00:00 22.83957 25.91435Candlestick pattern functions return an integer matrix:
1 for bullish, -1 for bearish, and
0 for no pattern. The encoding can be changed via
options(talib.normalize = FALSE) to use
100/-100 instead.
x <- talib::harami(talib::BTC)
tail(x)
#> CDLHARAMI
#> 2024-12-26 01:00:00 0
#> 2024-12-27 01:00:00 0
#> 2024-12-28 01:00:00 0
#> 2024-12-29 01:00:00 0
#> 2024-12-30 01:00:00 0
#> 2024-12-31 01:00:00 0## find all bullish occurrences
talib::BTC[which(x == 1), ]
#> open high low close volume
#> 2024-01-13 01:00:00 42770.74 43244.75 42417.54 42842.43 1389.8450
#> 2024-01-19 01:00:00 41286.00 42144.29 40250.00 41622.00 2204.1180
#> 2024-01-23 01:00:00 39521.03 40135.90 38508.01 39871.07 1691.9766
#> 2024-03-06 01:00:00 63803.50 67655.97 62834.01 66112.32 2152.6899
#> 2024-04-03 02:00:00 65477.34 66944.00 64500.00 65986.02 730.2592
#> 2024-04-16 02:00:00 63449.24 64392.44 61641.34 63820.00 975.8047
#> 2024-05-02 02:00:00 58267.89 59638.02 56893.92 59066.67 1608.7340
#> 2024-06-27 02:00:00 60828.18 62346.00 60559.38 61629.99 1343.3199
#> 2024-12-20 01:00:00 97385.63 98138.88 92129.00 97767.96 6001.8659Note: For a detailed treatment of candlestick lookback and sensitivity parameters, see
vignette("candlestick", package = "talib").
The package includes interactive charting built on {plotly}. The two main
functions are chart() and indicator(), which
work like plot() and lines():
{
## main candlestick chart
talib::chart(talib::BTC)
## add Bollinger Bands
talib::indicator(talib::bollinger_bands)
## add identified Harami patterns
talib::indicator(talib::harami)
## add MACD as a sub-chart
talib::indicator(talib::MACD)
}indicator() automatically determines whether a given
indicator belongs on the main price chart (e.g., Bollinger Bands, SAR)
or as a sub-chart (e.g., RSI, MACD).
Note: For themes, chart options, and advanced charting, see
vignette("charting", package = "talib").
The underlying library, TA-Lib, is a long-standing and well-known library but this R wrapper is still in its early stage. All contributions, suggestions, and bug reports are welcome.