Candlestick Charts in R

How to create candlestick charts in R.


Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Sign up for early access now.

Basic Candlestick

library(plotly)
library(quantmod)

getSymbols("AAPL",src='yahoo')
Click to copy
## [1] "AAPL"
Click to copy
# basic example of ohlc charts
df <- data.frame(Date=index(AAPL),coredata(AAPL))
df <- tail(df, 30)

fig <- df %>% plot_ly(x = ~Date, type="candlestick",
          open = ~AAPL.Open, close = ~AAPL.Close,
          high = ~AAPL.High, low = ~AAPL.Low) 
fig <- fig %>% layout(title = "Basic Candlestick Chart")

fig
Click to copy
Apr 212024Apr 28May 5May 12May 19May 26165170175180185190
Basic Candlestick ChartDate

Candlestick without Rangeslider

library(plotly)
library(quantmod)

getSymbols("AAPL",src='yahoo')
Click to copy
## [1] "AAPL"
Click to copy
df <- data.frame(Date=index(AAPL),coredata(AAPL))
df <- tail(df, 30)

fig <- df %>% plot_ly(x = ~Date, type="candlestick",
          open = ~AAPL.Open, close = ~AAPL.Close,
          high = ~AAPL.High, low = ~AAPL.Low) 
fig <- fig %>% layout(title = "Basic Candlestick Chart",
         xaxis = list(rangeslider = list(visible = F)))

fig
Click to copy
Apr 212024Apr 28May 5May 12May 19May 26165170175180185190
Basic Candlestick ChartDate

Customise the fig ure with Shapes and Annotations

library(plotly)
library(quantmod)

getSymbols("AAPL",src='yahoo')
Click to copy
## [1] "AAPL"
Click to copy
df <- data.frame(Date=index(AAPL),coredata(AAPL))

# annotation
a <- list(text = "Stock Split",
          x = '2014-06-06',
          y = 1.02,
          xref = 'x',
          yref = 'paper',
          xanchor = 'left',
          showarrow = FALSE
)

# use shapes to create a line
l <- list(type = line,
          x0 = '2014-06-06',
          x1 = '2014-06-06',
          y0 = 0,
          y1 = 1,
          xref = 'x',
          yref = 'paper',
          line = list(color = 'black',
                      width = 0.5)
)

fig <- df %>% plot_ly(x = ~Date, type="candlestick",
          open = ~AAPL.Open, close = ~AAPL.Close,
          high = ~AAPL.High, low = ~AAPL.Low) 
fig <- fig %>% layout(title = "Apple Stock",
         annotations = a,
         shapes = l)

fig
Click to copy

Custom Candlestick Colors

library(plotly)
library(quantmod)

getSymbols("AAPL",src='yahoo')
Click to copy
## [1] "AAPL"
Click to copy
# basic example of ohlc charts
df <- data.frame(Date=index(AAPL),coredata(AAPL))
df <- tail(df, 30)

# cutom colors
i <- list(line = list(color = '#FFD700'))
d <- list(line = list(color = '#0000ff'))

fig <- df %>% plot_ly(x = ~Date, type="candlestick",
          open = ~AAPL.Open, close = ~AAPL.Close,
          high = ~AAPL.High, low = ~AAPL.Low,
          increasing = i, decreasing = d)

fig
Click to copy
Apr 212024Apr 28May 5May 12May 19May 26165170175180185190
Date

Add a Trace to Candlestick Chart

library(plotly)
library(quantmod)

getSymbols("AAPL",src='yahoo')
Click to copy
## [1] "AAPL"
Click to copy
df <- data.frame(Date=index(AAPL),coredata(AAPL))
df <- tail(df, 365)

fig <- df %>% plot_ly(x = ~Date, type="candlestick",
                       open = ~AAPL.Open, close = ~AAPL.Close,
                       high = ~AAPL.High, low = ~AAPL.Low) 
fig <- fig %>% add_lines(x = ~Date, y = ~AAPL.Open, line = list(color = 'black', width = 0.75), inherit = F)
fig <- fig %>% layout(showlegend = FALSE)

fig
Click to copy
Jan 2023Apr 2023Jul 2023Oct 2023Jan 2024Apr 2024120130140150160170180190200
AAPL.OpenDate

Candlestick Using Segments

library(plotly)
library(quantmod)

msft <- getSymbols("MSFT", auto.assign = F)
dat <- as.data.frame(msft)
dat$date <- index(msft)
dat <- subset(dat, date >= "2016-01-01")

names(dat) <- sub("^MSFT\\.", "", names(dat))

fig <- plot_ly(dat, x = ~date, xend = ~date, color = ~Close > Open,
             colors = c("red", "forestgreen"), hoverinfo = "none") 
