Stratégie de repli de la croix dorée de l'EMA


Date de création: 2023-12-21 11:48:54 Dernière modification: 2023-12-21 11:48:54
Copier: 2 Nombre de clics: 877
1
Suivre
1623
Abonnés

Stratégie de repli de la croix dorée de l’EMA

Aperçu

La stratégie de reprise croisée EMA Gold est une stratégie de trading quantitative basée sur les indicateurs EMA. Elle utilise la courbe EMA de trois périodes différentes pour construire un signal de trading et, combinée à un mécanisme de reprise des prix, définit un stop-loss pour automatiser les transactions.

Principe de stratégie

La stratégie utilise trois courbes EMA:

  • EMA1: courte période, 33 cycles par défaut, utilisée pour déterminer le support/résistance de la reprise des cours.
  • EMA2: est utilisé pour filtrer les signaux de réversion partiels, avec une fréquence 5 fois supérieure à celle de l’EMA1 et 165 cycles par défaut.
  • EMA3: est utilisé pour déterminer la direction de la tendance générale, avec une périodicité 11 fois supérieure à celle de l’EMA1, avec 365 cycles par défaut.

La génération du signal de transaction suit la logique suivante:

Signaux multiples: un rebond se produit après que le prix a traversé les constituants EMA1, formant des points plus élevés et plus bas au-dessus de l’EMA1, et le rebond n’a pas touché l’EMA2. Une fois que les conditions sont remplies, faites plus lorsque vous portez à nouveau EMA1.

Signal de tête vide: un rebond se produit après que le prix a traversé EMA1 vers le bas, formant un sommet plus bas en dessous d’EMA1 et la marge de rebond n’a pas touché EMA2. Une fois que les conditions sont remplies, videz-vous à nouveau en traversant EMA1 vers le bas.

La méthode de stop-loss est de réinitialiser le prix minimum/le prix maximum. Le stop-loss est défini à 2 fois le stop-loss.

Avantages stratégiques

Cette stratégie présente les avantages suivants:

  1. L’utilisation de l’indicateur EMA pour construire un signal de transaction est plus fiable.
  2. Le système de réajustement des prix permet d’éviter efficacement les coupures.
  3. Le point d’arrêt de la perte est réglé à un niveau élevé ou bas, ce qui permet de contrôler efficacement le risque.
  4. Le stop-loss est réglé selon le stop-loss ratio, ce qui satisfait aux exigences de stop-loss.
  5. Les paramètres de l’EMA peuvent être ajustés en fonction du marché pour s’adapter à différents cycles.

Risque stratégique

Cette stratégie comporte aussi des risques:

  1. L’indicateur EMA est en retard et risque de manquer le point de basculement.
  2. Une amplitude de réverbération trop grande pour dépasser l’EMA2 peut générer de faux signaux.
  3. La baisse de la tendance pourrait être dépassée.
  4. Une mauvaise configuration des paramètres peut entraîner des transactions trop fréquentes ou des opportunités manquées.

Les paramètres peuvent être optimisés par des méthodes telles que l’ajustement des cycles EMA, le réglage de la plage de limitation. Ils peuvent également être combinés avec d’autres indicateurs pour filtrer les signaux.

Orientation de l’optimisation de la stratégie

La stratégie peut également être optimisée dans les domaines suivants:

  1. Augmenter le jugement sur les indicateurs de tendance et éviter le trading à l’envers. Par exemple, rejoindre le MACD.
  2. Ajout d’indicateurs de volume de transactions pour éviter les faux-breechers. Par exemple, rejoindre l’OBV.
  3. Optimiser les paramètres du cycle EMA, ou adopter des EMA adaptatifs.
  4. Paramètres d’optimisation dynamique des méthodes d’apprentissage automatique telles que les modèles de sacs de mots.
  5. Ajouter une prévision du modèle et définir un arrêt de perte adaptatif.

Résumer

La stratégie de reprise croisée de l’or de l’EMA permet l’automatisation des transactions en construisant un système de négociation à trois EMA, combiné à des caractéristiques de reprise des prix et en définissant un stop-loss. La stratégie contrôle efficacement le risque de négociation et peut être optimisée en fonction du marché en ajustant les paramètres.

Code source de la stratégie
/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//