System: Carter MA 8 – 21

Abstract

In his book “Mastering the trade”, John Carter proposes a simple system based on the moving averages of 8 and 21.

I have implemented the basis of this system and I have changed some behaviors:

I have build this system on Tradingview and I have done some back-testing in 3 periods to see how it works.

The system

The system code is this one:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © joapen

//@version=4
strategy("Carter EMA(8/21)", overlay=true)

// === BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2020, title = "From Year", minval = 2000)
ToMonth   = input(defval = 12, title = "To Month", maxval = 12)
ToDay     = input(defval = 31, title = "To Day", maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", maxval = 2020)

//
// SQZMOM
//
length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

// lime green  red marron
sqzLong = iff( val > 0, iff( val > nz(val[1]), true, false), iff( val < nz(val[1]), false, true))
// Plots
plot(upperBB, title="BB", color=color.green)
plot(ema(close,8), title="EMA(8)", color=color.orange)
plot(ema(close,21), title="EMA(21)", color=color.red)

longCondition = (ema(close, 8)> sma(close, 21)) and (close < ema(close, 8) and sqzLong) and time > timestamp(FromYear, FromMonth, FromDay, 00, 00) and time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
alertcondition(longCondition, title='Long', message='long!!!')
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = (close > upperBB ) or (ema(close, 8)< sma(close, 21) or val<0) and time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
alertcondition(shortCondition, title='Short', message='short!!!')
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)

Back-testing conditions

  • Amount = 100.000$
  • Commission = 0$
  • List of companies: fix list of companies I know with different behaviors, volatility and industries: BEN, TROW, CTVA, AEMD, GMRE, WBA, CVS, MO, DT, GE.

Quality of the samples:

  • Minimum around 200 trades to consider a good amount of cases.
  • Share Ratio > 1
  • Profit Factor > 2

Back-testing results for first date range

  • Date range = 1/1/2020 – 13/05/2020
  • Time frame = 5 minutes

Volatility during this period have been so high:

Back-testing results for second date range

  • Date range = 1/1/2019 – 13/05/2019
  • Time frame = 15 minutes (Tradingview does not enable me to do it in 5 minutes)

Back-testing results for bio companies in 2020

  • Date range = 1/1/2020 – 13/05/2020
  • Time frame = 5 minutes

Conclusions

15/05/2020

  • I have to improve or discard this system.
  • Check when the market trend is better.
  • Check when volatility is lower.

Leave a Comment