fig <- fig %>% add_segments(y = ~Low, yend = ~High, size = I(1)) 
fig <- fig %>% add_segments(y = ~Open, yend = ~Close, size = I(3)) 
fig <- fig %>% layout(showlegend = FALSE, yaxis = list(title = "Price")) 
fig <- fig %>% rangeslider()

fig
Click to copy
2017201820192020202120222023202450100150200250300350400450
Pricedate

Add Bollinger Bands and Buttons

library(plotly)
library(quantmod)

# get data
getSymbols("AAPL",src='yahoo')
Click to copy
## [1] "AAPL"
Click to copy
df <- data.frame(Date=index(AAPL),coredata(AAPL))

# create Bollinger Bands
bbands <- BBands(AAPL[,c("AAPL.High","AAPL.Low","AAPL.Close")])

# join and subset data
df <- subset(cbind(df, data.frame(bbands[,1:3])), Date >= "2015-02-14")

# colors column for increasing and decreasing
for (i in 1:length(df[,1])) {
  if (df$AAPL.Close[i] >= df$AAPL.Open[i]) {
      df$direction[i] = 'Increasing'
  } else {
      df$direction[i] = 'Decreasing'
  }
}

i <- list(line = list(color = '#17BECF'))
d <- list(line = list(color = '#7F7F7F'))

# plot candlestick chart

fig <- df %>% plot_ly(x = ~Date, type="candlestick",
          open = ~AAPL.Open, close = ~AAPL.Close,
          high = ~AAPL.High, low = ~AAPL.Low, name = "AAPL",
          increasing = i, decreasing = d) 
fig <- fig %>% add_lines(x = ~Date, y = ~up , name = "B Bands",
            line = list(color = '#ccc', width = 0.5),
            legendgroup = "Bollinger Bands",
            hoverinfo = "none", inherit = F) 
fig <- fig %>% add_lines(x = ~Date, y = ~dn, name = "B Bands",
            line = list(color = '#ccc', width = 0.5),
            legendgroup = "Bollinger Bands", inherit = F,
            showlegend = FALSE, hoverinfo = "none") 
fig <- fig %>% add_lines(x = ~Date, y = ~mavg, name = "Mv Avg",
            line = list(color = '#E377C2', width = 0.5),
            hoverinfo = "none", inherit = F) 
fig <- fig %>% layout(yaxis = list(title = "Price"))

# plot volume bar chart
fig2 <- df 
fig2 <- fig2 %>% plot_ly(x=~Date, y=~AAPL.Volume, type='bar', name = "AAPL Volume",
          color = ~direction, colors = c('#17BECF','#7F7F7F')) 
fig2 <- fig2 %>% layout(yaxis = list(title = "Volume"))

# create rangeselector buttons
rs <- list(visible = TRUE, x = 0.5, y = -0.055,
           xanchor = 'center', yref = 'paper',
           font = list(size = 9),
           buttons = list(
             list(count=1,
                  label='RESET',
                  step='all'),
             list(count=1,
                  label='1 YR',
                  step='year',
                  stepmode='backward'),
             list(count=3,
                  label='3 MO',
                  step='month',
                  stepmode='backward'),
             list(count=1,
                  label='1 MO',
                  step='month',
                  stepmode='backward')
           ))

# subplot with shared x axis
fig <- subplot(fig, fig2, heights = c(0.7,0.2), nrows=2,
             shareX = TRUE, titleY = TRUE)
fig <- fig %>% layout(title = paste("Apple: 2015-02-14 -",Sys.Date()),
         xaxis = list(rangeselector = rs),
         legend = list(orientation = 'h', x = 0.5, y = 1,
                       xanchor = 'center', yref = 'paper',
                       font = list(size = 10),
                       bgcolor = 'transparent'))

fig
Click to copy
50100150200201620182020202220240200M400M600M
AAPLB BandsMv AvgAAPL VolumeAAPL VolumeRESET1 YR3 MO1 MOApple: 2015-02-14 - 2024-05-29PriceVolumeDate

Reference

See https://plotly.com/r/reference for more information and chart attribute options!

What About Dash?

Dash for R is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library.

Learn about how to install Dash for R at https://dashr.plot.ly/installation.

Everywhere in this page that you see fig, you can display the same figure in a Dash for R application by passing it to the figure argument of the Graph component from the built-in dashCoreComponents package like this:

library(plotly)

fig <- plot_ly() 
# fig <- fig %>% add_trace( ... )
# fig <- fig %>% layout( ... ) 

library(dash)
library(dashCoreComponents)
library(dashHtmlComponents)

app <- Dash$new()
app$layout(
    htmlDiv(
        list(
            dccGraph(figure=fig) 
        )
     )
)

app$run_server(debug=TRUE, dev_tools_hot_reload=FALSE)
Click to copy