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")