Cette stratégie est un système de trading long-short qui combine les signaux de croisement de la moyenne mobile simple (SMA) avec le contrôle du pic de retrait. Elle utilise le croisement des SMA de 14 périodes et de 28 périodes pour générer des signaux de trading longs et courts tout en surveillant simultanément le pic de retrait de la stratégie. Lorsque le retrait dépasse un seuil prédéfini, la stratégie arrête automatiquement la négociation. En outre, la stratégie comprend une fonction d'analyse détaillée du cycle de pic à creux pour aider les traders à mieux comprendre les caractéristiques de risque de la stratégie.
Génération de signaux commerciaux
Contrôle du pic de tirage:
Analyse du cycle de pic à travers:
Combine le suivi des tendances et le contrôle des risques: La stratégie de croisement SMA est une méthode classique de suivi des tendances, tandis que le contrôle du pic de retrait fournit une couche supplémentaire de gestion des risques.
Une grande adaptabilité: En paramétrant les seuils maximaux et minimaux de tirage, la stratégie peut être adaptée de manière flexible aux différents environnements du marché et aux préférences personnelles en matière de risque.
Indicateurs de risque transparents: L'analyse du cycle de pic à creux fournit des informations détaillées sur le retrait historique, permettant aux traders de comprendre intuitivement les caractéristiques de risque de la stratégie, ce qui les aide à prendre des décisions commerciales plus éclairées.
Contrôle automatisé des risques: Lorsque le recours dépasse le seuil prédéfini, la stratégie cesse automatiquement de négocier.
Analyse complète des performances: Outre les mesures de backtesting conventionnelles, la stratégie fournit des données détaillées sur le cycle de pointe à basse, y compris les pourcentages de mise en route, les pourcentages de retrait et les informations sur le temps, ce qui facilite une analyse approfondie du rendement de la stratégie.
Une trop grande confiance dans les données historiques: La stratégie de croisement SMA est basée sur des données historiques sur les prix et peut réagir lentement dans des marchés en évolution rapide, ce qui conduit à de faux signaux.
Commerce fréquent: Dans les marchés oscillants, les SMA peuvent se croiser fréquemment, ce qui entraîne une négociation excessive et des coûts de transaction élevés.
Le potentiel de grands tirages: Malgré un contrôle maximal de la baisse, une seule forte baisse lors d'une forte volatilité du marché peut toujours entraîner des pertes importantes.
Sensitivité du paramètre: Les performances de la stratégie dépendent fortement du choix des périodes SMA et des seuils de tirage.
Des occasions manquées de revenir en arrière: Lorsque la négociation s'arrête après avoir atteint le seuil maximal de retrait, la stratégie peut manquer les opportunités offertes par les revers du marché.
Introduire le réglage dynamique des paramètres: Il convient d'envisager d'ajuster dynamiquement les périodes SMA et les seuils de prélèvement en fonction de la volatilité du marché afin de s'adapter aux différents environnements du marché.
Filtres de marché supplémentaires: Incorporer d'autres indicateurs techniques ou facteurs fondamentaux, tels que le RSI ou le volume, pour filtrer les faux signaux potentiels.
Mettre en œuvre l'entrée et la sortie par étapes: Au lieu d'opérations tout ou rien, mettre en œuvre la création et la clôture de positions par étapes pour réduire le risque de décisions uniques.
Ajouter un mécanisme de prise de profit: En plus du contrôle des retraits, ajoutez une fonction de prise de profit dynamique pour verrouiller les bénéfices et améliorer les rendements globaux.
Optimiser la gestion de l'argent: Mettre en œuvre une dimensionnement dynamique des positions en fonction de la taille du compte et de la volatilité du marché pour un meilleur contrôle des risques.
Introduire des algorithmes d'apprentissage automatique: Utiliser des techniques d'apprentissage automatique pour optimiser les processus de sélection de paramètres et de génération de signaux, améliorant ainsi l'adaptabilité et la précision de la stratégie.
La stratégie SMA crossover long-short combinée avec le contrôle du pic de tirage et l'arrêt automatique est un système de trading quantitatif qui équilibre le suivi de tendance et la gestion des risques. Elle capture les tendances du marché grâce à des croisements simples de moyennes mobiles tout en gérant le risque à la baisse en utilisant le contrôle du pic de tirage.
Bien que la stratégie présente certains risques inhérents, tels que la dépendance excessive aux données historiques et à la sensibilité des paramètres, elle peut améliorer considérablement sa robustesse et sa rentabilité grâce à une optimisation et des améliorations appropriées.
Dans l'ensemble, cette stratégie offre aux traders un bon point de départ qui peut être personnalisé et optimisé pour répondre aux objectifs de trading individuels et aux préférences en matière de risque.
/*backtest start: 2023-07-23 00:00:00 end: 2024-07-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ capital = 10000 //@version=5 strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100) // The code below is from Tradingwhale LLC /// ============================================================================== // Peak-Trough Cycles with Date and Prev. RunUp // Initialize variables showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?") min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.") maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.") var float equityPeak = na var float equityTrough = na var int cycleCount = 0 var bool inDrawdown = false var float initialCapital = capital var float prevTrough = initialCapital var float prevRunUp = na var bool useLighterGray = true var int lastYear = na // Variable to indicate whether the strategy should end var bool end_strategy = false // Table to display data var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1) // Function to convert float to percentage string f_to_percent(value) => str.tostring(value, "#.##") + "%" // Function to get month/year string without commas get_month_year_string() => str.tostring(year) + "/" + str.tostring(month) // Update the table headers if (bar_index == 0 and showTable) table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal) // Track peaks and troughs in equity if (na(equityPeak) or strategy.equity > equityPeak) if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage > min_trough cycleCount += 1 prevRunUp := (equityPeak - prevTrough) / prevTrough * 100 if cycleCount <= 20 and showTable currentYear = year if na(lastYear) or currentYear != lastYear useLighterGray := not useLighterGray lastYear := currentYear rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50) table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal) prevTrough := equityTrough equityPeak := strategy.equity equityTrough := na inDrawdown := false else if (strategy.equity < equityPeak) equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity) inDrawdown := true // Calculate if the strategy should end if not na(equityPeak) and not na(equityTrough) drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage >= maxdraw end_strategy := true // This code below is from Tradingview, but with additions where commented (see below) longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Long Entry Id", strategy.long) shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Short Entry Id", strategy.short)