The Swing Trend Moving Average Strategy is a trend following system that uses a long-term moving average to identify the trend direction combined with the Average True Range to filter out fakeouts and limit overall drawdowns. It adopts an Exponential Moving Average to determine the trend direction and utilizes the Average True Range to detect if it is a false breakout. This can effectively filter out ranging markets and reduce overall strategy drawdowns.
The strategy is designed based on the following principles:
The strategy has the following advantages:
The strategy also has some potential risks:
The strategy can be optimized in the following aspects:
Overall, the Swing Trend Moving Average Strategy is a very simple and practical trend following strategy. It also has good risk control. Although the strategy does not take many factors into consideration, detailed testing and optimization of parameters and stop loss methods are still required. However, its simple trading logic and parameter settings make it widely applicable to different products, especially suitable for trading cryptocurrencies like Bitcoin.
/*backtest start: 2023-01-28 00:00:00 end: 2024-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Inkedlau //@version=5 strategy('Swing Trend Strategy', overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, commission_value=0.1) use_short = input.bool(false, 'Open Short Positions?') exit_type = input.bool(true, 'Exit trade on Moving Average Cross?') src = input.source(close, 'Source') len = input.int(200, 'Trend Length') ma_type = input.string('ema', 'Moving Average Type', options=['sma', 'ema', 'rma', 'wma', 'vwma'], tooltip='Select the type of Moving Average to use to calculate the Trend') atr_multiplier = input.float(1., 'ATR Threshold', step=0.5, tooltip='Filter the ranging market using the Average True Range') // ----------------------- DESCRIPTION ----------------------- // THIS SCRIPT IS A TREND FOLLOWING SYSTEM THAT USES A COMBINATION OF MOVING AVERAGE AND AVERAGE TRUE RANGE // TO SPOT THE TRENDS AND ENTER THE MARKET ACCODINGLY. // THE MARKET IS CONSIDERED IN AN UPTREND WHEN THE PRICE CLOSES ABOVE THE MOVING AVERAGE + THE AVERAGE TRUE RANGE OF THE LAST 10 PERIODS // THE MARKET IS CONSIDERED IN AN DOWNTREND WHEN THE PRICE CLOSES BLOW THE MOVING AVERAGE - THE AVERAGE TRUE RANGE OF THE LAST 10 PERIODS // BY DEFAULT, THE STRATEGY WILL ENTER LONG WHEN AN UPTREND IS SPOTTED, THEN CLOSES WHEN THE PRICE CLOSES BELOW THE MOVING AVERAGE // THE STRATEGY WILL ENTER SHORT WHEN A DOWNTREND IS SPOTTED, THEN CLOSES WHEN THE PRICE CLOSES ABOVE THE MOVING AVERAGE // ------------------ INDICATORS CALCULATION------------------ my_ma()=> ma = close if ma_type == 'sma' ma := ta.sma(src, len) if ma_type == 'ema' ma := ta.ema(src, len) if ma_type == 'rma' ma := ta.rma(src, len) if ma_type == 'wma' ma := ta.wma(src, len) if ma_type == 'vwma' ma := ta.vwma(src, len) ma trend = my_ma() atr = ta.atr(10) uptrend = trend + atr * atr_multiplier downtrend = trend - atr * atr_multiplier // ---------------- ENTRY AND EXIT CONDITIONS ---------------- open_long = strategy.position_size == 0 and src > uptrend close_long = exit_type ? strategy.position_size > 0 and src < trend : strategy.position_size > 0 and src < downtrend open_short = use_short and strategy.position_size == 0 and src < downtrend close_short = exit_type ? strategy.position_size < 0 and src > trend : strategy.position_size < 0 and src > uptrend strategy.entry('long', strategy.long, when=open_long) strategy.close('long', when=close_long) strategy.entry('short', strategy.short, when=open_short) strategy.close('short', when=close_short) // ------------------ PLOTTING AND COLORING ------------------ tcolor = src > uptrend ? color.green : src < downtrend ? color.red : na ptrend = plot(trend, color=color.blue, linewidth=1) puptrend = plot(uptrend, color=color.green, linewidth=1) pdowntrend = plot(downtrend, color=color.red, linewidth=1) pclose = plot(close, color=na) fill(puptrend, pclose, color=close > uptrend ? color.green : na, transp = 90) fill(pdowntrend, pclose, color=close < downtrend ? color.red : na, transp = 90)