2011-08-28 25 views
9

Mi piacerebbe produrre una trama come questa https://stat.ethz.ch/pipermail/r-sig-finance/attachments/20110826/19da3834/attachment.png usando quantmod.Come disegnare una linea sul grafico chartSeries usando quantmod?

Sono un po 'frustrato, suppongo, un compito molto semplice. Mi piacerebbe essere in grado di tracciare una linea sul grafico usando quantmod. Dopo diversi giorni di tentativi, non sto andando da nessuna parte. Non riesco a vedere un esempio su come farlo con la funzione quantmod :: addLines (questa è l'unica domanda simile che ho trovato ma non ho trovato una risposta http://r.789695.n4.nabble.com/quantmod-plot-trendline-td894632.html)

Il mio problema è questo: vorrei tracciare una linea orizzontale al valore di data/ora/barra specificato. Questa riga è consentita solo per essere n (ad esempio 5) barre che iniziano a partire da una determinata barra (inoltre vorrei anche aggiungere il testo appena sopra la linea del valore y specificato).

Ho provato diverse cose:

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) 

Ma questo non sono in realtà le linee ... E non so ow per aggiungere del testo ...

Poi ho provato questo

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) 

Ancora, non è possibile aggiungere testo. L'altro problema con questo approccio è che non riesco a sbarazzarmi della leggenda in alto. Dal momento che voglio disegnare decine o centinaia di quelle linee su uno legenda del grafico non dovrebbe essere visualizzato ...

Grazie in anticipo per le vostre idee/esempi di codice/...

Con i migliori saluti, Samo.

+0

Ho ricevuto una buona risposta/soluzione https://mailman.stat.ethz.ch/pipermail/r-sig-finance/2011q3/008425.html. Grazie. – Samo

risposta

3

(Sto solo copiando la risposta di R-sig-finance, di Stergios Marinopoulos) Utilizza la nuova funzione chart_Series(), insieme a testo e segmenti.

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) ; 

Alcuni commenti aggiuntivi da parte mia. Per aggiungere un messaggio: text(x,y,"message") dove x è il numero della barra (1 per la barra più a sinistra, è possibile utilizzare 0 o negativo per disegnare a sinistra), e y è il valore nel grafico. Per adj, 0 significa left-align, 1 significa right-align, 0.5 significa center it. Al di fuori dell'intervallo 0..1 lo sposta di conseguenza (ma forse non saggio affidarsi a questo).

segmenti (x1, y1, x2, y2) disegna una linea da (x1, y1) a (x2, y2), dove di nuovo x è un indice di barra e y è un prezzo.

Il seguente disegna un triangolo isoscele, nel 20% rosso opaco: poligono (c (20,30,40), c (5290,5320,5290), col = "# ff000033")

Vale a dire tutte le funzioni grafiche R sono disponibili; ma devi usare chart_Series().

+0

Darren, thnx. Ho un problema con questo approccio quando l'ho incorporare il codice all'interno di una funzione necessaria (quantmod) getSymbols ("spia") Draw Something <-funzione() { \t chart_Series (SPY, sottoinsieme = "2011-08 :: ", type =" candlesticks ") \t text (9, 112.00," ALCO TESTO ", adj = 0); segmenti \t (9, 111,5, 12, 111.5); drawSomething() In questo caso ottengo l'errore in text.default (9, 112, "SOME TEXT", adj = 0): plot.new non è stato ancora chiamato. Comprendo che l'uso della trama (chart_series (...)) risolve il problema, ma ho centinaia di linee, testi e add_TA quindi ci vogliono secoli per rimpiazzare ... Come gestirlo? – Samo

+0

@Samo Il messaggio di errore è una distrazione, poiché il problema è la riga precedente. Quando si utilizza una funzione che crea una trama in una funzione, è necessario stamparla. Cioè cambia la tua prima riga in 'stampa (chart_Series (SPY, sottoinsieme =" 2011-08 :: ", type =" candlesticks "))' –

+0

Forse hai una soluzione per questo http://stackoverflow.com/questions/8639928/problema-con-quantmod-add-ta-e-chart-series-lines-and-text-scompare-dopo-nex domanda che ho postato? – Samo

Problemi correlati