0bps

Strategy vault / Trend following

SMA Moving Average Crossover Strategy

This strategy is a simple SMA moving average crossover strategy. It uses two Simple Moving Averages (SMAs) with different lengths. When the fast MA crosses above the slow MA, it enters a long position. When the fast…

Author
ChaoZhang
Complexity
Intermediate · 39 lines
Parameters
8
Backtest bar
1d · swing
Tested on
BTC/USDT · futures

IMG

Overview

This strategy is a simple SMA moving average crossover strategy. It uses two Simple Moving Averages (SMAs) with different lengths. When the fast MA crosses above the slow MA, it enters a long position. When the fast MA crosses below the slow MA, it closes the long position. The lengths of the two MAs can be customized, as well as the start and end dates for backtesting.

The main idea of this strategy is to utilize the trend characteristics of moving averages and the signal characteristics of MA crossovers for trading. When the fast MA is above the slow MA, it indicates an upward trend and a long position should be held. When the fast MA is below the slow MA, it indicates a downward trend and no position should be held.

Strategy Principle

  1. Calculate two SMAs with different lengths, which can be customized.
  2. Check if the current time is within the backtesting window. If not, do nothing.
  3. If the fast MA crosses above the slow MA, enter a long position.
  4. If the fast MA crosses below the slow MA, close all long positions.
  5. In other cases, stay flat and do nothing.

Advantage Analysis

  1. Simple and easy to understand, with clear logic, suitable for beginners to learn and use.
  2. Moving average is a widely used technical indicator, with obvious trend characteristics, which can well reflect the current market trend.
  3. MA crossover is a classic trend-following signal that can quickly capture changes in trends.
  4. The lengths of MAs and the backtesting window can be customized, providing good flexibility.
  5. Suitable for instruments and timeframes with strong trending characteristics.

Risk Analysis

  1. Moving averages have a certain lag. When the market fluctuates greatly and the trend reverses frequently, there may be frequent crossover signals, resulting in excessive trading and increased transaction costs.
  2. This strategy can only capture upward trends, and is powerless in range-bound markets and downward trends.
  3. The selection of MA parameters needs to be optimized for different instruments and timeframes. Different parameters may have large differences in performance.
  4. This strategy does not have any stop-loss measures, and may face greater drawdown risks when the market fluctuates dramatically.

Optimization Directions

  1. Consider adding appropriate stop-loss measures, such as ATR-based trailing stop, to control the maximum loss of a single trade.
  2. Consider adding some filtering conditions, such as trading volume and volatility, to filter out some false signals.
  3. Consider optimizing parameters, such as using genetic algorithms or other intelligent algorithms to find the optimal parameter combination.
  4. Consider combining other technical indicators or trading signals with the MA crossover, such as MACD and RSI, to improve the reliability and effectiveness of the strategy.

Conclusion

The SMA moving average crossover strategy is a simple, easy-to-understand, classic and practical trend-following strategy that is suitable for beginners to learn and use. It utilizes the trend characteristics of moving averages and the signal characteristics of MA crossovers to quickly capture changes in market trends. However, this strategy also has some limitations and risks, such as lag, frequent trading, and lack of stop-loss. Therefore, in practical applications, it needs to be appropriately optimized and improved according to specific conditions to enhance the stability and profitability of the strategy.

Parameters

NameDefaultWhat it controls
v_input_int_1trueFrom Day
v_input_int_2trueFrom Month
v_input_int_32018From Year
v_input_int_430Thru Day
v_input_int_59Thru Month
v_input_int_62024Thru Year
v_input_int_7100Slow MA lenght
v_input_int_830Fast MA lenght

Source Pine Script

/*backtest
start: 2023-03-22 00:00:00
end: 2024-03-27 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/
// © j0secyn

//@version=5
strategy("MA Cross", overlay=true, margin_long=100, margin_short=100, default_qty_value=100, default_qty_type=strategy.percent_of_equity, initial_capital=10000)

// === INPUT BACKTEST RANGE ===
fromDay   = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear  = input.int(defval = 2018,title = "From Year", minval = 1970)
thruDay   = input.int(defval = 30, title = "Thru Day", minval = 1, maxval = 31)
thruMonth = input.int(defval = 9, title = "Thru Month", minval = 1, maxval = 12)
thruYear  = input.int(defval = 2024, title = "Thru Year", minval = 1970)

slow_ma_length = input.int(defval = 100, title = "Slow MA lenght")
fast_ma_length = input.int(defval = 30, title = "Fast MA lenght")

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)            // backtest start  window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)            // backtest finish window
window()  => true

// === LOGIC ===
crossOv = ta.crossover(ta.sma(close, fast_ma_length), ta.sma(close, slow_ma_length))
crossUn = ta.crossunder(ta.sma(close, fast_ma_length), ta.sma(close, slow_ma_length))

// === EXECUTION ===
// strategy.entry("L", strategy.long, when = window() and crossOv)        // enter long when "within window of time" AND crossover
// strategy.close("L", when = window() and crossUn)                       // exits long when "within window of time" AND crossunder         
strategy.entry("L", strategy.long, when = window() and crossOv)        // enter long when "within window of time" AND crossover
strategy.close("L", when = window() and crossUn)                       // exits long when "within window of time" AND crossunder         

Published by ChaoZhang on the FMZ strategy square · last modified 2024-03-28. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.

Build this with AgenKit

A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.

in Claude Code, Cursor, Codex & 4 more
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/SMA-Moving-Average-Crossover-Strategy.md
  1. npx agenkit install engineering-kit in your project
  2. Paste the command into your agent and approve each phase
  3. Get tests, backtest, risk controls and a paper-trading switch

Understand it first

Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.

Related specs

esc

Try , , or .

↑↓ move↵ open