A Simple Bitcoin Investment Strategy

This lesson explains how I plan to manage my Bitcoin and altcoin investments in the cryptocurrency markets using a regime filter tool written in Pine Script. This tool keeps me invested during bull markets and in cash during bear markets.

Check out my other free lessons!

Source Code

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ZenAndTheArtOfTrading / www.PineScriptMastery.com
// @version=5
strategy("Bitcoin Regime Filter Strategy", 
     overlay=true, 
     initial_capital=10000, 
     currency=currency.USDT,
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100,
     commission_type=strategy.commission.percent,
     commission_value=0.1)

// Get user input
res         = input.timeframe(title="Timeframe", defval="W")
len         = input.int(title="EMA Length", defval=20)
marketTF    = input.timeframe(title="Market Timeframe", defval="D")
useRsi      = input.bool(title="Use RSI Momentum Filter", defval=false)
rsiMom      = input.int(title="RSI Momentum Threshold", defval=70)
startTime   = input.time(title="Start Filter", defval=timestamp("01 Jan 2000 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
endTime     = input.time(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")

// Define custom security function
f_sec(_market, _res, _exp) => request.security(_market, _res, _exp[barstate.isrealtime ? 1 : 0])[barstate.isrealtime ? 0 : 1]

// Define date filter
dateFilter(int st, int et) => time >= st and time <= et

// Get EMA value
ema = ta.ema(close, len)
htfEmaValue = f_sec(syminfo.tickerid, res, ema)

// Get ATR value
atrValue = ta.atr(5)

// Check if price is above or below EMA filter
marketPrice = f_sec(syminfo.tickerid, marketTF, close)
regimeFilter = marketPrice > (htfEmaValue + (atrValue * 0.25))

// Calculate RSI
rsiValue = ta.rsi(close, 7)

// Get bullish momentum filter
bullish = regimeFilter and (rsiValue > rsiMom or not useRsi)

// Check for bearish volatility caution
caution = bullish and ta.highest(high, 7) - low > (atrValue * 1.5)

// Set momentum color
bgCol = color.red
if bullish[1]
    bgCol := color.green
if caution[1]
    bgCol := color.orange

// Change background color
plotshape(1, color=bgCol, style=shape.square, location=location.bottom, size=size.auto, title="Momentum Strength")
plot(htfEmaValue, color=close > htfEmaValue ? color.green : color.red, linewidth=2)

// Store trailing ratchet stop loss
var float trailStop = na

// Handle strategy entry
if bullish and strategy.position_size == 0 and dateFilter(startTime, endTime) and not caution
    strategy.entry(id="Buy", direction=strategy.long)
    trailStop := na

// Handle trailing stop
temp_trailStop = ta.highest(low, 7) - (caution[1] ? atrValue * 0.2 : atrValue)
if strategy.position_size > 0
    if temp_trailStop > trailStop or na(trailStop)
        trailStop := temp_trailStop

// Handle strategy exit
if (close < trailStop or close < htfEmaValue)
    strategy.close("Buy", comment="Sell")

// Draw stop
plot(strategy.position_size[1] > 0 ? trailStop : na, style=plot.style_linebr, color=color.red, title="Stop Loss")