Trend Following Strategy Based on MA Lines

Author: ChaoZhang, Date: 2024-02-22 17:24:02



This strategy calculates moving averages (MA) of different periods to determine the market trend direction. It goes long when the trend is up and goes short when the trend is down to follow the trend.

Strategy Principle

  1. Calculate 20-period, 60-period and 120-period MAs
  2. Compare the magnitude relationship among MA20, MA60 and MA120 to determine the current trend direction
    • If MA20>MA60>MA120, judge the trend to be upward
    • If MA20<MA60<MA120, judge the trend to be downward
  3. Go long when MA20 crosses over MA60, and go short when MA20 crosses below MA60
  4. Use MA60 as the reference line for take profit and stop loss
    • Take profit line for long position is 3 times of MA60
    • Take profit line for short position is 0.9 times of MA60

Advantage Analysis

  1. Use MA combos of different periods to determine trend to avoid whipsaws
  2. Only enter at trend reversal points to increase winning rate
  3. Have clear rules for take profit and stop loss to reduce risks

Risk Analysis

  1. In range-bound markets, MA crossovers may happen frequently, causing too frequent trading
  2. Parameters for take profit and stop loss need to be optimized, otherwise position may be stopped out prematurely or take profit is not enough

Optimization Directions

  1. Add indicators to identify range-bound markets to avoid overtrading
  2. Optimize MA period combinations to find the best parameters
  3. Test and optimize take profit and stop loss coefficients to balance maximizing returns and minimizing risks


The strategy has a clear logic of using MAs to determine trends. After parameter optimization and indicator optimization, it can become a very practical trend following strategy.

start: 2023-02-15 00:00:00
end: 2024-02-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

strategy("MA60上多下空", overlay=true)

// 计算MA20/60/120
ma20 = ta.sma(close, 20)
ma60 = ta.sma(close, 60)
ma120 = ta.sma(close, 120)

// 判断MA的趋势
maUpTrend = ma20 > ma60 and ma60 > ma120
maDownTrend = ma20 < ma60 and ma60 < ma120

// 画竖直线标记MA趋势转折点
plotshape(maUpTrend and ta.crossover(ma20, ma60), style=shape.triangledown, location=location.abovebar,, size=size.small)
plotshape(maDownTrend and ta.crossunder(ma20, ma60), style=shape.triangleup, location=location.belowbar,, size=size.small)

// 画背景标记MA趋势
bgcolor(maUpTrend ?, 90) : na)
bgcolor(maDownTrend ?, 90) : na)

// 建立多头仓位的条件
longCondition = ta.crossover(close, ma60)

// 建立空头仓位的条件
shortCondition = ta.crossunder(close, ma60)

// 在穿过MA60时,根据条件建立相应的多头或空头仓位
if (longCondition)
    strategy.entry("Long", strategy.long)

if (shortCondition)
    strategy.entry("Short", strategy.short)

// 止盈止损规则
calculateReturns() =>
    close / strategy.position_avg_price - 1

takeProfitCondition = calculateReturns() >= 3  // 仓位盈利达到300%
stopLossCondition = calculateReturns() <= -0.1  // 仓位亏损达到10%

if (takeProfitCondition)
    strategy.close("Long", comment="Take Profit")
    strategy.close("Short", comment="Take Profit")

if (stopLossCondition)
    strategy.close("Long", comment="Stop Loss")
    strategy.close("Short", comment="Stop Loss")