Tendance du MACD à la suite de la stratégie intraday

Auteur:ChaoZhang est là., Date: 2023-12-19 11:16:44 Je vous en prie.
Les étiquettes:

img

Résumé

La stratégie MACD Trend Following Intraday est une stratégie de trading intraday qui combine les moyennes mobiles, l'indicateur MACD et l'indicateur Williams.

La logique de la stratégie

La logique de négociation clé de cette stratégie repose sur plusieurs aspects:

  1. En ce qui concerne les prix à la consommation, les prix à la consommation sont les prix à la consommation, les prix à la consommation et les prix à la consommation.

  2. Passer long lorsque la ligne rapide du MACD est au-dessus de la ligne lente, et passer court lorsqu'elle est en dessous;

  3. Passez long lorsque la ligne de MA rapide de l'indicateur William est au-dessus de la ligne de MA lente, et vice versa;

  4. Utiliser les combinaisons de ces trois scénarios comme conditions d'entrée;

  5. Sortez au signal de retour.

En combinant EMA pour la direction générale de la tendance et MACD pour l'élan à court terme, cette stratégie peut capturer les mouvements de tendance des prix à des points d'entrée décents pour les bénéfices.

Les avantages

Cette structure combinée de plusieurs indicateurs crée une tendance à court terme typique suivant la stratégie, avec des avantages principaux tels que:

  1. Triple vérification croisée pour réduire les faux signaux;

  2. EMA pour la tendance principale, MACD pour la dynamique à court terme;

  3. L'indicateur Williams évite de chasser les sommets ou le fond de la pêche lors de mouvements volatiles;

  4. La combinaison inversion garantit que le contrôle des risques s'aligne avec les sorties.

Les risques

Il y a également des risques importants à prendre en compte pour cette stratégie:

  1. La structure complexe rend le réglage des paramètres difficile;

  2. Les transactions à court terme fréquentes peuvent entraîner des coûts de transaction plus élevés;

  3. L'échec à détecter les véritables points de renversement de tendance peut entraîner des pertes.

Les principales atténuations sont l'optimisation des paramètres et le stop loss pour maximiser les combinaisons de bénéfices et contrôler la perte maximale d'un seul commerce.

Des possibilités d'amélioration

Principaux aspects pour améliorer la stratégie:

  1. Tester plus de combinaisons de paramètres pour obtenir un ensemble optimal;

  2. Ajouter plus de flux de données comme le volume pour la validation de l'entrée;

  3. Utiliser un stop-loss dynamique ou à retard pour renforcer la maîtrise des risques;

  4. Incorporer l'apprentissage automatique pour détecter les véritables inversions.

Conclusion

Cette tendance MACD suivant la stratégie intraday combine efficacement des indicateurs pour identifier les tendances à court terme et gérer les risques. Des améliorations supplémentaires des paramètres de réglage, la définition de niveaux de stop loss et l'intégration de plus de flux de données peuvent augmenter le taux de gain et la rentabilité de la stratégie. Les concepts valent la peine d'être étudiés pour l'avancement de la stratégie.


/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 00:00:00
period: 1h
basePeriod: 15m
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/
// © platsn

//@version=5
strategy("MACD Willy Strategy", overlay=true, pyramiding=1, initial_capital=10000) 

// ******************** Trade Period **************************************
startY = input(title='Start Year', defval=2011, group = "Trading window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Trading window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Trading window")
finishY = input(title='Finish Year', defval=2050, group = "Trading window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Trading window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Trading window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
// t1 = time(timeframe.period, "0945-1545:23456") 
// window = time >= timestart and time <= timefinish and t1 ? true : false 
// t2 = time(timeframe.period, "0930-1555:23456")
// window2 = time >= timestart and time <= timefinish and t2 ? true : false 

leverage = input.float(1, title="Leverage (if applicable)", step=0.1, group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=20, title = "Reinvest percentage", group="Trading Options")
// entry_lookback = input.int(defval=10, title="Lookback period for entry condition", group = "Trading Options")

// -------------------------------------------- Data Source --------------------------------------------

src = input(title="Source", defval=close)

// ***************************************************************************************************** Daily ATR *****************************************************
atrlen = input.int(14, minval=1, title="ATR period", group = "Daily ATR")
iPercent = input.float(5, minval=1, maxval=100, step=0.1, title="% ATR to use for SL / PT", group = "Daily ATR")
 
percentage = iPercent * 0.01
datr = request.security(syminfo.tickerid, "1D", ta.rma(ta.tr, atrlen))
datrp = datr * percentage

// plot(datr,"Daily ATR")
// plot(datrp, "Daily % ATR")

//*********************************************************** VIX volatility index ****************************************

VIX = request.security("BTC_USDT:swap", timeframe.period, close)
vix_thres = input.float(20.0, "VIX Threshold for entry", step=0.5, group="VIX Volatility Index")

// ************************************************ Volume ******************************************************

vol_len = input(50, 'Volume MA Period')
avg_vol = ta.sma(volume, vol_len)

//-------------------------------------------------------- Moving Average ------------------------------------

emalen1 = input.int(200, minval=1, title='EMA', group= "Moving Averages")
ema1 = ta.ema(src, emalen1)

// ------------------------------------------ MACD ------------------------------------------
// Getting inputs
fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

// ---------------------------------------- William %R --------------------------------------
w_length = input.int(defval=34, minval=1)
w_upper = ta.highest(w_length)
w_lower = ta.lowest(w_length)

w_output = 100 * (close - w_upper) / (w_upper - w_lower)

fast_period = input(defval=5, title='Smoothed %R Length')
slow_period = input(defval=13, title='Slow EMA Length')

w_fast_ma = ta.wma(w_output,fast_period)
w_slow_ma = ta.ema(w_output,slow_period)



// ------------------------------------------------ Entry Conditions ----------------------------------------

L_entry1 = close > ema1 and hist > 0 and w_fast_ma > w_slow_ma 
S_entry1 = close < ema1 and hist < 0 and w_fast_ma < w_slow_ma 

// -------------------------------------------------- Entry -----------------------------------------------
strategy.initial_capital = 50000
profit = strategy.netprofit
trade_amount = math.floor(strategy.initial_capital*leverage / close) 

if strategy.netprofit > 0 and reinvest
    trade_amount := math.floor((strategy.initial_capital+(profit*reinvest_percent*0.01))*leverage / close) 
else
    trade_amount := math.floor(strategy.initial_capital*leverage/ close) 


if L_entry1 //and window
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 //and window
    strategy.entry("Short", strategy.short, trade_amount)

// --------------------------------------------------- Exit Conditions -------------------------------------

L_exit1 = hist < 0 and w_fast_ma < w_slow_ma and w_fast_ma < -20
S_exit1 = hist > 0 and w_fast_ma > w_slow_ma and w_fast_ma > -80

// ----------------------------------------------------- Exit ---------------------------------------------

if L_exit1 //and window2
    strategy.close("Long")
    
if S_exit1 //and window2
    strategy.close("Short")

// if time(timeframe.period, "1530-1600:23456")
//     strategy.close_all()

Plus de