#' Lag function
#' @param x A vector to perform lag on
#' @param n number of elements to shift. Default is 1.
#' @export
#' @examples
#' f_lag(x = 1:10, n = 1)
#'
f_lag <- function(x, n = 1) {
if (n == 0) {
return(x)
}
id <- 1:n
x <- c(x[-id], rep(NA, n))
return(x)
}
#' This function calculates the slope of a moving average
#' @param data data.table. data should be a obj an outcome from f_indicators to ensure MA is present in data.
#' @param n Moving average based on n days
#' @return The slope of the moving average
#' @import data.table
#' @importFrom stats coef lm na.omit
f_slope <- function(data, n) {
id <- NULL
data[, id := 1:.N]
ma_var <- paste0("MA", n)
subdata <- data[, c(ma_var, "id")]
subdata <- na.omit(subdata)
if (nrow(subdata) < 5) {
return(NA)
}
m <- lm(MA ~ id, subdata)
as.numeric(coef(m)[2])
}
#' This function calculates the slope of a moving average based on n data points
#' @param data data.table. data should be a obj an outcome from f_indicators to ensure MA is present in data.
#' @param n number of days used to calculate the slope
#' @return data.table object with moving average slope for each day
#' @import data.table
f_ma_slope <- function(data, n = 10) {
m <- nrow(data)
data$MA_slope <- rep(NA, nrow(data))
for (i in (n + n):m) {
loopdata <- data[(i - n):i, ]
data$MA_slope[i] <- f_slope(data = loopdata, n = n)
cat("\r", i, "of", m)
flush.console()
}
return(data$MA_slope)
}
#' This function calculates common indicators such as moving averages and RSI
#' @param data a data.table obtained from f_load
#' @param n number of days used to calculate the slope of moving average. Default is 10
#' @param m number of days used to calculate moving average. Default is 5
#' @return A data.table
#' @export
#' @import data.table
f_indicator <- function(data, n = 10, m = 5) {
Change <- MACD <- NULL
data <- data[!is.na(Change), ]
## OSCILLATORS
## Relative Strength Index
data$RSI <- TTR::RSI(data$Close)
## Commodity Channel Index (20)
data$CCI <- TTR::CCI(HLC = data[, c("High", "Low", "Close")], n = 20)
## Average Directional Index (14)
df_adi <- TTR::ADX(HLC = data[, c("High", "Low", "Close")], n = 14)
df_adi <- data.frame(df_adi)
data$ADI <- df_adi$ADX
## Awesome Oscillator
## Momentum (10)
data$momentum <- TTR::momentum(x = data$Close, n = 10)
## MACD Level (12, 26)
MACD_res <- data.frame(TTR::MACD(data$Close,Fast = 12, nSlow = 26))
data$MACD <- MACD_res$macd
## Stochastic RSI Fast (3, 3, 14, 14)
## Williams Percent Range (14)
data$Williams_pct <- TTR::WPR(HLC = data[, c("High", "Low", "Close")], n = 14)
## Bull Bear Power
## Ultimate Oscillator (7, 14, 28)
data$ultimateOscillator <- TTR::ultimateOscillator(HLC = data[, c("High", "Low", "Close")], n = c(7, 14, 28))
## MOVING AVERAGES
## Exponential Moving Average (5)
data$EMA5 <- TTR::EMA(x = data$Close, n = 5)
## Simple Moving Average (5)
data$MA5 <- TTR::SMA(x = data$Close, n = 5)
## Exponential Moving Average (10)
data$EMA10 <- TTR::EMA(x = data$Close, n = 10)
## Simple Moving Average (10)
data$MA10 <- TTR::SMA(x = data$Close, n = 10)
## Exponential Moving Average (20)
data$EMA20 <- TTR::EMA(x = data$Close, n = 20)
## Simple Moving Average (20)
data$MA20 <- TTR::SMA(x = data$Close, n = 20)
## Exponential Moving Average (30)
data$EMA30 <- TTR::EMA(x = data$Close, n = 30)
## Simple Moving Average (30)
data$MA30 <- TTR::SMA(x = data$Close, n = 30)
## Exponential Moving Average (50)
data$EMA50 <- TTR::EMA(x = data$Close, n = 50)
## Simple Moving Average (50)
data$MA50 <- TTR::SMA(x = data$Close, n = 50)
## Exponential Moving Average (100)
data$EMA100 <- TTR::EMA(x = data$Close, n = 100)
## Simple Moving Average (100)
data$MA100 <- TTR::SMA(x = data$Close, n = 100)
## Exponential Moving Average (200)
data$EMA200 <- TTR::EMA(x = data$Close, n = 200)
## Simple Moving Average (200)
data$MA200 <- TTR::SMA(x = data$Close, n = 200)
## Ichimoku Cloud Base Line (9, 26, 52, 26)
## Volume Weighted Moving Average (20)
data$WMA <- TTR::WMA(x = data$Close, wts = data$Volume, n = 20)
## Hull Moving Average (9)
data$HMA <- TTR::HMA(x = data$Close, n = 9)
## Signal
data$Signal <- MACD_res$signal
## MACD Signal difference
data$MACD_Signal_Diff <- data$MACD - data$Signal
## MA slopes
data$MA5_slope <- f_ma_slope(data, n = 5)
data$MA10_slope <- f_ma_slope(data, n = 10)
data$MA20_slope <- f_ma_slope(data, n = 20)
data$MA50_slope <- f_ma_slope(data, n = 50)
data$MA100_slope <- f_ma_slope(data, n = 100)
data$MA200_slope <- f_ma_slope(data, n = 200)
## Bollinger bands:
bb <- TTR::BBands(HLC = data[, c("High", "Low", "Close")])
data$lower_bb <- bb[, "dn"]
data$upper_bb <- bb[, "up"]
data$ma_bb <- bb[, "mavg"]
data$pct_bb <- bb[, "pctB"]
data[, pct_close_lower_bb := (Close - lower_bb) / Close]
data[, pct_upper_bb_close := (upper_bb - Close) / Close]
data[, bb_dif := upper_bb - lower_bb]
return(data)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.