Stratégie de suivi des oscillations croisées à double EMA

Auteur:ChaoZhang est là., Date: 2024-01-03 11h38 et 51 min
Les étiquettes:

img

Résumé

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é.

La logique de la stratégie

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.

Analyse des avantages

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é.

Analyse des risques

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.

Directions d'optimisation

Les optimisations possibles de cette stratégie sont les suivantes:

  1. Je teste plus de périodes EMA pour trouver la combinaison optimale.

  2. Optimisation des paramètres ADX, y compris la période ADX et les valeurs seuil.

  3. Améliorer les algorithmes de prise de profit et de stop loss, par exemple en introduisant des stops dynamiques.

  4. Combinaison d'indicateurs supplémentaires tels que le KDJ et le MACD pour créer un système de confirmation multi-indicateurs.

Résumé

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()


Plus de