MacD Future Path Prediction Strategy

Author: ChaoZhang, Date: 2023-12-13 17:21:44
Tags:

img

Overview

The core idea of this strategy is to predict price trends by analyzing the future trend of the MacD indicator. The strategy takes full advantage of the trading signals generated by the crossovers of the fast and slow moving averages that make up the MacD indicator.

Strategy Principle

  1. Calculate the difference (historical value) of the MacD indicator to determine the rise and fall of the MacD line and signal line.
  2. Use the future value of the MacD indicator within 4 hours timeframe by setting call options to judge the future trend of the MacD indicator and predict price trends.
  3. Go long when the MacD indicator difference is greater than 0 (representing a bull market) and is expected to continue rising; go short when the MacD indicator difference is less than 0 (representing a bear market) and is expected to continue falling.
  4. The strategy combines both trend following and trend reversal trading styles, capturing trends while also seizing trend reversal points.

Advantage Analysis

  1. The advantage of using the MacD indicator to judge market trends can effectively filter out consolidations and capture long-term trends.
  2. With the help of predictions of future trends of the MacD indicator, turning points in prices can be identified early to enhance the forward-looking capability of the strategy.
  3. Integrating both trend following and trend reversal trading styles allows timely position reversal during trend tracking to gain greater returns.
  4. Adjustable strategy parameters allow users to optimize based on different timeframes and market environments to improve strategy stability.

Risk Analysis

  1. Relying on predictions of the future trend of the MacD indicator can lead to failed trades if predictions are inaccurate.
  2. Stop loss should be used to control single loss. Improper stop loss range setting will also affect strategy performance.
  3. Lagging of the MacD indicator may miss opportunities for fast price reversals. Performance of the strategy in high volatility environments needs attention.
  4. Impact of transaction costs needs monitoring.

Optimization Directions

  1. Incorporate other indicators for prediction to reduce reliance on single MacD indicator and improve prediction accuracy, such as examining changes in trading volume.
  2. Add machine learning algorithms, train models to predict future trends of the MacD indicator.
  3. Optimize parameter settings to find the best parameter combinations.
  4. Different market environments suit different parameter configurations, an adaptive system can be added to auto optimize parameters.

Conclusion

While giving full play to the MacD indicator’s advantage of determining trends, this strategy also incorporates predictions of the indicator’s future trends. Building upon capturing trends, it also seizes critical turning points. Compared to simply chasing trends, this strategy has greater foresight and profit potential. Of course, there are also certain risks that need further optimization and improvement. Overall, the strategy deserves in-depth research and application.


/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-12 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © x11joe
strategy(title="MacD (Future Known or Unknown) Strategy", overlay=false, precision=2,commission_value=0.26, initial_capital=10000, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//OPTIONAL:: Allow only entries in the long or short position
allowOnlyLong = input(title="Allow position ONLY in LONG",type=input.bool, defval=false)
allowOnlyShort = input(title="Allow position ONLY in SHORT",type=input.bool, defval=false)


strategy.risk.allow_entry_in(allowOnlyLong ? strategy.direction.long : allowOnlyShort ? strategy.direction.short : strategy.direction.all) // There will be no short entries, only exits from long.

// Create MacD inputs
fastLen = input(title="MacD Fast Length", type=input.integer, defval=12)
slowLen = input(title="MacD Slow Length", type=input.integer, defval=26)
sigLen  = input(title="MacD Signal Length", type=input.integer, defval=9)

// Get MACD values
[macdLine, signalLine, _] = macd(close, fastLen, slowLen, sigLen)
hist = macdLine - signalLine

useFuture = input(title="Use The Future?",type=input.bool,defval=true)

macDState(resolutionType) =>
    hist_from_resolution = security(syminfo.tickerid, resolutionType, hist,barmerge.gaps_off, barmerge.lookahead_on)
    Green_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution > 0
    Green_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution > 0
    Red_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution <= 0
    Red_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution <= 0
    result=0
    if(Green_IsUp)
        result := 1
    if(Green_IsDown)
        result := 2
    if(Red_IsDown)
        result := 3
    if(Red_IsUp)
        result := 4
    result

macDStateNonFuture(resolutionType) =>
    hist_from_resolution = security(syminfo.tickerid, resolutionType, hist,barmerge.gaps_off, barmerge.lookahead_off)
    Green_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution > 0
    Green_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution > 0
    Red_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution <= 0
    Red_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution <= 0
    result=0
    if(Green_IsUp)
        result := 1
    if(Green_IsDown)
        result := 2
    if(Red_IsDown)
        result := 3
    if(Red_IsUp)
        result := 4
    result

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"
// === INPUT BACKTEST RANGE END ===

//Get FUTURE or NON FUTURE data
macDState240=useFuture ? macDState("240") : macDStateNonFuture("240") //1 is green up, 2 if green down, 3 is red, 4 is red up

//Fill in the GAPS
if(macDState240==0)
    macDState240:=macDState240[1]

//Plot Positions
plot(close,color= macDState240==1 ? color.green : macDState240==2 ? color.purple : macDState240==3 ? color.red : color.yellow,linewidth=4,style=plot.style_histogram,transp=50)

if(useFuture)
    strategy.entry("buy_1",long=true,when=window() and (macDState240==4 or macDState240==1))
    strategy.close("buy_1",when=window() and macDState240==3 and macDState240[1]==4)
    strategy.entry("sell_1",long=false,when=window() and macDState240==2)
else
    strategy.entry("buy_1",long=true,when=window() and (macDState240==4 or macDState240==1))//If we are in a red macD trending downwards MacD or in a MacD getting out of Red going upward.
    strategy.close("buy_1",when=window() and macDState240==3 and macDState240[1]==4)//If the state is going upwards from red but we are predicting back to red...
    strategy.entry("sell_1",long=false,when=window() and macDState240==2)//If we are predicting the uptrend to end soon.


More