如何使用 quantmod 在新绘图中叠加多个 TA?

How to overlay multiple TA in new plot using quantmod?

我们可以使用图表系列函数绘制蜡烛图 chartSeries(Cl(PSEC)) 我创建了一些自定义值 (I1,I2I3) 我想在烛台图案之外一起绘制(叠加)。为此,我使用了 addTA()

chartSeries(Cl(PSEC)), TA="addTA(I1,col=2);addTA(I2,col=3);addTA(I3,col=4)")

问题是它分别为 Cl(PSEC)、I1、I2I3 绘制了四个图,而不是两个图我想要 Cl(PSEC)(I1,I2,I3)

已编辑

为清楚起见,我给出了一个示例代码,其中包含为此目的创建的 I1、I2 和 I3 变量

library(quantmod)
PSEC=getSymbols("PSEC",auto.assign=F)
price=Cl(PSEC)
I1=SMA(price,3)
I2=SMA(price,10)
I3=SMA(price,15)
chartSeries(price, TA="addTA(I1,col=2);addTA(I2,col=3);addTA(I3,col=4)")

这里有一个选项,它主要保留了您的原始代码。 您可以在第一个之后使用选项 on=2 为每个 TA 获得所需的结果:

library(quantmod)
getSymbols("PSEC")
price <- Cl(PSEC)
I1 <- SMA(price,3)
I2 <- SMA(price,10)
I3 <- SMA(price,15)
chartSeries(price, TA=list("addTA(I1, col=2)", "addTA(I2, col=4, on=2)",
                           "addTA(I3, col=5, on=2)"), subset = "last 6 months")

如果您想在一张图表中叠加价格和 SMA,您可以为每个 TA 使用选项 on=1

感谢@hvollmeier,他的回答让我意识到我在之前版本的回答中误解了你的问题。

PS:请注意?addSMA()中描述了几个选项,包括with.col可用于select时间序列的特定列(Cl是默认列)。

如果我对你的理解正确,你希望 3 个 SMA 在子图中而不是在你的主图表中 window.You 可以使用 newTA 执行以下操作。 使用您的数据:

PSEC=getSymbols("PSEC",auto.assign=F)
price=Cl(PSEC)

现在在主要 window 下方的 window 中绘制 10、30、50 天 SMA:

chartSeries(price['2016'])
newSMA <- newTA(SMA, Cl, on=NA)
newSMA(10)
newSMA(30,on=2)
newSMA(50,on=2)

关键是参数on。在定义新的 TA 函数时使用 on = NA,因为 on 的默认值为 1,这是主要的 window。 on = NA 新情节 window。然后将剩余的 SMA 绘制到与第一个 SMA 相同的 window。根据自己的喜好设置颜色 etc.to :-)。

您可能需要考虑使用 quantmod 包中较新的 quantmod 图表绘图来解决此任务(chart_Series 而不是 chartSeries)。

优点: -情节看起来更干净更好(?) - 通过将 parsthemes 选项编辑为 chart_Series 来获得更大的灵活性(请参阅此处关于 SO 的其他示例,了解使用 pars 和 [=15 可以做的事情的基础知识=]) 缺点: -没有很好的记录。

PSEC=getSymbols("PSEC",auto.assign=F)
price=Cl(PSEC)
chart_Series(price, subset = '2016')
add_TA(SMA(price, 10))
add_TA(SMA(price, 30), on = 2, col = "green")
add_TA(SMA(price, 50), on = 2, col = "red")


# Make plot all at once (this approach is useful in shiny applications):
print(chart_Series(price, subset = '2016', TA = 'add_TA(SMA(price, 10), yaxis = list(0, 10));
add_TA(SMA(price, 30), on = 2, col = "purple"); add_TA(SMA(price, 50), on = 2, col = "red")'))