Dual Moving Average Crossover Arrow Strategy

Author: ChaoZhang, Date: 2023-11-21 17:00:49
Tags:

img

Overview

This strategy identifies buying and selling signals by calculating the crossover of dual moving averages of the MACD indicator. It plots arrows on the chart to indicate trading signals.

Principles

The strategy first calculates the fast line (12-period EMA), slow line (26-period EMA) and MACD difference. It then determines long and short signals based on the crossover of the fast and slow lines, as well as the positive/negative value of the MACD difference:

  1. When the fast line crosses above the slow line (golden cross) and the MACD difference crosses above 0, it is a buy signal
  2. When the fast line crosses below the slow line (death cross) and the MACD difference crosses below 0, it is a sell signal

To filter out false signals, the code also checks the signal of the previous candlestick. The current signal is only triggered if the previous candlestick has an opposite signal (buy vs sell or vice versa).

In addition, arrow shapes are plotted on the chart to indicate buying and selling signals.

Advantages

The advantages of this strategy include:

  1. Using dual moving average crossover helps identify trends and filter out market noise
  2. Incorporating MACD difference avoids missing trades and false signals
  3. Arrows clearly indicate entries and exits
  4. Simple and easy-to-understand rules facilitate replication

Risks and Solutions

Some risks of this strategy:

  1. Crossovers may generate false signals and cause over-trading. Parameters can be adjusted or extra filters added to reduce fake signals.
  2. Unable to discern rangings in a trend, potentially leading to losses. Adding trend indicators like ADX can avoid this.
  3. Fixed rules cannot adapt to changing markets. Machine learning can potentially optimize this.

Enhancement Opportunities

Some ways to improve the strategy:

  1. Test different parameter combinations to find optimal settings for the fast line, slow line and MACD
  2. Add extra entry conditions like volume breakouts to filter signals
  3. Incorporate stop loss to control single trade loss
  4. Use volatility indicators like VIX to gauge risk appetite
  5. Try machine learning models instead of fixed rules to create adaptive optimization

Summary

The dual moving average crossover arrow strategy is fairly simple and practical. By using crossover of two moving averages and MACD difference filtering, it identifies entries and exits during intermediate and long term trends, avoiding missing price reversals. The arrow signals also provide clear operation guidance. Further improvements in stability and profitability can be achieved through parameter tuning, extra filters and adaptive optimization.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//Daniels stolen code
strategy(shorttitle="Daniels Stolen Code", title="Daniels Stolen Code", overlay=true, calc_on_order_fills=true, pyramiding=0)

//Define MACD Variables
fast = 12, slow = 26
fastMACD = ema(hlc3, fast)
slowMACD = ema(hlc3, slow)
macd = fastMACD - slowMACD
signal = sma(macd, 9)
hist = macd - signal
currMacd = hist[0]
prevMacd = hist[1]
currPrice = hl2[0]
prevPrice = hl2[1]

buy = currPrice > prevPrice and currMacd > prevMacd
sell = currPrice < prevPrice and currMacd < prevMacd
neutral = (currPrice < prevPrice and currMacd > prevMacd) or (currPrice > prevPrice and currMacd < prevMacd)
//Plot Arrows

timetobuy = buy==1 and (sell[1]==1 or (neutral[1]==1 and sell[2]==1) or (neutral[1]==1 and neutral[2]==1 and sell[3]==1) or (neutral[1]==1 and neutral[2]==1 and neutral[3]==1 and sell[4]==1) or (neutral[1]==1 and neutral[2]==1 and neutral[3]==1 and neutral[4]==1 and sell[5]==1) or (neutral[1]==1 and neutral[2]==1 and neutral[3]==1 and neutral[4]==1 and neutral[5]==1 and sell[6]==1))
timetosell = sell==1 and (buy[1]==1 or (neutral[1]==1 and buy[2]==1) or (neutral[1]==1 and neutral[2]==1 and buy[3]==1) or (neutral[1]==1 and neutral[2]==1 and neutral[3]==1 and buy[4]==1) or (neutral[1]==1 and neutral[2]==1 and neutral[3]==1 and neutral[4]==1 and buy[5]==1) or (neutral[1]==1 and neutral[2]==1 and neutral[3]==1 and neutral[4]==1 and neutral[5]==1 and buy[6]==1))

plotshape(timetobuy, color=blue, location=location.belowbar, style=shape.arrowup)
plotshape(timetosell, color=red, location=location.abovebar, style=shape.arrowdown)
//plotshape(neutral, color=black, location=location.belowbar, style=shape.circle)


//Test Strategy
// strategy.entry("long", true, 1, when = timetobuy and time > timestamp(2017, 01, 01, 01, 01)) // buy by market if current open great then previous high
// strategy.close("long", when = timetosell and time > timestamp(2017, 01, 01, 01, 01))

strategy.order("buy", true, 1, when=timetobuy==1 and time > timestamp(2019, 01, 01, 01, 01))
strategy.order("sell", false, 1, when=timetosell==1 and time > timestamp(2019, 01, 01, 01, 01))



// strategy.entry(id = "Short", long = false, when = enterShort())
// strategy.close(id = "Short", when = exitShort())

//strategy.entry("long", true, 1, when = open > high[1]) // enter long by market if current open great then previous high
// strategy.exit("exit", "long", profit = 10, loss = 5) // ge

More