2011-08-28 17 views
9

Me gustaría producir un diagrama como este https://stat.ethz.ch/pipermail/r-sig-finance/attachments/20110826/19da3834/attachment.png usando quantmod.¿Cómo dibujar una línea en la gráfica chartSeries usando quantmod?

Estoy un poco frustrado con, supongo, una tarea muy simple. Me gustaría poder trazar una línea en el gráfico usando quantmod. Después de varios días de intentarlo, no estoy llegando a ninguna parte. No puedo ver un ejemplo de cómo hacerlo con la función quantmod :: addLines (esta es la única pregunta similar que encontré pero no pude encontrar una respuesta en ella http://r.789695.n4.nabble.com/quantmod-plot-trendline-td894632.html)

Mi problema es este: me gustaría trazar una línea horizontal a la fecha/hora/valor nad y especificados. Esta línea solo puede tener n (por ejemplo 5) barras de inicio largo en alguna barra específica (adicionalmente, también me gustaría agregar el texto justo encima de la línea del valor y especificado).

He intentado varias cosas:

getSymbols("SPY") 

lines.SPY <- (Hi(SPY) + Lo(SPY))/2 
names(lines.SPY) <- c("lines") 
lines.SPY$BuySell <- ifelse(lag(lines.SPY$lines) > lines.SPY$lines, 1, -1) 

chartSeries(SPY, subset="2011-08::", theme=chartTheme('white', 
up.col='blue', dn.col='red')) 
addTA(lines.SPY$lines[lines.SPY$BuySell == -1,], type='p', col='darkred', pch="_", on=1, cex = 2.5) 
addTA(lines.SPY$lines[lines.SPY$BuySell == 1,], type='p', col='green4', pch="_", on=1, cex = 2.5) 

Pero esto en realidad no son líneas ... Y no sé flujo para agregar texto ...

Luego he intentado esto

getSymbols("SPY") 

subset = "2011-03::" 

dev.new() 
chartSeries(SPY, subset=subset, theme="white") 
test <- xts(rep(coredata(last(Cl(SPY))), 20), order.by=index(last(SPY, n=20))) 
addTA(test, on=1, col="red", legend=NULL, lwd=3) 

Nuevamente, no es posible agregar texto. El otro problema con este enfoque es que no puedo deshacerme de la leyenda en la parte superior. Ya que quiero dibujar decenas o cientos de esas líneas en una leyenda de la gráfica no debe ser visualizado ...

Gracias de antemano por sus ideas de ejemplos de código// ...

Saludos, Samo.

+0

Recibí una buena respuesta/solución https://mailman.stat.ethz.ch/pipermail/r-sig-finance/2011q3/008425.html. Gracias. – Samo

Respuesta

3

(Estoy copiando la respuesta de R-sig-finance, por Stergios Marinopoulos) Utilice la nueva función chart_Series(), junto con el texto y los segmentos.

require(quantmod) 
getSymbols("SPY") 
chart_Series(SPY, subset="2011-08::", type = "candlesticks") 
text(9, 112.00, "SOME TEXT", adj=0); 
segments(9, 111.5, 12, 111.5) ; 

Algunos comentarios adicionales de mi parte. Para agregar un mensaje: text(x,y,"message") donde x es el número de la barra (1 para la barra más a la izquierda, puede usar 0 o negativo para dibujar desde el lado izquierdo), e y es el valor en la tabla. Para adj, 0 significa left-align, 1 significa right-align, 0.5 significa center it. Fuera del rango de 0..1 se desplaza en consecuencia (pero tal vez no es prudente confiar en eso).

segmentos (x1, y1, x2, y2) dibuja una línea desde (x1, y1) a (x2, y2), donde nuevamente x es un índice de barra e y es un precio.

El siguiente dibuja un triángulo isósceles, en 20% de rojo opaco: polígono (c (20,30,40), c (5290,5320,5290), COL = "# ff000033")

es decir todas las funciones de gráficos R están disponibles; pero debes usar chart_Series().

+0

Darren, thnx. Tengo un problema con este enfoque cuando incrusto el código dentro de una función require (quantmod) getSymbols ("SPY") drawSomething <-function() { \t chart_Series (SPY, subconjunto = "2011-08 :: ", type =" candeleros ") \t texto (9, 112.00," SOME TEXT ", adj = 0); \t segmentos (9, 111.5, 12, 111.5); } drawSomething() Si lo hago, obtengo un error en text.default (9, 112, "SOME TEXT", adj = 0): plot.new no se ha llamado todavía. Entiendo que el uso de la trama (chart_series (...)) resuelve el problema, pero tengo cientos de líneas, textos y add_TA, por lo que demora años en volver a dibujar ... ¿Cómo manejar esto? – Samo

+0

@Samo El mensaje de error es una distracción, ya que el problema es la línea anterior. Cuando utiliza una función que crea un gráfico en una función, debe imprimirlo. Es decir. cambie su primera línea a 'print (chart_Series (SPY, subconjunto =" 2011-08 :: ", type =" candelabros "))' –

+0

¿Quizás tenga una solución para este http://stackoverflow.com/questions/8639928/issue-with-quantmod-add-ta-and-chart-series-lines-and-text-disappear-after-nex pregunta que publiqué? – Samo

Cuestiones relacionadas