R 如何在quantmod包中创建技术指标

R 如何在quantmod包中创建技术指标,r,quantmod,R,Quantmod,我是R的新手,我在创建技术指标方面面临一些问题。更具体地说,我想创建一个指示器,Fibonacci,它将被添加到chartSeries中,由5条水平线组成。我处理的数据是股票的收盘价。因此,我要创建的图形将在最大收盘价处有一条水平线,在最小收盘价处有一条水平线,在前两条之间有三条水平线。我为获取股票收盘价时间序列的五个值而编写的代码如下: Fibonacci <- function(x) { x <- try.xts(x, error = as.matrix) n <- nro

我是R的新手,我在创建技术指标方面面临一些问题。更具体地说,我想创建一个指示器,
Fibonacci
,它将被添加到
chartSeries
中,由5条水平线组成。我处理的数据是股票的收盘价。因此,我要创建的图形将在最大收盘价处有一条水平线,在最小收盘价处有一条水平线,在前两条之间有三条水平线。我为获取股票收盘价时间序列的五个值而编写的代码如下:

Fibonacci <- function(x) {
x <- try.xts(x, error = as.matrix)
n <- nrow(x)
min <- runMin(x,n=n)
max <- runMax(x,n=n)
high <- 0.62*(max-min) + min
middle <- 0.5*(max-min) + min
low <- 0.38*(max-min) + min
res <-cbind(na.spline(min),na.spline(max),na.spline(high),
            na.spline(middle),na.spline(low))
colnames(res)<- c("min","max","high","middle","low") 
reclass (res, x)
}
问题是该指示器未添加到图表中,我还收到以下错误消息:

Error in do.call(x@passed.args$TA[[j]]@name, list(x@passed.args$TA[[j]])) :
  'what' must be a character string or a function

你知道我做错了什么吗?

与其从头开始编写
add*
函数,不如使用
newTA

> library(quantmod)
> getSymbols("AAPL")
[1] "AAPL"
> addFibonacci <- newTA(Fibonacci,on=1)
> chartSeries(AAPL, TA="addFibonacci()")
Error in addFibonacci() : could not find function "get.current.chob"
您可以看到我在哪里将对
get.current.chob()
的调用替换为
quantmod:::get.current.chob()
。现在应该可以了

chartSeries(AAPL, TA="addFibonacci()")
成功


非常感谢您的回答和帮助。我不知道我可以使用newTA函数。我只是想知道为什么我不能简单地调用addFibonacci()并获得我想要的绘图,就像所有addTA函数一样,而必须调用chartSeries函数?例如,当我调用addFibonacci时,我在addFibonacci()中取:Error:object'chartSeries.chob'未找到
addFibonacci <- function (..., on = 1, legend = "auto") 
{
    #lchob <- get.current.chob()
    lchob <- quantmod:::get.current.chob()
    x <- as.matrix(lchob@xdata)
    x <- Fibonacci(x = x)
    yrange <- NULL
    chobTA <- new("chobTA")
    if (NCOL(x) == 1) {
        chobTA@TA.values <- x[lchob@xsubset]
    }
    else chobTA@TA.values <- x[lchob@xsubset, ]
    chobTA@name <- "chartTA"
    if (any(is.na(on))) {
        chobTA@new <- TRUE
    }
    else {
        chobTA@new <- FALSE
        chobTA@on <- on
    }
    chobTA@call <- match.call()
    legend.name <- gsub("^add", "", deparse(match.call()))
    gpars <- c(list(...), list())[unique(names(c(list(), list(...))))]
    chobTA@params <- list(xrange = lchob@xrange, yrange = yrange, 
        colors = lchob@colors, color.vol = lchob@color.vol, multi.col = lchob@multi.col, 
        spacing = lchob@spacing, width = lchob@width, bp = lchob@bp, 
        x.labels = lchob@x.labels, time.scale = lchob@time.scale, 
        isLogical = is.logical(x), legend = legend, legend.name = legend.name, 
        pars = list(gpars))
    if (is.null(sys.call(-1))) {
        TA <- lchob@passed.args$TA
        lchob@passed.args$TA <- c(TA, chobTA)
        lchob@windows <- lchob@windows + ifelse(chobTA@new, 1, 
            0)
        chartSeries.chob <- chartSeries.chob
        do.call("chartSeries.chob", list(lchob))
        invisible(chobTA)
    }
    else {
        return(chobTA)
    }
}
chartSeries(AAPL, TA="addFibonacci()")