R Strategy Report: Keltner ADX Volatility Breakout Strategy

Strategy: Keltner ADX Volatility Breakout Strategy
Backtest Window: 2023-08-29 to 2026-08-27
Assets: QQQ, AAPL, MSFT, NVDA | Initial Equity: $100,000

R Replication Script

# Load required libraries
library(quantmod)
library(quantstrat)

# Set parameters
start_date <- '2023-08-29'
end_date <- '2026-08-27'
init_equity <- 100000
symbols <- c('QQQ', 'AAPL', 'MSFT', 'NVDA', 'AMD', 'AMZN')

# Get historical data
getSymbols(symbols, from = start_date, to = end_date)

# Initialize the portfolio, account, and orders
initPortf('KeltnerADX', symbols = symbols)
initAcct('KeltnerADX', portfolios = 'KeltnerADX', initEq = init_equity)
initOrders(portfolio = 'KeltnerADX')

# Define the strategy
strategy.st <- 'KeltnerADX'
rm <- 'KeltnerADX'

# Initialize strategy
initStrategy(strategy.st)

# Define indicators
add.indicator(strategy = strategy.st, name = 'EMA', arguments = list(x = quote(Cl(mktdata)), n = 20), label = 'EMA20')
add.indicator(strategy = strategy.st, name = 'KeltnerChannel', arguments = list(HLC = quote(HLC(mktdata)), n = 20, sd = 1.5), label = 'KC')
add.indicator(strategy = strategy.st, name = 'ADX', arguments = list(x = quote(HLC(mktdata)), n = 14), label = 'ADX')

# Define signals
add.signal(strategy = strategy.st, name = 'sigThreshold', arguments = list(column = 'KC.upper', threshold = 0, relationship = 'gt'), label = 'longEntry')
add.signal(strategy = strategy.st, name = 'sigThreshold', arguments = list(column = 'EMA20', threshold = 0, relationship = 'lt'), label = 'longExit')

# Define rules
add.rule(strategy = strategy.st, name = 'ruleSignal', arguments = list(sigcol = 'longEntry', sigval = TRUE, ordertype = 'market', orderside = 'long', replace = FALSE, TxnFees = 0), type = 'enter')
add.rule(strategy = strategy.st, name = 'ruleSignal', arguments = list(sigcol = 'longExit', sigval = TRUE, ordertype = 'market', orderside = 'long', replace = TRUE, TxnFees = 0), type = 'exit')

# Apply the strategy
applyStrategy(strategy = strategy.st, portfolios = 'KeltnerADX')

# Update the portfolio
updatePortf('KeltnerADX')

# Get performance summary
chart.Posn('KeltnerADX', Symbol = 'QQQ')

# Print final portfolio summary
getPortfolio('KeltnerADX')
← Back to Full Article