# A Guide on Charting and Custom Indicators

    library(cryptoQuotes)

Trading 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 `PR` with 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_indicator

The `sin_indicator` can be added to the `chart_object` using `plotly::subplot` which also handles the theming,

    # 1) append the sin_indicator
    # to the chart object
    chart_object <- plotly::subplot(
      # ensures that plots are
      # vertically aligned
      nrows = 2,
      heights = c(
        0.7,
        0.2
      ),
      chart_object,
      sin_indicator,
      shareX = FALSE,
      titleY = FALSE
    )

    # 2) display the chart
    # object
    chart_object

### 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.