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

2024-01-09

我是 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)
}

我还编写了以下代码,以便将技术指标添加到现有的chartSeries情节quantmod包裹 :

addFibonacci<- function(col = "red",overlay = TRUE){
stopifnot("package:TTR" %in% search() || require("TTR", quietly = TRUE))
lchob <- quantmod:::get.current.chob() 
x <- as.matrix(lchob@xdata)
chobTA <- new("chobTA")
chobTA@new <- !overlay
if (!is.OHLC(x)) 
    stop("Fibonacci requires HL series")
else {
fibon <- Fibonacci(Cl(x))
}
[email protected] /cdn-cgi/l/email-protection <- fibon[lchob@xsubset]
chobTA@call <- match.call()
chobTA@on <- 1
chobTA@params <- list(xrange = lchob@xrange, colors = lchob@colors, 
    color.vol = [email protected] /cdn-cgi/l/email-protection, multi.col = [email protected] /cdn-cgi/l/email-protection, 
    spacing = lchob@spacing, width = lchob@width, bp = lchob@bp, 
    x.labels = [email protected] /cdn-cgi/l/email-protection, time.scale = [email protected] /cdn-cgi/l/email-protection, 
    col = col)
if (is.null(sys.call(-1))) {
    TA <- [email protected] /cdn-cgi/l/email-protection$TA
    [email protected] /cdn-cgi/l/email-protection$TA <- c(TA, chobTA)
    lchob@windows <- lchob@windows + ifelse(chobTA@new, 1, 
        0)
    chartSeries.chob <- quantmod:::chartSeries.chob
    do.call(chartSeries.chob, list(lchob))
    invisible(chobTA)
}
else {
    return(chobTA)
}
}

问题是该指标没有添加到图表中,并且我还收到以下错误消息:

Error in do.call([email protected] /cdn-cgi/l/email-protection$TA[[j]]@name, list([email protected] /cdn-cgi/l/email-protection$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没有导出...没关系,我们可以自己更改函数。打电话后addFibonacci <- newTA(Fibonacci,on=1), addFibonacci定义为:

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) {
        [email protected] /cdn-cgi/l/email-protection <- x[lchob@xsubset]
    }
    else [email protected] /cdn-cgi/l/email-protection <- 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 = [email protected] /cdn-cgi/l/email-protection, multi.col = [email protected] /cdn-cgi/l/email-protection, 
        spacing = lchob@spacing, width = lchob@width, bp = lchob@bp, 
        x.labels = [email protected] /cdn-cgi/l/email-protection, time.scale = [email protected] /cdn-cgi/l/email-protection, 
        isLogical = is.logical(x), legend = legend, legend.name = legend.name, 
        pars = list(gpars))
    if (is.null(sys.call(-1))) {
        TA <- [email protected] /cdn-cgi/l/email-protection$TA
        [email protected] /cdn-cgi/l/email-protection$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)
    }
}

你可以看到我在哪里替换了调用get.current.chob() with quantmod:::get.current.chob()。现在应该可以了。

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

Success!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 quantmod 包中创建技术指标 的相关文章

随机推荐