Версия Rcpp, если вам нужна скорость.Это тип сценария, где Rcpp действительно сияет:
Rcpp::cppFunction('NumericMatrix RawHeikinAshi(NumericMatrix x, CharacterVector n) {
// assumes OHLC matrix input
int nrow = x.nrow(), ncol = 4, Op=0, Hi=1, Lo=2, Cl=3;
NumericMatrix ha(nrow,ncol);
for (int i = 0; i < nrow; i++) {
ha(i, Cl) = (x(i,Op) + x(i,Hi) + x(i,Lo) + x(i,Cl)) / 4.0;
ha(i, Op) = (i > 0) ? ((ha(i - 1, Op) + ha(i - 1, Cl)) / 2.0) : x(i, Op);
ha(i, Hi) = std::max(x(i, Hi), std::max(ha(i, Op), ha(i, Cl)));
ha(i, Lo) = std::min(x(i, Lo), std::min(ha(i, Op), ha(i, Cl)));
}
colnames(ha) = n;
return ha;
}')
HAOHLC <- function(x) {
x <- OHLC(try.xts(x))
r <- RawHeikinAshi(x, paste0("ha.", colnames(x)))
return(reclass(r, x))
}
Тесты.
> p <- getSymbols("SPY")
> microbenchmark(HAOHLC(p), heikin_ashi(p), times = 100L, unit = "ms")
Unit: milliseconds
expr min lq mean median uq max neval
HAOHLC(p) 0.36409 0.4275205 0.5198086 0.502614 0.552392 1.378134 100
heikin_ashi(p) 563.33925 582.6144955 609.0082902 591.338550 620.179235 802.885348 100