La stratégie de suivi de l'oscillation double EMA est une stratégie qui identifie les tendances à l'aide de l'indicateur EMA et suit les oscillations pendant les conditions volatiles du marché.
Cette stratégie utilise l'EMA à 20 périodes comme indicateur pour juger des tendances. Lorsque le prix dépasse l'EMA, il indique une tendance à la hausse, et lorsque le prix dépasse ce niveau, il indique une tendance à la baisse.
Lorsque le prix dépasse la EMA, une position longue est entrée en utilisant le prix le plus élevé au cours des 20 dernières périodes comme prise de profit et le plus bas depuis le croisement comme stop loss. Lorsque le prix dépasse la EMA, une position courte est entrée en utilisant le prix le plus bas au cours des 20 dernières périodes comme prise de profit et le plus haut depuis le croisement comme stop loss.
Dans le même temps, la stratégie vérifie également si l'ADX est supérieur à 30. Les transactions ne sont effectuées que lorsque la tendance est suffisamment forte, c'est-à-dire lorsque l'ADX est supérieur à 30.
Pendant les transactions ouvertes, le trailing stop continue de s'ajuster en fonction des conditions du marché pour générer plus de profits.
Cette stratégie combine les avantages du suivi des tendances et du trading d'oscillation. Elle peut produire des rendements plus élevés pendant les marchés tendance et des rendements plus constants pendant les oscillations.
L'utilisation de l'EMA permet également de simplifier les paramètres, de réduire les risques de sur-optimisation et d'assurer la stabilité.
Le principal risque de cette stratégie est la possibilité d'arrêts plus fréquents lors d'oscillations intensifiées. C'est là que l'ADX entre en jeu. En désactivant le trading lorsque l'ADX est bas, les pertes en l'absence d'une tendance claire peuvent être évitées.
En outre, le placement correct du stop loss est également essentiel. Des stops trop larges peuvent augmenter le montant de la perte d'une seule transaction. Des stops trop serrés peuvent être trop sensibles et augmenter la probabilité d'arrêt. Un équilibre doit être trouvé entre les objectifs de profit et les risques de stop loss.
Les optimisations possibles de cette stratégie sont les suivantes:
Je teste plus de périodes EMA pour trouver la combinaison optimale.
Optimisation des paramètres ADX, y compris la période ADX et les valeurs seuil.
Améliorer les algorithmes de prise de profit et de stop loss, par exemple en introduisant des stops dynamiques.
Combinaison d'indicateurs supplémentaires tels que le KDJ et le MACD pour créer un système de confirmation multi-indicateurs.
En résumé, la stratégie de suivi de l'oscillation double EMA est une stratégie très pratique. Elle combine les forces des stratégies de trading de tendance et des stratégies d'oscillation. Elle peut être utilisée à la fois pour le suivi à long terme et pour le trading à court terme. Des améliorations supplémentaires de la performance peuvent être obtenues grâce à l'optimisation des paramètres et à l'ajout d'indicateurs de confirmation.
/*backtest start: 2023-12-26 00:00:00 end: 2024-01-02 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true) adxlen = input(14, title="ADX period") adxMin = input(30) dilen = adxlen f_highest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] >= _value ? _src[_i] : _value _return = _value f_lowest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] <= _value ? _src[_i] : _value _return = _value dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) emaLength = input(20) curEma = ema(close, emaLength) highPeriod = input(20) d = na takeProfitLong = highest(high, highPeriod) stopLossLong = f_lowest(low, barssince(low >= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or high < curEma strategy.cancel("Long") if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high strategy.order("Long", strategy.long, stop = high) strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong) d := high takeProfitShort = lowest(low, highPeriod) stopLossShort = f_highest(high, barssince(high <= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or low > curEma strategy.cancel("Short") if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low strategy.order("Short", strategy.short, stop = low) strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort) d := low strategy.close("Exit") plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red) plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green) plot(d, style = circles, linewidth = 4, color = yellow) plot(curEma, color = black, linewidth = 2) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(3, "Backtest Start Month") testStartDay = input(6, "Backtest Start Day") testStartHour = input(08, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()