chartSeries与XTS,不能同时绘制点和技术指标

时间:2014-07-09 21:53:17

标签: r charts xts quantmod

编辑:我操作了一个较小的示例,以便您可以根据需要重现它。

我有一个OHLC XTS表我使用(欧元/ $)

> theBars
                     Open  High   Low Close
2014-06-17 01:42:26 13835 13836 13835 13836
2014-06-17 01:42:59 13836 13838 13835 13837
2014-06-17 01:43:21 13837 13838 13837 13837
2014-06-17 01:43:51 13837 13837 13837 13837
2014-06-17 01:44:23 13837 13837 13837 13837
2014-06-17 01:44:51 13837 13838 13837 13838
2014-06-17 01:45:28 13837 13840 13837 13840
2014-06-17 01:45:59 13840 13842 13840 13842
2014-06-17 01:46:22 13842 13843 13842 13843
2014-06-17 01:46:58 13843 13844 13843 13844
2014-06-17 01:47:29 13843 13844 13843 13843
2014-06-17 01:47:58 13843 13843 13841 13843
2014-06-17 01:48:22 13843 13843 13842 13843
2014-06-17 01:48:59 13843 13843 13842 13842
2014-06-17 01:49:05 13842 13842 13841 13841
2014-06-17 01:49:54 13841 13841 13840 13841
2014-06-17 01:50:18 13841 13841 13841 13841
2014-06-17 01:50:44 13840 13840 13839 13840
2014-06-17 01:52:55 13839 13839 13838 13839
2014-06-17 01:53:42 13838 13839 13838 13838
2014-06-17 01:54:22 13837 13838 13837 13838
2014-06-17 01:54:58 13837 13838 13836 13837
2014-06-17 01:55:29 13836 13836 13834 13835
2014-06-17 01:55:59 13835 13837 13835 13837
2014-06-17 01:56:28 13837 13839 13837 13838
2014-06-17 01:56:59 13838 13838 13837 13837
2014-06-17 01:57:29 13837 13838 13837 13838
2014-06-17 01:57:59 13838 13838 13838 13838
2014-06-17 01:58:29 13838 13838 13836 13837
2014-06-17 01:58:58 13837 13837 13836 13836
2014-06-17 01:59:29 13836 13841 13836 13840
2014-06-17 01:59:59 13840 13840 13835 13837
2014-06-17 02:00:29 13837 13837 13836 13836
2014-06-17 02:00:58 13836 13836 13835 13836
2014-06-17 02:01:29 13835 13837 13835 13837
2014-06-17 02:01:58 13837 13837 13836 13836

我用

绘制点上的点
points.default(x=timeIndex*tMult+1, #aligns with tMult = 3 when candles are candles, 1 when they are matchsticks
                     y=as.numeric(dataCol[i]), #the price, its around 13818
                     cex=dotSize,
                     pch=dotType,
                     col=thecolor)

哪个有效。 在此示例中,以下是值

      x       y     cex     pch     col 
   "19" "13841"     "2"     "2" "green"
        x         y       cex       pch       col 
     "19"   "13841"       "3"       "2" "#7070FF" 
        x         y       cex       pch       col 
     "19"   "13841"       "4"       "2" "#7070FF"

(每个点的中心是相同的,因为它是同时以一个价格进行的多次交易) 我还用

绘制了一些技术指标
plot(addMACD(fast,slow,signal,maType,histogram))

 plot(addSMA(n,overlay = overlay))

等。它也可以使用默认值按预期工作。

如果我使用技术将技术覆盖在图形上,如bbands和SMA,则可以同时绘制点。但是,如果我有一个像MACD这样的情节,它在一个单独的框中,将图形分成同一个绘图窗口中的两个图形,我就无法绘制这些点。为什么呢?!

1 个答案:

答案 0 :(得分:0)

根据添加的指标重新编制y轴。 我发现自己重新编制索引更好,然后通过调整点的位置来绘制图形。我将在这里包含我通过搜索找到的所有常量。

假设您的数据位于名为“theBars”的变量中的OHLC中,请执行此操作par(usr=c(0,1,min(theBars),max(theBars)),xpd=TRUE)

我在一台1920x1200分辨率的显示器上完成了所有这些操作,因此所有像素测量都是这样的。这与使用par("fin")的任何分辨率兼容 而且,这在几分之一秒内执行。这是为了清晰而写,而不是速度。

[0,1]与不同数量蜡烛的水平对齐:

if(numBars < 10) stop("cannot plot less than 10 candles")
    horizNumerator <- if(numBars == 10) 1547 else
                      if(numBars == 11) 1559 else
                      if(numBars == 12) 1568 else
                      if(numBars == 13) 1574 else
                      if(numBars == 14) 1581 else
                      if(numBars == 15) 1588 else
                      if(numBars == 16) 1592 else
                      if(numBars == 17) 1597 else
                      if(numBars == 18) 1601 else
                      if(numBars == 19) 1603 else
                      if(numBars == 20) 1606 else
                      if(numBars <= 30) 1626 + (numBars-30)/(10/20) else
                      if(numBars <= 40) 1636 + (numBars-40)/(10/10) else
                      if(numBars <= 50) 1641 + (numBars-50)/(10/7) else
                      if(numBars <= 60) 1646 + (numBars-60)/(10/5) else
                      if(numBars <= 100) 1651 + (numBars-100)/(40/5) else
                      if(numBars <= 140) 1655 + (numBars-140)/(40/4) else
                      if(numBars <= 312) 1658 + (numBars-312)/(172/3) else
                      if(numBars > 312) 1662



   horizUnit <- (horizNumerator/1802)/(length(theBars[,1])-1)*ifelse(plotNum<2,1,1693/1655)*par("fin")[1]/20
    startHoriz <- ifelse(plotNum<2,55/1802,35/1802)*par("fin")[1]/20

垂直对齐,plotNum是已经绘制的指标数量deltaP <- max(theBars)-min(theBars)

这涉及压缩情节区域的指标

pixelStretch <- (switch(as.character(plotNum),"0"=975,"1"=665,"2"=551,"3"=465, "4"=400,"5"=352,"6"= 313))/(983) 
deltaP <- max(theBars)-min(theBars)

这可以解决指标绘制后的最大移动量

maxRaise <- if(plotNum == 0) 0 else
                if(plotNum == 1) 15 else
                if(plotNum == 2) 31 else
                if(plotNum >  2) 36
    maxRaise <- maxRaise*par("fin")[2]/12.0625/983

然后在这样的数据列dataCol中绘制点

  points.default(x=startHoriz + horizUnit*timeIndex,
                 y= maxRaise * deltaP + max(theBars)-((max(theBars)-as.numeric(dataCol[i]))*(pixelStretch)),
                 cex=dotSize,
                 pch=dotType,
                 col=thecolor)