
La stratégie de suivi des secousses de la double EMA Gold Cross est une stratégie qui utilise l’indicateur EMA pour identifier les tendances et les suivre dans les événements de secousses. Cette stratégie combine la pensée du suivi de la tendance et de la capture des secousses, en suivant les longues lignes dans les événements de force et en négociant les courtes lignes dans les événements de secousses, dans l’espoir d’obtenir de meilleurs rendements.
La stratégie utilise une EMA de 20 cycles comme indicateur de tendance. Lorsque le prix atteint une EMA, le cours est considéré comme en hausse; lorsque le prix atteint une EMA, le cours est considéré comme en baisse.
Lorsque le prix est en EMA, le prix le plus élevé de 20 périodes plus élevées est utilisé comme arrêt, le prix le plus bas après le passage de l’EMA est utilisé comme arrêt de perte, faire plus d’entrée; lorsque le prix est en EMA, le prix le plus bas de 20 périodes plus bas est utilisé comme arrêt, le prix le plus élevé après le passage de l’EMA est utilisé comme arrêt de perte.
La stratégie détermine également si l’ADX est supérieur à 30. Les transactions ne sont effectuées que lorsque la tendance est suffisamment claire, c’est-à-dire lorsque l’ADX est supérieur à 30. Cela évite les arrêts de perte dans les situations de choc.
Pendant le processus de détention, le trail stop est ajusté en fonction de l’état du marché en temps réel, afin de bloquer plus de bénéfices.
Cette stratégie combine les avantages du suivi des tendances et du trading sur les secousses, permettant d’obtenir des gains plus lucratifs dans des conditions de tendances, mais aussi des gains plus stables dans des conditions de secousses, avec une plus grande adaptabilité.
L’application de l’EMA réduit également les paramètres de la stratégie et réduit le risque de sur-optimisation, garantissant ainsi la stabilité de la stratégie.
Le risque principal de cette stratégie est que le stop-loss peut être plus important lorsque les secousses s’intensifient. Le rôle de l’ADX est alors mis en évidence.
En outre, il est essentiel de définir un point de rupture raisonnable. Un point de rupture trop grand peut augmenter les pertes individuelles; un point de rupture trop petit peut être trop sensible et augmenter la probabilité de rupture. Il faut trouver un équilibre entre l’objectif de profit et le risque de rupture.
Cette stratégie peut être optimisée dans les domaines suivants:
Sélection des cycles EMA. Vous pouvez tester plus de paramètres de cycle EMA pour trouver la meilleure combinaison de paramètres.
Les paramètres de l’ADX peuvent être optimisés. Les cycles d’ADX et les seuils d’ADX peuvent être essayés avec différents paramètres.
L’algorithme de stop-loss peut être amélioré par l’introduction de stop-loss dynamique.
On peut envisager d’ajouter d’autres indicateurs, tels que KDJ, MACD, etc., pour former une stratégie de vérification multi-indicateurs.
La stratégie de suivi des chocs croisés de l’or double EMA est une stratégie très pratique dans l’ensemble. Elle combine les caractéristiques de la stratégie de tendance et de la stratégie de choc et peut être utilisée pour le suivi des lignes longues et pour le trading des lignes courtes.
/*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()