Как нарисовать линию на графике chartSeries с помощью QuantMod? - PullRequest
9 голосов
/ 28 августа 2011

Я бы хотел создать такой график https://stat.ethz.ch/pipermail/r-sig-finance/attachments/20110826/19da3834/attachment.png, используя QuantMod.

Я немного расстроен, наверное, очень простой задачей. Я хотел бы иметь возможность нарисовать линию на графике с помощью QuantMod. После нескольких дней попыток я ничего не получаю. Я не вижу пример того, как это сделать с помощью функции quantmod :: addLines (это единственный подобный вопрос, который я нашел, но не смог найти на него ответ http://r.789695.n4.nabble.com/quantmod-plot-trendline-td894632.html)

Моя проблема заключается в следующем: я хотел бы построить горизонтальную линию с указанным значением даты / времени / бара и значения y. Эта строка может содержать только n (например, 5) баров, начиная с некоторого определенного бара (дополнительно я также хотел бы добавить текст чуть выше строки указанного значения y).

Я пробовал несколько вещей:

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)

Но на самом деле это не строки ... И я не знаю, как добавить текст ...

Тогда я попробовал это

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)

Опять же, добавление текста невозможно. Другая проблема с этим подходом состоит в том, что я не могу избавиться от легенды наверху. Поскольку я хочу нарисовать десятки или сотни этих линий на одной диаграмме, легенда не должна отображаться ...

Заранее спасибо за ваши идеи / примеры кода / ...

С наилучшими пожеланиями, Samo.

1 Ответ

3 голосов
/ 13 декабря 2011

(Я просто копирую ответ от R-sig-finance Стергиоса Маринопулоса) Используйте новую функцию chart_Series () вместе с текстом и сегментами.

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

Некоторые дополнительные комментарии от меня. Чтобы добавить сообщение: text(x,y,"message"), где x - номер бара (1 для самого левого бара; вы можете использовать 0 или отрицательное значение для рисования с левой стороны), а y - значение на графике. Для adj, 0 означает выравнивание по левому краю, 1 означает выравнивание по правому краю, 0.5 означает центрирование. Вне диапазона 0..1 это соответственно смещается (но, возможно, неразумно полагаться на это).

сегментов (x1, y1, x2, y2) рисует линию от (x1, y1) до (x2, y2), где снова x - это индекс бара, а y - цена.

На следующем рисунке изображен равнобедренный треугольник 20% непрозрачного красного цвета: полигон (с (20,30,40), с (5290,5320,5290), столбец = "# ff000033")

т.е. все графические функции R доступны; но вы должны использовать chart_Series ().

...