
Le cadre multi-sources de confirmation des indicateurs de retour est un système de test de trading quantitatif de niveau professionnel conçu pour évaluer des indicateurs et des signaux de trading personnalisés. Le cadre intègre plusieurs méthodes de détection de signaux, un système de filtrage de confirmation avancé et des fonctions de gestion du risque professionnel permettant aux traders de tester leur stratégie de trading de manière complète. Le principal avantage du système réside dans sa flexibilité, permettant aux utilisateurs de connecter n’importe quel indicateur personnalisé ou une étude intégrée et de détecter les signaux de différentes manières, y compris les variations de valeur, les points de jonction et les déclencheurs de creux.
Le principe central de la stratégie est de fournir un environnement de test complet permettant aux traders d’évaluer l’efficacité de divers indicateurs. Le code réalise les fonctions clés suivantes:
Diverses méthodes de détection de signauxLa stratégie implique cinq méthodes de détection de signaux différentes via les fonctions détectLongSignal () et détectShortSignal ()
Système de confirmation: Un système de confirmation multi-sources a été mis en place via les fonctions longConfirmation (..) et shortConfirmation (..) qui exigent que le signal de transaction réponde à des conditions supplémentaires avant d’être exécuté. Cette fonction réduit considérablement les faux signaux.
Logic d’entrée et de sortieLes conditions d’entrée sont déterminées par le système de détection et de confirmation des signaux, tandis que les conditions d’exit peuvent être réalisées de plusieurs manières:
La logique de Poutine: Lorsque la transaction atteint le nombre de points de rupture indiqué, la stratégie déplace automatiquement le stop loss au prix d’entrée, protégeant les bénéfices déjà réalisés. Ceci est réalisé en détectant la différence entre le prix actuel et le prix d’entrée et en modifiant le niveau de stop loss lorsque le nombre de points fixé par le breakEvenTrigger est atteint.
Visualisation et surveillance: Stratégie utilise la fonction plotshape pour marquer tous les signaux d’entrée et de sortie sur le graphique et créer un tableau d’état en temps réel via table.new pour afficher les paramètres de la stratégie actuelle et l’état des transactions.
Une grande souplesse: La stratégie permet de connecter n’importe quel indicateur comme source de signal, ce qui le rend adapté à une variété de styles de négociation et de conditions de marché. L’utilisateur peut tester différentes combinaisons d’indicateurs en changeant simplement la source d’entrée.
Système de filtration à plusieurs couchesPar le biais d’un filtre de confirmation, la stratégie peut exiger que plusieurs conditions soient remplies simultanément avant d’exécuter une transaction, ce qui réduit considérablement les signaux d’erreur. Cette méthode de confirmation multi-sources simule la pratique des traders professionnels qui recherchent la cohérence de plusieurs indicateurs avant de prendre une décision de transaction.
Une gestion complète des risquesLa stratégie intègre des fonctionnalités de gestion des risques de niveau professionnel, notamment:
Commentaires et surveillance en temps réel: Grâce aux marqueurs de signaux et aux tableaux d’état, les traders peuvent visualiser l’état de fonctionnement et les performances de la stratégie, facilitant le démarrage et l’optimisation.
Compatibilité: Stratégie compatible avec Pine Script v6, qui peut être exécuté sur n’importe quelle plate-forme de négociation prenant en charge cette version, et prend en charge la fonction de rétroaction permettant aux traders d’évaluer la performance historique.
Dépendance de détection du signalL’efficacité d’une stratégie dépend fortement de la méthode de détection de signaux et de la configuration des seuils choisis. Une configuration inappropriée peut entraîner un trop grand nombre de faux signaux ou des opportunités de négociation importantes manquées. Il est recommandé aux traders de tester diverses combinaisons de paramètres dans différentes conditions de marché pour trouver la méthode de détection de signaux la mieux adaptée à un indicateur particulier.
Confirmation du risque de filtrage: Bien que les systèmes de confirmation multi-sources puissent réduire les faux signaux, ils peuvent également entraîner la perte d’opportunités de trading rentables. Des exigences de confirmation trop strictes peuvent faire que la stratégie manque des tendances de marché en évolution rapide. La solution consiste à équilibrer la rigueur des systèmes de confirmation ou à concevoir des critères de confirmation différents pour différentes conditions de marché.
Limitation de l’arrêt fixe/arrêt de perte: L’utilisation d’un stop/stop à un nombre de points fixe peut ne pas être adaptée à toutes les conditions du marché, en particulier dans les marchés à forte volatilité. Il est recommandé d’associer le stop/stop à un indicateur de volatilité du marché (comme l’ATR) pour s’adapter à différents environnements de marché.
Différence entre la détection et le disque dur: Tous les résultats de retracement présentent un risque de différences avec les transactions en direct, car le retracement ne peut pas simuler complètement les points de glissement, les coûts de transaction et les problèmes de liquidité. Les traders doivent vérifier les performances de la stratégie dans un environnement simulé avant de négocier en direct.
Complexité du code: La complexité des stratégies peut augmenter la difficulté de démarrage et de maintenance. Des annotations détaillées et une conception modulaire peuvent aider à gérer cette complexité et à assurer la maintenabilité du code.
Gestion dynamique des risquesLes stratégies actuelles utilisent des arrêts/pertes à points fixes, qui peuvent être optimisés pour un système de gestion des risques dynamique basé sur la volatilité du marché. Par exemple, l’attachement des points d’arrêt/perte à l’ATR (Average True Range) permet d’élargir la zone d’arrêt lorsque la volatilité augmente et de réduire la zone d’arrêt lorsque la volatilité diminue.
Système de confirmation renforcé: Le système de confirmation actuel peut être étendu pour inclure plus de conditions de filtrage, telles que le filtrage temporel (pour éviter de négocier à une période donnée du marché), le filtrage de volatilité (pour éviter de négocier dans un environnement à faible volatilité) ou le filtrage de tendance (pour négocier uniquement dans la direction correspondant à la tendance principale). Cela permettra de réduire encore plus les faux signaux et d’améliorer la solidité de la stratégie.
Gestion partielle des positions: la stratégie peut ajouter des fonctions de gestion de positions partielles, permettant des entrées et des sorties par lots, plutôt que d’ouvrir ou de liquider des positions entières en une seule fois. Cette approche peut réduire le risque d’entrées / sorties ponctuelles et peut améliorer la performance globale de la stratégie.
Optimisation du machine learning: Des algorithmes d’apprentissage automatique peuvent être introduits pour optimiser les paramètres de signaux et les paramètres de risque, en ajustant automatiquement les paramètres de stratégie en fonction des données historiques pour s’adapter à différents environnements de marché.
Augmentation des indicateurs de performance: Bien que la stratégie offre déjà une surveillance de base de l’état, d’autres indicateurs de performance peuvent être ajoutés, tels que le ratio de Sharpe, le maximum de rétractation, le ratio de gain et de perte, pour fournir une évaluation plus complète de la stratégie. Ces indicateurs peuvent être affichés dans le tableau d’état pour aider les traders à mieux évaluer la performance de la stratégie.
Le Multi-Source Confirmation Indicator Feedback Framework est un système de test de trading quantitatif et complet qui offre aux traders un outil puissant pour évaluer et optimiser leur stratégie de trading en intégrant plusieurs méthodes de détection de signaux, un système de confirmation à plusieurs niveaux et des fonctions de gestion des risques professionnelles. Le principal avantage du cadre réside dans sa flexibilité et sa personnalisation, permettant aux traders de tester presque n’importe quel type de combinaison d’indicateurs et de méthodes de génération de signaux.
Malgré certains risques et limitations inhérents, tels que la dépendance à la détection des signaux et les limites des paramètres de risque fixes, ces problèmes peuvent être résolus par des orientations d’optimisation proposées, telles que la mise en œuvre de la gestion dynamique des risques, le renforcement des systèmes de confirmation et l’introduction de la gestion partielle des positions. Grâce à ces optimisations, le cadre peut encore améliorer son efficacité et son adaptabilité, devenant un outil précieux dans l’arsenal des traders.
En résumé, le cadre de test des indicateurs de confirmation multi-sources représente une approche professionnelle et systématique pour tester et évaluer les stratégies de négociation, qui va au-delà de la simple génération de signaux et intègre la gestion des risques et la confirmation à plusieurs niveaux, qui sont des composants essentiels d’un système de négociation réussi.
/*backtest
start: 2024-07-08 00:00:00
end: 2025-07-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("FULLY FUNCTIONAL INDICATOR TESTER", overlay=true, margin_long=100, margin_short=100)
// Entry/Exit Signal Inputs
longEntry = input.source(close, 'Long Entry Trigger', 'Source for long signal (connect your indicator here)')
shortEntry = input.source(close, 'Short Entry Trigger', 'Source for short signal (connect your indicator here)')
activateLongExit = input.bool(false, 'Activate Long Exit Signals')
longExit = input.source(high, 'Long Exit Trigger', 'Source for long exit signal')
activateShortExit = input.bool(false, 'Activate Short Exit Signals')
shortExit = input.source(low, 'Short Exit Trigger', 'Source for short exit signal')
// Signal Detection Method
signalMethod = input.string('Value Change', 'Signal Detection Method', options=['Value Change', 'Crossover Above', 'Crossover Below', 'Value Above Threshold', 'Value Below Threshold'])
signalThreshold = input.float(0, 'Signal Threshold', tooltip='Threshold value for signal detection methods')
// Take Profit and Stop Loss
fixedTp = input.int(0, 'Static TP (in ticks)', 0, tooltip='0 = disabled')
initialSL = input.int(0, 'Initial SL (in ticks)', 0, tooltip='0 = disabled')
// Break Even Settings
breakEvenTrigger = input.int(0, 'Break Even Trigger (in ticks)', 0, tooltip='Move SL to break even after this many ticks profit. 0 = disabled')
// Confluence Settings
useConfluence = input.bool(false, 'Use Confluence Filter', 'Activate confluence filter for entries')
longConfluence = input.source(high, 'Long Signal Confluence', 'Source for long confluence filter')
longConfluenceTrigger = input.source(low, 'Long Confluence Trigger', 'Value that must be below confluence source for long entry')
shortConfluence = input.source(high, 'Short Signal Confluence', 'Source for short confluence filter')
shortConfluenceTrigger = input.source(low, 'Short Confluence Trigger', 'Value that must be above confluence source for short entry')
confluenceLookback = input.int(0, 'Confluence Lookback Period', 0, 10, 1, 'Number of candles to look back for confluence')
// Variables to track entry prices for break-even
var float longEntryPrice = na
var float shortEntryPrice = na
// Signal Detection Functions
detectLongSignal() =>
switch signalMethod
'Value Change' => longEntry != longEntry[1] and longEntry > 0
'Crossover Above' => ta.crossover(longEntry, signalThreshold)
'Crossover Below' => ta.crossunder(longEntry, signalThreshold)
'Value Above Threshold' => longEntry > signalThreshold and longEntry[1] <= signalThreshold
'Value Below Threshold' => longEntry < signalThreshold and longEntry[1] >= signalThreshold
=> false
detectShortSignal() =>
switch signalMethod
'Value Change' => shortEntry != shortEntry[1] and shortEntry > 0
'Crossover Above' => ta.crossover(shortEntry, signalThreshold)
'Crossover Below' => ta.crossunder(shortEntry, signalThreshold)
'Value Above Threshold' => shortEntry > signalThreshold and shortEntry[1] <= signalThreshold
'Value Below Threshold' => shortEntry < signalThreshold and shortEntry[1] >= signalThreshold
=> false
detectLongExit() =>
switch signalMethod
'Value Change' => longExit != longExit[1] and longExit > 0
'Crossover Above' => ta.crossover(longExit, signalThreshold)
'Crossover Below' => ta.crossunder(longExit, signalThreshold)
'Value Above Threshold' => longExit > signalThreshold and longExit[1] <= signalThreshold
'Value Below Threshold' => longExit < signalThreshold and longExit[1] >= signalThreshold
=> false
detectShortExit() =>
switch signalMethod
'Value Change' => shortExit != shortExit[1] and shortExit > 0
'Crossover Above' => ta.crossover(shortExit, signalThreshold)
'Crossover Below' => ta.crossunder(shortExit, signalThreshold)
'Value Above Threshold' => shortExit > signalThreshold and shortExit[1] <= signalThreshold
'Value Below Threshold' => shortExit < signalThreshold and shortExit[1] >= signalThreshold
=> false
// Confluence confirmation functions
longConfirmation() =>
confirmation = false
if confluenceLookback == 0
confirmation := longConfluenceTrigger < longConfluence
else
for x = 0 to confluenceLookback
if longConfluenceTrigger[x] < longConfluence[x]
confirmation := true
break
confirmation
shortConfirmation() =>
confirmation = false
if confluenceLookback == 0
confirmation := shortConfluenceTrigger > shortConfluence
else
for x = 0 to confluenceLookback
if shortConfluenceTrigger[x] > shortConfluence[x]
confirmation := true
break
confirmation
// Entry conditions
longConfirmed = useConfluence ? longConfirmation() : true
shortConfirmed = useConfluence ? shortConfirmation() : true
longCondition = detectLongSignal() and longConfirmed
shortCondition = detectShortSignal() and shortConfirmed
// Entry logic
if (longCondition and strategy.opentrades == 0)
strategy.entry('Long', strategy.long)
longEntryPrice := close
// Set initial exit orders
if fixedTp > 0 or initialSL > 0
strategy.exit('Long Exit', 'Long',
profit = fixedTp > 0 ? fixedTp : na,
loss = initialSL > 0 ? initialSL : na,
comment_profit = 'TP Hit',
comment_loss = 'SL Hit')
if (shortCondition and strategy.opentrades == 0)
strategy.entry('Short', strategy.short)
shortEntryPrice := close
// Set initial exit orders
if fixedTp > 0 or initialSL > 0
strategy.exit('Short Exit', 'Short',
profit = fixedTp > 0 ? fixedTp : na,
loss = initialSL > 0 ? initialSL : na,
comment_profit = 'TP Hit',
comment_loss = 'SL Hit')
// Custom exit signal logic
if (activateLongExit and detectLongExit() and strategy.position_size > 0)
strategy.close('Long', 'Custom Long Exit')
if (activateShortExit and detectShortExit() and strategy.position_size < 0)
strategy.close('Short', 'Custom Short Exit')
// Break-even logic
if (breakEvenTrigger > 0)
// Long position break-even
if (strategy.position_size > 0 and not na(longEntryPrice))
ticksProfit = math.round((high - longEntryPrice) / syminfo.mintick)
if (ticksProfit >= breakEvenTrigger)
strategy.exit('Long Exit', 'Long', stop = longEntryPrice, comment_loss = 'Break Even')
// Short position break-even
if (strategy.position_size < 0 and not na(shortEntryPrice))
ticksProfit = math.round((shortEntryPrice - low) / syminfo.mintick)
if (ticksProfit >= breakEvenTrigger)
strategy.exit('Short Exit', 'Short', stop = shortEntryPrice, comment_loss = 'Break Even')
// Reset entry prices when no position
if (strategy.position_size == 0)
longEntryPrice := na
shortEntryPrice := na
// Plot signals for debugging
plotshape(longCondition, title='Long Signal', location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortCondition, title='Short Signal', location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
plotshape(activateLongExit and detectLongExit() and strategy.position_size > 0, title='Long Exit', location=location.abovebar, color=color.orange, style=shape.xcross, size=size.small)
plotshape(activateShortExit and detectShortExit() and strategy.position_size < 0, title='Short Exit', location=location.belowbar, color=color.orange, style=shape.xcross, size=size.small)
// Display current settings in a table for easy reference
if barstate.islast
var table infoTable = table.new(position.top_right, 2, 8, bgcolor=color.white, border_width=1)
table.cell(infoTable, 0, 0, "Signal Method:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 0, signalMethod, text_color=color.black)
table.cell(infoTable, 0, 1, "Threshold:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 1, str.tostring(signalThreshold), text_color=color.black)
table.cell(infoTable, 0, 2, "TP (ticks):", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 2, str.tostring(fixedTp), text_color=color.black)
table.cell(infoTable, 0, 3, "SL (ticks):", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 3, str.tostring(initialSL), text_color=color.black)
table.cell(infoTable, 0, 4, "Break Even:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 4, str.tostring(breakEvenTrigger), text_color=color.black)
table.cell(infoTable, 0, 5, "Confluence:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 5, useConfluence ? "ON" : "OFF", text_color=color.black)
table.cell(infoTable, 0, 6, "Position:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 6, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT", text_color=color.black)
table.cell(infoTable, 0, 7, "Status:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 7, "FULLY FUNCTIONAL", text_color=color.green)