资源加载中... loading...

MA MACD BB Multi-Indicator Trading Strategy Backtesting Tool

Author: ChaoZhang, Date: 2024-06-03 09:49:08
Tags: MAMACDBB

img

Overview

The MA MACD BB Multi-Indicator Trading Strategy Backtesting Tool is a powerful quantitative trading strategy development and backtesting platform. The tool supports three commonly used technical indicators: Moving Average (MA), Moving Average Convergence Divergence (MACD), and Bollinger Bands (BB). Users can flexibly choose one of them as the main trading signal indicator. At the same time, the tool also supports both long and short trading. Users can flexibly choose to go long or short according to market trends. In terms of risk management, the tool allows users to flexibly set the capital ratio of each transaction to better control risks. In addition, the tool also provides detailed indicator analysis and signal generation functions to help users better grasp trading opportunities.

Strategy Principle

The core principle of this strategy is to use three common technical indicators (MA, MACD, and BB) to identify market trends and trading signals. Specifically:

  1. When the user selects MA as the main indicator, the strategy calculates the moving average of the specified period, and generates buy and sell signals respectively when the price crosses above or below the moving average.
  2. When the user selects MACD as the main indicator, the strategy calculates the MACD value and signal line, and generates buy and sell signals respectively when the MACD crosses above or below the signal line. In addition, the strategy also plots the MACD histogram to more intuitively show the strength of the trend.
  3. When the user selects BB as the main indicator, the strategy calculates the upper, middle and lower rails of the Bollinger Band. When the price breaks through the lower rail, a buy signal is generated; when it breaks through the upper rail, a sell signal is generated; and when it returns to near the middle rail, the position is closed.

In actual trading, the strategy automatically calculates the position size of each transaction based on the user’s selected trading direction (long or short) and capital management settings, and then executes corresponding opening and closing operations according to the signals.

Strategy Advantages

  1. Flexible indicators: Users can flexibly choose MA, MACD or BB as the main trading indicator according to their preferences and market characteristics, adapting to different trading styles and market environments.
  2. Two-way trading: The strategy supports both long and short trading. Users can flexibly choose the trading direction according to market trends, and can profit not only in rising markets, but also gain income opportunities in falling markets.
  3. Controllable risk: Users can flexibly set the capital ratio of each transaction to reasonably control the risk exposure of a single transaction. At the same time, the strategy automatically calculates the position size of each transaction based on the account balance to avoid excessive risk-taking.
  4. Clear signals: The strategy uses common technical indicators to generate objective and clear trading signals, and intuitively displays them through charts, allowing users to clearly identify trend directions and trading timing.
  5. Convenient backtesting: Users can use this tool to backtest historical data, quickly evaluate and optimize strategy performance, and provide important references for live trading.

Strategy Risks

  1. Market risk: Any trading strategy faces the risk of market volatility and uncertainty, and this strategy is no exception. If the market experiences violent fluctuations or irrational behavior, it may cause the strategy to generate wrong signals and losses.
  2. Parameter risk: The performance of this strategy depends to a certain extent on the indicator parameters selected by the user, such as the period of MA, the fast and slow line periods of MACD, and the period and width of BB. Inappropriate parameter settings may lead to poor strategy performance.
  3. Overfitting risk: If the user over-optimizes the strategy parameters in backtesting, it may cause the strategy to be too specific to certain historical data and perform poorly in the actual market, that is, overfitting problems occur.
  4. Black swan risk: This strategy mainly relies on technical indicators to generate trading signals. If the market experiences major fundamental changes or extreme events, the strategy may not be able to respond in time, leading to significant losses.

To reduce the above risks, users should reasonably set strategy parameters, regularly evaluate and adjust strategies, and closely monitor market trends, intervening manually when necessary. In addition, strict risk management measures such as setting stop-losses and position limits are also indispensable.

