
A Guide on Charting and Custom Indicators
Source:vignettes/custom_indicators.Rmd
      custom_indicators.RmdTrading indicators comes in various forms; from the alignment of the
moon relative to the sun, to sophisticated trading rules based on neural
networks which incorporates classified features; It is not possible to
cover them all in an R package.
In this vignette an introduction to the construction of
charts and chart indicators are given, and is recommended for those who
would want to chart indicators not otherwise found in {cryptoQuotes}. The
vignette uses the built-in BTC-object.
Note: Feel free to make a
PRwith your indicators that you wish to share with the rest of the community.
As the charts in {cryptoQuotes} uses
{plotly} as backend, the
chart-objects complies with it’s syntax.
Custom Indicators
We start by creating a simple chart-object with
volume as it’s only indicator,
# 1) create a simple chart
# object
# 
# NOTE: The chart is wrapped in
# plotly::layout() to avoid
# duplicating xaxis when the
# custom indicators are added
chart_object <- plotly::layout(
  chart(
    ticker = BTC,
    main   = kline(),
    sub    = list(
      volume()
    ),
    options = list(
      dark = FALSE
    )
  ),
  xaxis = list(
    showticklabels = FALSE
  )
)Sine-oscillator
Assume a trading strategy that follows a sin()-curve
throughout the period of interest. The starting point is generating the
indicator,
# 1) generate sin-indicator
sin_indicator <- data.frame(
    index         = zoo::index(BTC),
    sin_indicator = sin(seq(0,8*pi,length.out=nrow(BTC)))
  
)The sin_indicator in it’s basic form can be charted as
follows,
# 1) create a plotly-object
# with the sin-indicator
sin_indicator <- plotly::layout(
   margin= list(l = 5, r = 5, b = 5),
  p = plotly::plot_ly(
    data = sin_indicator,
    y    = ~sin_indicator,
    x    = ~index,
    type = "scatter",
    mode = "lines",
    name = "sin"
  ),
  yaxis = list(
    title = NA
  ),
  xaxis = list(
    title = NA
  )
)
# 2) display the 
# indicator
sin_indicatorThe sin_indicator can be added to the
chart_object using plotly::subplot which also
handles the theming,
Linear Regression Line
Assume a trading strategy that goes long (short) every time the price is below (above) the linear regression line. This indicator can be defined as follows,
# 1) linear regression
# line
lm_indicator <- data.frame(
  y = fitted(
    lm(
      close ~ time,
      data = data.frame(
        time = 1:nrow(BTC),
        close = BTC$close
      )
    )
  ),
  index = zoo::index(BTC)
)The lm_indicator in it’s basic form can be charted as
follows,
# 1) display the linear
# regression line on
# an empty chart
plotly::add_lines(
  p    = plotly::plotly_empty(),
  data = lm_indicator,
  y    = ~y,
  x    = ~index,
  inherit = FALSE,
  xaxis = "x1",
  yaxis = "y2",
  name  = "regression"
)The lm_indicator can be added to the
chart_object using plotly::add_lines which
also handles the theming,
# 1) add the regression
# line to the chart_object
plotly::layout(
  margin = list(l = 5, r = 5, b = 5, t = 65),
  plotly::add_lines(
    p       = chart_object,
    data    = lm_indicator,
    y       = ~y,
    x       = ~index,
    inherit = FALSE,
    xaxis   = "x1",
    yaxis   = "y2",
    name    = "regression"
  ),
  yaxis = list(
    title = NA
  ),
  xaxis = list(
    title = NA
  )
)Summary
Creating custom indicators for the chart()-functions
follows standard {plotly}
syntax. Two examples of how these are charted in {cryptoQuotes} have
been covered.
Note: A full pipeline of charting indicators, custom and built-in, will be released sometime in the future.