Функция
Вы получаете простой код функции, когда просто пишете функцию BBands
(без скобок):
function (HLC, n = 20, maType, sd = 2, ...)
{
HLC <- try.xts(HLC, error = as.matrix)
if (NCOL(HLC) == 3) {
if (is.xts(HLC)) {
xa <- xcoredata(HLC)
HLC <- xts(apply(HLC, 1, mean), index(HLC))
xcoredata(HLC) <- xa
}
else {
HLC <- apply(HLC, 1, mean)
}
}
else if (NCOL(HLC) != 1) {
stop("Price series must be either High-Low-Close, or Close/univariate.")
}
maArgs <- list(n = n, ...)
if (missing(maType)) {
maType <- "SMA"
}
mavg <- do.call(maType, c(list(HLC), maArgs))
sdev <- runSD(HLC, n, sample = FALSE)
up <- mavg + sd * sdev
dn <- mavg - sd * sdev
pctB <- (HLC - dn)/(up - dn)
res <- cbind(dn, mavg, up, pctB)
colnames(res) <- c("dn", "mavg", "up", "pctB")
reclass(res, HLC)
}
Давайтеизмените функцию
есть переменная sdev
с функцией runSD()
, я изменил ее на функцию sdev <- as.vector (rollapplyr (HLC, n, sd)) `,таким образом, мы получаем векторный вывод.Давайте назовем эту новую функцию BBands_2: </p>
BBands_2 <- function (HLC, n = 20, maType, sd = 2, ...)
{
HLC <- try.xts(HLC, error = as.matrix)
if (NCOL(HLC) == 3) {
if (is.xts(HLC)) {
xa <- xcoredata(HLC)
HLC <- xts(apply(HLC, 1, mean), index(HLC))
xcoredata(HLC) <- xa
}
else {
HLC <- apply(HLC, 1, mean)
}
}
else if (NCOL(HLC) != 1) {
stop("Price series must be either High-Low-Close, or Close/univariate.")
}
maArgs <- list(n = n, ...)
if (missing(maType)) {
maType <- "SMA"
}
mavg <- do.call(maType, c(list(HLC), maArgs))
sdev <- as.vector(rollapplyr(HLC, n, sd))
up <- mavg + sd * sdev
dn <- mavg - sd * sdev
pctB <- (HLC - dn)/(up - dn)
res <- cbind(dn, mavg, up, pctB)
colnames(res) <- c("dn", "mavg", "up", "pctB")
reclass(res, HLC)
}
Теперь вы можете просто скопировать эту функцию в свой код.Вам также нужно активировать library(xts)
и, конечно, library(TTR)
Результат
Результат с BBands_2:
df <- 1:20
BBands_2(df)[20,]
dn mavg up pctB
-1.3321596 10.5000000 22.3321596 0.9014483