Strategy Optimization Direction

  1. Dynamic parameter optimization: Currently, the indicator parameters of the strategy are fixed. We can consider introducing an adaptive mechanism to dynamically adjust parameters according to changes in market conditions to better adapt to the market.
  2. Combination signal optimization: Currently, the strategy mainly generates trading signals based on a single indicator. We can consider combining the signals of multiple indicators, such as the combination signals of MA and MACD, to improve the reliability and robustness of the signals.
  3. Position management optimization: Currently, the strategy adopts a fixed-ratio position management. We can consider introducing more advanced methods such as the Kelly formula or dynamic balancing strategy to optimize position size and risk-return ratio.
  4. Stop-loss optimization: Currently, the strategy lacks a clear stop-loss logic. We can consider adding a dynamic stop-loss mechanism based on ATR or percentage to better control downside risks.
  5. Multi-market optimization: Currently, the strategy only targets a single market. We can consider expanding to multiple related or complementary markets to leverage the linkage between markets to improve strategy stability and profitability.

The above optimization directions mainly focus on improving strategy adaptability, robustness, profitability, and risk control by introducing more advanced and flexible methods to continuously improve and perfect the performance of the strategy.

Summary

The MA MACD BB Multi-Indicator Trading Strategy Backtesting Tool is a feature-rich, flexible and practical quantitative trading tool. It captures trading signals through three common technical indicators, while supporting both long and short trading and flexible risk management, adapting to different markets and trading styles. Users can use this tool to backtest and optimize historical data, and can also apply it to live trading. Although any strategy faces market risks and model risks, through reasonable parameter settings, strict risk control, and continuous optimization and improvement, this strategy is expected to become a powerful assistant for quantitative traders, creating long-term stable returns for them.


