将段添加到quantmod中的图形的常规函数

时间:2013-08-06 06:23:10

标签: r quantmod

我正在尝试以add_TA的格式编写一个简单函数,将一般段添加到绘图中。 该函数将接收N×4矩阵。矩阵中的每一行都是一段。

我尝试修改add_SMA以满足我的需求,但没有运气。

add_Segments <- function (segs , ...) 
{
    lenv <- new.env()
    lenv$add_segments <- function(segs , ...) {
        segments(segs[,1] , segs[,2] , segs[,3] , segs[,4] , ...)
    }
    mapply(function(name, value) {
        assign(name, value, envir = lenv)
    }, names(list(segs = segs , ...)), list(segs = segs, ...))  
    plot_object <- current.chob()
    lenv$xdata <- segs
    plot_object$set_frame(2)
    exp <- parse(text = "add_segments(segs = segs , ...)")
    plot_object$add(exp, env = c(lenv, plot_object$Env), expr = TRUE)
    plot_object
}

失败
Error in plot.window(c(1, 1658), c(NaN, NaN)) : need finite 'ylim' values

当我在xdata中设置lenv但我想我没有这样做时,我确实想到了这一点。

这是一个可重现的示例,用于说明结果并segments正常工作。

require(quantmod)
s <- get(getSymbols('MSFT'))["2012"]
chart_Series(s)
segs <- matrix(c(183,31.61,213,30.20,221,26.34,233,26.26) , byrow = T , nrow = 2)
segments(segs[,1] , segs[,2] , segs[,3] , segs[,4] , col = 'red')

我使用add_TA格式(而不仅仅是上面示例中的绘图)的原因是我想添加其他指标,我希望在绘图对象刷新后这些段保留在图形上。

1 个答案:

答案 0 :(得分:1)

您可以使用add_Series函数执行此操作,但您必须进行一些操作才能以正确的格式获取数据。下面的函数为你做了那些操作。

interp <- function(Data, Points) {
  # merge points with original data to create NA
  m <- merge(Data[Points], index(Data))
  # linear approximation at equidistant spacing,
  # rather than at index values (the default)
  na.approx(m, seq(nrow(Data)))
}

chart_Series(s)
add_Series(interp(Hi(s), c(183,213)), type="line", on=1)
add_Series(interp(Lo(s), c(221,233)), type="line", on=1)