Cette stratégie utilise le système classique de double croisement EMA pour le suivi des tendances, avec des filtres supplémentaires des indicateurs ATR et ADX, afin de suivre les fortes tendances et de contrôler le risque lors des consolidations.
La stratégie repose principalement sur les éléments suivants:
Utilisez une EMA de 8 périodes plus rapide et une EMA de 20 périodes plus lente pour générer des signaux croisés.
L'indicateur ATR reflète la volatilité récente. La normalisation de l'ATR permet un ajustement dynamique des conditions de filtrage croisé de l'EMA, en abaissant les exigences lors de fortes tendances et en augmentant lors de consolidations pour contrôler le risque.
L'indicateur ADX détermine la force de la tendance.
Combinez avec les tendances taureau/ours pour déterminer le timing d'entrée long/courte.
Filtre de volume pour entrer lorsque le volume augmente.
Utilisez un indice USD simple pour déterminer la force de l'USD, l'élargissement de la fourchette stop et take profit lors d'une forte USD.
Utiliser l'indicateur SuperTrend pour déterminer l'orientation globale du marché en ce qui concerne les aides supplémentaires à court/long terme.
La stratégie combine des indicateurs de tendance et d'oscillation pour ajuster dynamiquement les paramètres, suivre les tendances tout en contrôlant le risque.
Le double système EMA assure la détermination de la tendance, la douceur de l'EMA filtrant les fausses ruptures.
Les filtres normalisés ATR permettent une flexibilité pour différents environnements de marché.
L'ADX et le volume fournissent des vérifications supplémentaires pour éviter les problèmes lors des consolidations.
La prise en compte de l'USD et de la SuperTrend améliore la précision des décisions sur la macro-tendance.
La gestion des risques s'adapte automatiquement en fonction de la force du dollar.
Des signaux croisés dorés / morts simples et une logique stop / take profit facilitent la mise en œuvre et le backtest.
Les doubles EMA sont en retard dans la détection des points tournants de tendance.
Une mauvaise sélection des paramètres ATR peut être trop agressive ou conservatrice.
Les paramètres ADX ont besoin d'optimisation, des points élevés mal définis pourraient manquer les tendances.
La détermination de la tendance USD et SuperTrend pourrait être inexacte.
Un stop-loss trop serré augmente les pertes, un risque trop large est un coup de fouet.
Considérez l'ajout d'indicateurs tels que le MACD pour une meilleure détection des points de roulement.
Optimisez les paramètres ATR par rapport à des données plus historiques.
Tester différents paramètres ADX et optimiser les seuils de points élevés.
Ajouter plus de variables pour l'analyse des tendances en USD et sur le marché.
Calculer le pourcentage optimal de stop loss à partir des statistiques des tests antérieurs.
Experimenter avec des arrêts de trail ou de lustre.
Continuer à optimiser la taille de l'entrée et la période de conservation.
Cette stratégie intègre le système classique de double EMA avec plusieurs indicateurs auxiliaires, en utilisant l'optimisation paramétrifiée pour une approche de suivi de tendance assez robuste. Il s'adapte de manière flexible aux environnements changeants du marché, en suivant les tendances tout en contrôlant le risque. Des tests et une optimisation supplémentaires des arrêts et des paramètres d'indicateur amélioreraient les résultats. Les concepts valent la peine d'être apprises et améliorées.
/*backtest start: 2023-10-15 00:00:00 end: 2023-11-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Refactored Advanced EMA Cross with Normalized ATR Filter, Controlling ADX", shorttitle="ALP V5", overlay=true) // Initialize variables to track if a buy order has been placed and number of periods since the last buy var bool hasBought = false var int barCountSinceBuy = 0 // Define EMA periods emaShort = ta.ema(close, 8) emaLong = ta.ema(close, 20) // Define ATR period and normalization atrLength = 14 atrValue = ta.atr(atrLength) maxHistoricalATR = ta.highest(atrValue, 20) minHistoricalATR = ta.lowest(atrValue, 20) normalizedATR = (atrValue - minHistoricalATR) / (maxHistoricalATR - minHistoricalATR) // Define ADX parameters adxValue = ta.rma(close, 14) adxHighLevel = 30 isADXHigh = adxValue > adxHighLevel // Initialize risk management variables var float stopLossPercent = na var float takeProfitPercent = na var float trailingStop = na // Calculate USD strength (simplified) usd_strength = close / ta.ema(close, 50) - 1 // Adjust risk parameters based on USD strength if (usd_strength > 0) stopLossPercent := 3 takeProfitPercent := 6 else stopLossPercent := 4 takeProfitPercent := 8 // Initialize position variable var float positionPrice = na // Volume filter minVolume = ta.sma(volume, 14) * 1.5 isVolumeHigh = volume > minVolume // Piyasa yönü için süper trend göstergesi [supertrendValue, supertrendDirection] = ta.supertrend(4, 14) // Use a factor of 3 and ATR period of 10 bool isBullMarket = supertrendDirection < 0 bool isBearMarket = supertrendDirection > 0 // Yükselen piyasa için alım koşulu buyConditionBull = isBullMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.2 // Düşen piyasa için alım koşulu buyConditionBear = isBearMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.5 // Genel alım koşulu buyCondition = buyConditionBull or buyConditionBear // Yükselen ve düşen piyasalar için farklı satış koşulları sellConditionBull = isBullMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh) sellConditionBear = isBearMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh) // Genel satış koşulu sellCondition = sellConditionBull or sellConditionBear // Buy condition if (buyCondition) strategy.entry("Buy", strategy.long) positionPrice := close hasBought := true // Set the flag to true when a buy order is placed barCountSinceBuy := 0 // Reset the bar counter when a buy order is placed // Increase the bar counter if a buy has been executed if (hasBought) barCountSinceBuy := barCountSinceBuy + 1 // Calculate stop-loss and take-profit levels longStopLoss = positionPrice * (1 - stopLossPercent / 100) longTakeProfit = positionPrice * (1 + takeProfitPercent / 100) // Final Sell condition, now also checks if a buy has occurred before and if at least 5 periods have passed finalSellCondition = sellCondition and hasBought and barCountSinceBuy >= 3 and isVolumeHigh if (finalSellCondition) strategy.close("Buy") positionPrice := na hasBought := false // Reset the flag when a sell order is placed barCountSinceBuy := 0 // Reset the bar counter when a buy order is closed // Implement stop-loss, take-profit, and trailing stop strategy.exit("Stop Loss", "Buy", stop=longStopLoss) strategy.exit("Take Profit", "Buy", limit=longTakeProfit) //strategy.exit("Trailing Stop", "Buy", trail_price=close, trail_offset=trailingStop * close / 100) var label l = na if (buyCondition) l := label.new(bar_index, high, text="buy triggered " + str.tostring(usd_strength)) label.delete(l[1]) if (finalSellCondition) l := label.new(bar_index, high, text="sell triggered " + str.tostring(usd_strength)) label.delete(l[1]) // Plot signals plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy") plotshape(series=finalSellCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")