/*backtest
start: 2023-05-28 00:00:00
end: 2024-06-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Future_Billi0naire_

//@version=5
strategy("MA MACD BB Backtester", overlay=true)

//@variable Input for Strategy
which_ta = input.string("MA", title="Select Indicator", options=["MACD", "BB", "MA"])
which_camp = input.string("Long", title="Select Long / Short", options=["Short", "Long"])

//@variable Input parameters for Risk Management
positionSize = input.float(100.0, title="Each position's capital allocation %", minval=0.0, maxval = 100.0) / 100

//@variable Input parameters for MACD
fast_length = input.int(12, title="MACD Fast Length")
slow_length = input.int(26, title="MACD Slow Length")
signal_smoothing = input.int(9, title="MACD Signal Smoothing")
macd_source = input.source(close, title="MACD Source")

//@variable Input parameters for Moving Average
ma_length = input.int(50, title="Moving Average Length")

//@variable Input parameters for Bollinger Bands
bb_length = input.int(20, title="Bollinger Bands Length")
bb_mult = input.float(2.0, title="Bollinger Bands Multiplier")

// Choosing the Strategy
int x = na
if which_ta == "MA"
    x := 1
else if which_ta == "MACD"
    x := 2
else if which_ta == "BB"
    x := 3

// Calculate MACD and Signal line
[macdLine, signalLine, _] = ta.macd(macd_source, fast_length, slow_length, signal_smoothing)

// Calculate Moving Average
ma = ta.sma(close, ma_length)

// Calculate Bollinger Bands
basis = ta.sma(close, bb_length)
dev = bb_mult * ta.stdev(close, bb_length)
upper = basis + dev
lower = basis - dev

// Plotting MACD and Signal lines
plot(x == 2 ? macdLine : na, color=color.blue, title="MACD Line")
plot(x == 2 ? signalLine : na, color=color.red, title="Signal Line")

// Plotting histogram
histogram = macdLine - signalLine
plot(x == 2 ? histogram : na, color=color.gray, style=plot.style_histogram, title="MACD Histogram")

// Plotting Moving Average
plot(x == 1 ? ma : na, color=color.orange, title="Moving Average")

// Plotting Bollinger Bands
plot(x == 3 ? upper : na, color=color.green, title="Upper Bollinger Band")
plot(x == 3 ? lower : na, color=color.red, title="Lower Bollinger Band")
plot(x == 3 ? basis : na, color=color.blue, title="Basis Bollinger Band")

// Generate buy signals
buySignalMACD = ta.crossover(macdLine, signalLine)
buySignalMA = ta.crossover(close, ma)
buySignalBB = close < lower
sellSignalBBExit = close > basis

// Generate sell signals
sellSignalMACD = ta.crossunder(macdLine, signalLine)
sellSignalMA = ta.crossunder(close, ma)
sellSignalBB = close > upper
buySignalBBExit = close < basis

// Plot buy signals on the chart
plotshape(series=buySignalMACD and x == 2 and which_camp=="Long" and strategy.opentrades == 0 ? buySignalMACD : na, title="Buy Signal MACD", location=location.belowbar, color=color.lime, style=shape.labelup, text="BUY MACD")
plotshape(series=buySignalMA and x == 1 and which_camp=="Long" and strategy.opentrades == 0 ? buySignalMA : na, title="Buy Signal MA", location=location.belowbar, color=color.lime, style=shape.labelup, text="BUY MA")
plotshape(series=buySignalBB and x == 3 and which_camp=="Long" and strategy.opentrades == 0 ? buySignalBB : na, title="Buy Signal BB", location=location.belowbar, color=color.lime, style=shape.labelup, text="BUY BB")

// Plot sell signals on the chart
plotshape(series=sellSignalMACD and x == 2 and which_camp=="Short" and strategy.opentrades == 0 ? sellSignalMACD : na, title="Sell Signal MACD", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL MACD")
plotshape(series=sellSignalMA and x == 1 and which_camp=="Short" and strategy.opentrades == 0 ? sellSignalMA : na, title="Sell Signal MA", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL MA")
plotshape(series=sellSignalBB and x == 3 and which_camp=="Short" and strategy.opentrades == 0 ? sellSignalBB : na, title="Sell Signal BB", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL BB")

// Calculate stop loss and take profit levels
accountSize = strategy.equity
positionSizeAmount = accountSize * positionSize

// Calculate order size based on stop loss amount
orderSize = math.floor(positionSizeAmount / close)

// Enter long positions based on buy signals
if strategy.opentrades == 0
    if (buySignalMACD) and x == 2 and which_camp == "Long"
        strategy.entry("Buy MACD", strategy.long, qty=orderSize)
    if (buySignalMA) and x == 1 and which_camp == "Long"
        strategy.entry("Buy MA", strategy.long, qty=orderSize)
    if (buySignalBB) and x == 3 and which_camp == "Long"
        strategy.entry("Buy BB", strategy.long, qty=orderSize)

// Enter short positions based on sell signals
if strategy.opentrades == 0
    if (sellSignalMACD) and x == 2 and which_camp == "Short"
        strategy.entry("Sell MACD", strategy.short, qty=orderSize)
    if (sellSignalMA) and x == 1 and which_camp == "Short"
        strategy.entry("Sell MA", strategy.short, qty=orderSize)
    if (sellSignalBB) and x == 3 and which_camp == "Short"
        strategy.entry("Sell BB", strategy.short, qty=orderSize)

// Close positions based on exit signals
if (sellSignalMACD) and which_camp == "Long"
    strategy.close("Buy MACD")
if (sellSignalMA) and which_camp == "Long"
    strategy.close("Buy MA")
if (sellSignalBBExit) and which_camp == "Long"
    strategy.close("Buy BB")
if (buySignalMACD) and which_camp == "Short"
    strategy.close("Sell MACD")
if (buySignalMA) and which_camp == "Short"
    strategy.close("Sell MA")
if (buySignalBBExit) and which_camp == "Short"
    strategy.close("Sell BB")


template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6