TR()
function to calculate the true high, true
low, and true range. Refactored ATR()
to use the
TR()
function. Thanks to @openbmsjsc and Steve Bronder for the
reports, and Ethan B. Smith for the PR. (#18, #114, #124)Fix stockSymbols()
for ticker “NA”.
read.table()
converts the string “NA” to a missing value
(NA) because na.strings = "NA"
by default. This causes an
issue because there’s actually a company with “NA” for the ticker.
(#128)
CTI()
did not pad its result with leading NA when
the input was not coerced to an xts object. This was different from
other TTR functions (e.g. SMA()
, RSI()
,
ROC()
). (#127)
Removed the VMA()
function, which was never correct
because the results made no sense.
Check that the wma()
C function has enough non-NA
values and throw an error if it doesn’t. This could cause the
WMA()
function to crash the user’s R session.
(#126)
runMean(..., cumulative = TRUE)
didn’t account for
leading NA in the denominator. (#122)
runSD(x, cumulative = TRUE)
returned all NA when
x
had any leading NA. Thanks to Ethan B. Smith for the
report. (#121)
The TRIX()
signal line did not use nSig
unless maType
was provided. Thanks to @SatoshiReport for
the… report. (#120)
ALMA()
calculation speed.
Thanks to Ethan B. Smith for the report and suggested fix. (#117)runPercentRank()
would segfault if x
had fewer non-NA observations than the value for n
. Thanks
to Ian Fellows for the report. (#112)
run*(x, n = 1, cumulative = TRUE)
functions would
return NA for the first value. Thanks to Ethan B. Smith for the report
and PR! (#111, #108, #88)
Fix NA check off-by-one error in aroon()
that caused
it to fail if there were exactly enough non-NA values. (#102)
ratio > 0
before calculating
n
in zlema()
C code. The prior code could
result in division by 0, which was flagged by clang-UBSAN. Thanks to
Prof Brian Ripley for the report. (#100)Fix leading NA accounting in wma()
C code. The prior
code caused invalid reads under valgrind. Thanks to Prof Brian Ripley
for the report. (#99)
Check for ratio > 0
before calculating
n
n ema()
C code. The prior code could result
in division by 0, which was flagged by UBSAN. Thanks to Prof Brian
Ripley for the report. (#100)
Make ALMA()
output length equal input length when
the input can not be converted to xts. This was caused by the difference
between rollapply.default()
and
rollapply.xts()
. Thanks to GitHub user @marksimmonds for the
report. (#29)
Fix stoch()
in very rare cases where
fastK = Inf
. I could only reproduce this if the Close is
> High and High and Low are equal, but that is a data error. I fixed
anyway because there may be other cases I don’t anticipate. Thanks to
GitHub user @cjuncosa for the report. (#52)
Fix MFI()
when money flow is always zero or
positive. The denominator of the money ratio will be zero if there is no
negative money flow for n
consecutive observations
(e.g. during a strong up-trend), which causes the money flow index to be
Inf. Set the money flow index to 100 in this case.
And the money ratio will be NaN if there’s no money flow for
n
consecutive observations (e.g. if there are no trades),
which causes the money flow index to be NaN. Set the money flow index to
50 in this case.
Thanks to GitHub user @jgehw for the report, reproducible example, and suggested patch. (#81)
Updated stockSymbols()
to use the NASDAQ FTP site
instead of downloading the CSV from the NASDAQ stock screener page. Some
columns are no longer populated because they are not provided in the FTP
file: LastSale ,MarketCap, IPOyear, Sector, Industry These columns will
be removed in a future version. (#98, #5, #97)
runPercentRank(x, n, cumulative = TRUE)
now sets
observations in the initialization period to NA. This is consistent with
the other running/rolling functions in TTR. If you want the previous
behavior, you should use
runPercentRank(x, n = 1, cumulative = TRUE)
. Thanks to
GitHub user @httassadar for the report.
(#73)
runMAD()
returned incorrect values when
cumulative = TRUE
and the input contained leading NA.
Thanks to GitHub user @stellathecat for the report. This also
affected runMedian()
. (#93)
ZLEMA()
would crash when ratio = 0.0
and n
was not specified. Thanks to GitHub user @yogat3ch for the report!
(#95)
WMA()
did not return an xts object when passed an
xts object for x
that had leading NA, with the default
wts = 1:n
. Thanks to Cory Fletcher for reporting this issue
via email. (#96)
stoch()
was wrong when bounded = FALSE
.
Thanks to GitHub user @rfinfun for the report and patch.
(#74)
HMA()
threw an error when n
was an odd
number. This was because the first call to WMA()
used
n = n / 2
which caused n
to not be an integer.
Thanks to GitHub user @dragie for the report. (#76)
Update DVI()
to use runPercentRank()
.
Thanks to Ivan Popivanov for the patch.
getYahooData()
now returns an xts object with Date
index (not POSIXct).
Column names for moving average function outputs are no longer based on the input column names.
Add HMA()
and ALMA()
functions/docs.
Thanks to Ivan Popivanov.
Add Ultimate Oscillator function/docs/tests. Thanks to Ivan Popivanov.
run*()
functions now error if there are not enough
non-NA values.
Change all instances of lag()
to
lag.xts()
in case x
is a matrix. Thanks to
Ivan Popivanov for the report.
Correct output column names in ATR()
docs.
CLV()
now sets NaN and Inf values to 0, instead of
only NaN values.
Fix OBV()
so OBV[t] = OBV[t-1]
when
Close[t] == Close[t-1]
.
Fix dead links in documentation.
CCI()
now returns an object with column names
(“cci”).
All moving average functions now attempt to set column names.
Added clarification on the displaced nature of
DPO()
.
SAR()
now sets the initial gap based on the standard
deviation of the high-low range instead of hard-coding it at
0.01.
Added rollSFM()
function that calculates alpha,
beta, and R-squared for a single-factor model. Thanks to James Toll for
the prototype.
Added runPercentRank()
function. Thanks to Charlie
Friedemann.
Moved slowest portion of aroon()
to C.
DonchianChannel()
gains an
include.lag = FALSE
argument, which includes the current
period’s data in the calculation. Setting it to TRUE
replicates the original calculation. Thanks to Garrett See and John
Bollinger.
The Stochastic Oscillator and Williams’ %R now return 0.5 (instead of NaN) when a securities’ price doesn’t change over a sufficient period.
All moving average functions gain ...
.
Users can now change alpha in Yang Zhang volatility calculation.
Fixed MACD()
when maType
is a list. Now
mavg.slow = maType[[2]]
and
mavg.fast = maType[[1]]
, as users expected based on the
order of the nFast
and nSlow
arguments. Thanks
to Phani Nukala and Jonathan Roy.
Fixed bug in lags()
. Thanks to Michael
Weylandt.
Corrected error in Yang Zhang volatility calculation. Thanks to several people for identifying this error.
Correction to SAR()
extreme point calculations.
Thanks to Vamsi Galigutta.
adjRatios()
now ensures all inputs are univariate.
Thanks to Garrett See.
EMA()
and EVWMA()
now ensure
n
is less than the number of non-NA values. Thanks to Roger
Bos.
Fix to BBands()
docs. Thanks to Evelyn
Mitchell.
Fixed stockSymbols()
for nasdaq.com changes (again),
and attempted to make stockSymbols()
more robust to
nasdaq.com changes.
Corrected final calculation in Yang-Zhang volatility. Thanks to Shal Patel.
Corrected k
in Yang-Zhang volatility. Thanks to Ian
Rayner.
Corrected s2o
and s2c
in Yang-Zhang
volatility. Thanks to Ian Rayner.
Corrected KST()
when input is xts (result is now *
100). Thanks to Yuanwei.
Added variable moving average function,
VMA()
.
Added Brian Peterson’s price bands function,
PBands()
.
Added David Varadi’s DVI()
indicator.
Added wilder
and ratio
arguments to
DEMA
. Thanks to Matthew Fornari for the
suggestion.
Changed wilderSum()
to seed initial value with raw
sum. This matches Wilder’s original calculations. Thanks to Mahesh Bp
for the report.
The BBands()
standard deviation calculation now uses
the population instead of sample statistic. This is consistent with
Bollinger Band literature. Thanks to Jeff Ryan for the patch.
Fixed stockSymbols()
for nasdaq.com
changes.
Fixed ZLEMA()
default ratio by changing it from
2/(n-1)
to 2/(n+1)
. This makes it consistent
with EMA()
. Thanks to Dirk Eddelbuettel.
Corrected close-to-close volatility. Thanks to James Toll for the report.
adjRatios()
failed (spectacularly) if there were
missing close prices. Thanks to Garrett See for the report.
Added VWAP()
and VWMA()
. Thanks to
Brian Peterson.
Added v-factor generalization to DEMA()
. Thanks to
John Gavin.
Updated volatility()
to handle univariate case of
calc = "close"
. Thanks to Cedrick Johnson.
Moved EMA()
, SAR()
, and
wilderSum ()
from .Fortran to .Call ()
and used
xts:::naCheck()
instead of TTR’s NA check
mechanism.
RSI ()
up/down momentum is now faster with xts.
Thanks to Jeff Ryan.
If ratio
is specified in EMA ()
but
n
is missing, the traditional value of n
is
approximated and returned as the first non-NA value.
Fix to stoch()
when maType
is a list
and n
is not set in the list’s 3rd element. Thanks to Wind
Me.
Fixed fastK
in stoch()
when
smooth != 1
.
Fixed segfault in EMA ()
when
n < NROW(x)
. Thanks to Douglas Hobbs.
test.EMA.wilder()
failed under R-devel. Thanks to
Prof Brian Ripley.
CMO()
, DPO()
,
DonchianChannel()
, RSI()
, and
TDI ()
to explicitly use xts internally.Fixed bug in WMA()
, EVWMA()
,
ZLEMA()
, and GMMA()
; results were not being
reclass()
ed back to their original class.
Set column names after cbind ()
call in the
following functions:
ADX()
aroon()
ATR()
BBands()
DonchianChannel()
EMV()
KST()
MACD()
stoch()
SMI()
TDI()
TRIX()
Fixed bug in VHF()
; missing abs()
calculation in the denominator. Thanks to Jürgen Wurzer for the
report!
getYahooData()
now returns an xts object.
Added column names to output for ADX()
,
EMV()
, and CLV ()
(for xts).
momentum()
in CMO()
no longer sets
na = 100
.
Replaced na
argument in momentum()
and
ROC()
with na.pad
.
Moved maType
argument default values from function
formals to function body for the following functions:
ADX()
ATR()
CCI()
DPO()
EMV()
KST()
MACD()
RSI()
TRIX()
BBands()
chaikinVolatility()
stoch()
SMI()
adjRatios()
creates split and/or dividend adjustment
ratio series via C code.
GMMA()
calculates the Guppy Multiple Moving
Average.
volatility()
now has Yang Zhang, and Garman-Klass
(Yang Zhang) calculations.
The functions below now have cumulative argument. This allows the calculation of “from inception” running series.
runSum()
, runMin()
,
runMax()
runMean()
, runMedian()
runCov()
, runCor()
, runVar()
,
runSD()
, runMAD()
Added internal smoothing to FastK
in
stoch()
via smooth
argument. Thanks to Stanley
Neo.
getYahooData()
now uses adjRatios(),
which yields significant speed improvements for larger data
sets.
All functions now use xts internally, adding support for all
major time series classes. If try.xts()
fails on the input
object(s), they will be converted to a matrix and a matrix object will
be returned.
Added bounded
arg to stoch()
and
SMI()
, which includes the current period in the
calculation.
Added the zig zag indicator: ZigZag()
.
Added volatility estimators/indicators:
volatility()
, with the following calculations:
Added Money Flow Index: MFI()
.
Added Donchian channel: DonchianChannel()
.
Added multiple
argument to TDI()
,
allowing more user control.
Added naCheck()
and implemented it in the moving
average functions.
Fixed bug when maType
was a list and n
was not specified in maType
. This affected:
stoch()
, SMI()
, RSI()
,
KST()
, MACD()
, TRIX()
.
Corrected NaN replacement in CLV()
.
Corrected williamsAD()
: the result is 0 if C(t) =
C(t-1).
Corrected runMedian()
and runMAD()
. The
argument controlling which type of median to calculate for even-numbered
samples wasn’t being passed to the Fortran routine.
aroon()
calculation starts at period
n+1
, instead of n
.
Added NA to first element of closeLag
of
ATR()
.
Corrected BBands()
and CCI()
for
rowMeans()
use on xts objects.
Made changes to Rd files to pass R CMD check on R-devel (2.9.0).
Changed default type
of ROC()
to
continuous
.
Changed BBands()
%B output value from
pct.b
to pctB
.
Changed WPR()
output value from pct.R
to pctR
.
Changed WPR()
MA output value from
ma.emv
to emvMA
.
Changed aroon()
output values from
aroon.xx
to aroonXx
.
Renamed:
chaikinMF()
to CMF()
stochastic()
to stoch()
bollingerBands()
to BBands()
Set na = NA
for momentum()
and
ROC()
functions in files KST.R, RSI.R, and TDI.R, and
changed ROC()
to use type = "discrete"
in
chaikinVolatility.R.
Made the following changes to the ZLEMA()
function:
ratio = NULL
argument.ratio
argument.Changed the BBands()
function’s sd
argument from a list that allows other dispersion functions to simply
indicate the number of standard deviations to use.
Changed maType
arguments and updated documentation
for:
RSIm()
ADX()
ATR()
CCI()
DPO()
EMV()
RSI()
BBands()
chaikinVolatility()
stoch()
SMI()
TRIX()
MACD()
KST()
Added Stochastic Momentum Index SMI()
and
williamsAD()
functions and documentation.
Added Fortran implementations of
SMA()
EMA()
WMA()
EVWMA()
ZLEMA()
PSAR()
Added NA checking/handling for many functions.
Added ratio = NULL
argument to
EMA()
.
Changed all usage of roll*()
to their respective
Fortran implementations and removed the rollFun()
function.
Added Fortran based functions are:
runSum()
wilderSum()
runMin()
runMax()
runMean()
runCov()
runCor()
runVar()
runSD()
runMedian()
runMAD()
Changed CCI()
to use runMAD()
internally.
Removed oscillator()
function and transferred
functionality to MACD()
function.
Removed chaikinOscillator()
, since it can be created
via MACD(chaikinAD(...))
.
match.arg(type)
in ROC()
changed to
simple subsetting of type.
Changed trailing zeros to trailing NAs in
DPO()
.
Fixed WMA()
bug that allowed x
and
wts
vectors to have different length if either series had
leading NAs (similar to EVWMA()
function).
Fixed runCov()
bug that allowed x
and
y
vectors to have different length if either series had
leading NAs (similar to EVWMA()
function).
Corrected EVWMA()
to start at period n
instead of n-1
.
Removed message
function from CCI.R, VHF.R, WPR.R,
aroon.R bollingerBands.R, and stochastics.R.
Changed order of oscillator()
arguments from
ma.slow
, ma.fast
, ma.sig
to the
traditional ma.fast
, ma.slow
,
ma.sig
. Thanks to Jeff Ryan.
The arguments to the chaikinOscillator()
function
were changed as above.
Changed EVWMA()
so period n
contains
the value for periods (i-n+1):n
and so periods
1:(n-2)
will be NA.
Changed EMA()
so periods 1:n
will be
NA.
Changed bbands()
to
bollingerBands()
.
Changed DX()
to ADX()
.
Changed stoch()
to
stochastic()
.