This strategy evaluates the strength of market trends by calculating the strength of moving averages (MA) across different timeframes, and tracks trends accordingly. When short-term MAs consecutively rally upwards, they score higher and form a “MA Strength” indicator. When this indicator crosses over its own long-term MA, buy signals are generated. The strategy allows users to configure MA combinations across short and long terms to track trends over customized cycles.
The core of this strategy is to determine the long/short condition of the MA indicator, which reflects the average strength of the MA combination. The MA combination comprehensively judges the trend, while the MA indicator determines persistence.
This strategy judges price trends by calculating a MA strength indicator and uses MA crosses as signal source to track trends. Its advantage lies in accurately determining trend strength for reliability. Main risks come from trend reversals and parameter tuning. By optimizing signal accuracy, adding stop losses, selecting suitable products, good returns can be obtained.
/*backtest start: 2023-12-19 00:00:00 end: 2024-01-18 00:00:00 period: 1h basePeriod: 15m 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/ // © HeWhoMustNotBeNamed //@version=4 strategy("MA Strength Strategy", overlay=false, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01) MAType = input(title="Moving Average Type", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) LookbackPeriod = input(10, step=10) IndexMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) IndexMAPeriod = input(200, step=10) considerTrendDirection = input(true) considerTrendDirectionForExit = input(true) offset = input(1, step=1) tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short]) i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time) i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time) inDateRange = true f_getMovingAverage(source, MAType, length)=> ma = sma(source, length) if(MAType == "ema") ma := ema(source,length) if(MAType == "hma") ma := hma(source,length) if(MAType == "rma") ma := rma(source,length) if(MAType == "vwma") ma := vwma(source,length) if(MAType == "wma") ma := wma(source,length) ma f_getMaAlignment(MAType, includePartiallyAligned)=> ma5 = f_getMovingAverage(close,MAType,5) ma10 = f_getMovingAverage(close,MAType,10) ma20 = f_getMovingAverage(close,MAType,20) ma30 = f_getMovingAverage(close,MAType,30) ma50 = f_getMovingAverage(close,MAType,50) ma100 = f_getMovingAverage(close,MAType,100) ma200 = f_getMovingAverage(close,MAType,200) upwardScore = 0.0 upwardScore := close > ma5? upwardScore+1.10:upwardScore upwardScore := ma5 > ma10? upwardScore+1.10:upwardScore upwardScore := ma10 > ma20? upwardScore+1.10:upwardScore upwardScore := ma20 > ma30? upwardScore+1.10:upwardScore upwardScore := ma30 > ma50? upwardScore+1.15:upwardScore upwardScore := ma50 > ma100? upwardScore+1.20:upwardScore upwardScore := ma100 > ma200? upwardScore+1.25:upwardScore upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200 downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200 trendStrength = upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 6? 0.5: upwardScore < 2?-0.5:upwardScore>4?0.25:-0.25) : 0 [trendStrength, upwardScore] includePartiallyAligned = true [trendStrength, upwardScore] = f_getMaAlignment(MAType, includePartiallyAligned) upwardSum = sum(upwardScore, LookbackPeriod) indexSma = f_getMovingAverage(upwardSum,IndexMAType,IndexMAPeriod) plot(upwardSum, title="Moving Average Strength", color=color.green, linewidth=2, style=plot.style_linebr) plot(indexSma, title="Strength MA", color=color.red, linewidth=1, style=plot.style_linebr) buyCondition = crossover(upwardSum,indexSma) and (upwardSum > upwardSum[offset] or not considerTrendDirection) sellCondition = crossunder(upwardSum,indexSma) and (upwardSum < upwardSum[offset] or not considerTrendDirection) exitBuyCondition = crossunder(upwardSum,indexSma) exitSellCondition = crossover(upwardSum,indexSma) strategy.risk.allow_entry_in(tradeDirection) strategy.entry("Buy", strategy.long, when= inDateRange and buyCondition, oca_name="oca_buy") strategy.close("Buy", when = considerTrendDirectionForExit? sellCondition : exitBuyCondition) strategy.entry("Sell", strategy.short, when= inDateRange and sellCondition, oca_name="oca_sell") strategy.close( "Sell", when = considerTrendDirectionForExit? buyCondition : exitSellCondition)