1

我正在尝试以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

我虽然在我开始的时候会注意这一点xdatalenv但我想我没有。

这是一个可重现的示例,说明了结果并且可以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格式(而不仅仅是像上面的示例中那样绘制)的原因是我想添加其他指标,并且我希望在绘图对象刷新后这些段保留在图表上。

4

1 回答 1

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)
于 2013-08-06T15:19:59.077 回答