addOBV抛出错误

时间:2013-01-20 13:15:17

标签: r quantmod

我试图用价格和一些技术指标(如ADX,RSI和OBV)绘制图表。我无法弄清楚为什么addOBV发出错误以及为什么addADX根本没有在图表的图表行中显示?

这是我的代码:

tmp <- read.csv(paste("ProcessedQuotes/",Nifty[x,],".csv", sep=""),
  as.is=TRUE, header=TRUE, row.names=NULL)
tmp$Date<-as.Date(tmp$Date)
ydat = xts(tmp[,-1],tmp$Date) 
lineChart(ydat, TA=NULL, name=paste(Nifty[x,]," Technical Graph"))
plot(addSMA(10))
plot(addEMA(10))
plot(addRSI())
plot(addADX())
plot(addOBV())

addOBV的错误是:

Error in try.xts(c(2038282, 1181844, -1114409, 1387404, 3522045, 4951254,  : 
  Error in as.xts.double(x, ..., .RECLASS = TRUE) :   
        order.by must be either 'names()' or otherwise specified

下面您可以看到DIn未在图表中完整显示。

enter image description here

> class(ydat)
[1] "xts" "zoo"
> head(ydat)
  Open  High    Low  Close  Volume Trades Sma20 Sma50 DIp DIn DX ADX aroonUp aroonDn oscillator  macd signal RSI14

2 个答案:

答案 0 :(得分:3)

我不知道为什么那个补丁不适合你,但你可以创建一个新函数(或者你可以掩盖quantmod中的那个)。让我们创建一个名为addOBV2的新修补版本,这是addOBV的代码,除了一条修补的行。 (x <- as.matrix(lchob@xdata)替换为x <- try.xts(lchob@xdata, error=FALSE))。

addOBV2 <- function (..., on = NA, legend = "auto") 
{
  stopifnot("package:TTR" %in% search() || require("TTR", quietly = TRUE))
  lchob <- quantmod:::get.current.chob()
  x <- try.xts(lchob@xdata, error=FALSE)
  #x <- as.matrix(lchob@xdata)
  x <- OBV(price = Cl(x), volume = Vo(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("^.*[(]", " On Balance Volume (", deparse(match.call()))#, 
  #extended = TRUE)
  gpars <- c(list(...), list(col=4))[unique(names(c(list(col=4), 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 <- quantmod:::chartSeries.chob
    do.call("chartSeries.chob", list(lchob))
    invisible(chobTA)
  }
  else {
    return(chobTA)
  }
}

现在可行。

# reproduce your data
ydat <- getSymbols("ZEEL.NS", src="yahoo", from="2012-09-11", 
                   to="2013-01-18", auto.assign=FALSE)

lineChart(ydat, TA=NULL, name=paste("ZEEL Technical Graph"))
plot(addSMA(10))
plot(addEMA(10))
plot(addRSI())
plot(addADX())
plot(addOBV2())

enter image description here

答案 1 :(得分:3)

此代码重现错误:

library(quantmod)
getSymbols("AAPL")
lineChart(AAPL, 'last 6 months')
addOBV()

会话信息:

sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] quantmod_0.3-17 TTR_0.21-1      xts_0.9-1       zoo_1.7-9       Defaults_1.1-1  rgeos_0.2-11   
[7] sp_1.0-5        sos_1.3-5       brew_1.0-6     

loaded via a namespace (and not attached):
[1] grid_2.15.0    lattice_0.20-6 tools_2.15.0  

在Google上搜索,错误似乎与addOBV将数据转换为矩阵这一事实有关,这会导致TTR::OBV出现问题。补丁已经posted on RForge