Stratégie de trading quantitative adaptative avec pivot de support et de résistance dynamique

ATR Pivot
Date de création: 2025-01-10 15:08:24 Dernière modification: 2025-01-10 15:08:24
Copier: 3 Nombre de clics: 416
1
Suivre
1617
Abonnés

Stratégie de trading quantitative adaptative avec pivot de support et de résistance dynamique

Aperçu

Cette stratégie est un système de trading adaptatif qui identifie dynamiquement les niveaux de support et de résistance en fonction des points de pivot des prix. Il détermine les niveaux de prix clés en calculant les hauts et les bas locaux en temps réel et exécute les transactions sur cette base. Le cœur de cette stratégie réside dans sa nature dynamique, qui peut ajuster les paramètres de trading dans le temps en fonction des changements des conditions du marché et convient aux marchés tendance et volatils.

Principe de stratégie

La logique fondamentale de la stratégie repose sur les éléments clés suivants :

  1. Calcul du point de pivot dynamique : utilise un paramètre de longueur de pivot réglable (la valeur par défaut est 2) pour identifier les hauts et les bas locaux
  2. Plage de support et de résistance : définissez une plage de pourcentage (par défaut 0,4 %) en fonction du point pivot pour définir la zone de trading effective
  3. Génération de signaux de trading : lorsque le prix franchit le niveau de support par le bas, un signal long est généré, et lorsqu’il franchit le niveau de résistance par le haut, un signal court est généré.
  4. Contrôle des risques : des paramètres dynamiques de stop loss (10 %) et de profit (27 %) sont utilisés, et la taille de la position est automatiquement ajustée en fonction de la valeur nette du compte

Avantages stratégiques

  1. Forte adaptabilité : la stratégie peut ajuster dynamiquement les positions de support et de résistance en fonction de l’état du marché pour éviter le décalage causé par les niveaux statiques
  2. Risque contrôlable : grâce à un pourcentage strict de stop loss et à une gestion dynamique des positions, le risque de chaque transaction est contrôlé dans une fourchette raisonnable
  3. Évolutivité : prend en charge plusieurs périodes de temps et combinaisons de paramètres pour faciliter l’optimisation en fonction des différents environnements de marché
  4. Haute transparence : la logique de trading est claire et tous les signaux et niveaux de prix peuvent être affichés intuitivement sur le graphique

Risque stratégique

  1. Risque de fausse cassure : des signaux de fausse cassure fréquents peuvent se produire sur un marché volatil, ce qui doit être réduit en ajustant les paramètres de l’intervalle de support et de résistance.
  2. Impact du glissement : dans un environnement de marché avec une faible liquidité, le prix réel de la transaction peut s’écarter considérablement du prix du signal.
  3. Dépendance à la tendance : la stratégie est plus performante dans un marché à forte tendance, mais peut générer trop de signaux de trading dans une phase latérale
  4. Sensibilité des paramètres : les performances de la stratégie sont sensibles aux paramètres définis et des tests rétrospectifs sont nécessaires pour déterminer la combinaison optimale de paramètres.

Orientation de l’optimisation de la stratégie

  1. Ajout d’un module de reconnaissance de l’environnement de marché pour ajuster automatiquement les paramètres en fonction de la volatilité
  2. Introduire le volume et d’autres indicateurs techniques comme signaux de confirmation auxiliaires
  3. Optimisez les algorithmes de gestion des positions et effectuez des ajustements dynamiques en fonction de la volatilité du marché
  4. Ajoutez un filtre temporel pour éviter de générer des signaux de trading pendant des périodes défavorables
  5. Développer un algorithme de stop loss adaptatif pour ajuster dynamiquement la position du stop loss en fonction de la volatilité du marché

Résumer

La stratégie fournit un cadre solide pour le suivi des tendances et le trading d’inversion en identifiant dynamiquement les niveaux de prix clés combinés à un contrôle strict des risques. Bien qu’il existe un certain degré de sensibilité aux paramètres et de dépendance à l’environnement du marché, grâce à une optimisation et une amélioration continues, il peut maintenir des performances stables dans différents environnements de marché. Le bon fonctionnement de la stratégie nécessite que les traders aient une compréhension approfondie de ses principes et effectuent les ajustements de paramètres appropriés en fonction des conditions spécifiques du marché.

Code source de la stratégie
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
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/
// © felipemiransan

//@version=6
strategy("Dynamic Support and Resistance Pivot Strategy ", overlay=true)

// Strategy parameters
pivot_length = input.int(2, title="Pivot Length", tooltip="Pivot size to identify peaks and troughs")
support_resistance_distance = input.float(0.4, title="Support/Resistance Distance %", tooltip="Distance to consider a support or resistance level in %")

// Stop Loss and Take Profit parameters
stop_loss_pct = input.float(10.0, title="Stop Loss %", tooltip="Stop loss percentage", minval=0.1) / 100
take_profit_pct = input.float(26.0, title="Take Profit %", tooltip="Take profit percentage", minval=0.1) / 100

// Functions to identify high and low pivots
pivot_high = ta.pivothigh(high, pivot_length, pivot_length)
pivot_low = ta.pivotlow(low, pivot_length, pivot_length)

// Storing support and resistance levels
var float resistance_level = na
var float support_level = na
var float last_pivot_high = na
var float last_pivot_low = na

// Updating support and resistance based on pivots
if (not na(pivot_high))
    resistance_level := high[pivot_length]
    last_pivot_high := high[pivot_length]

if (not na(pivot_low))
    support_level := low[pivot_length]
    last_pivot_low := low[pivot_length]

// Function to check if the current price is near a support or resistance level
is_near_resistance = (not na(resistance_level)) and (close >= resistance_level * (1 - support_resistance_distance / 100)) and (close <= resistance_level * (1 + support_resistance_distance / 100))
is_near_support = (not na(support_level)) and (close >= support_level * (1 - support_resistance_distance / 100)) and (close <= support_level * (1 + support_resistance_distance / 100))

// Cross conditions variables
long_cross = ta.crossover(close, support_level) and not na(support_level)
short_cross = ta.crossunder(close, resistance_level) and not na(resistance_level)

// Entry conditions
long_condition = is_near_support and long_cross  // Buy when crossing support from below
short_condition = is_near_resistance and short_cross  // Sell when crossing resistance from above

// Order execution
if (long_condition)
    strategy.entry("Long", strategy.long)

if (short_condition)
    strategy.entry("Short", strategy.short)

// Stop Loss and Take Profit
if (strategy.opentrades > 0)
    if (strategy.position_size > 0)  // For long position
        avg_price_long = strategy.position_avg_price
        long_stop_level = avg_price_long * (1 - stop_loss_pct)
        long_take_profit_level = avg_price_long * (1 + take_profit_pct)
        strategy.exit("Exit Long", from_entry="Long", stop=long_stop_level, limit=long_take_profit_level)

    if (strategy.position_size < 0)  // For short position
        avg_price_short = strategy.position_avg_price
        short_stop_level = avg_price_short * (1 + stop_loss_pct)
        short_take_profit_level = avg_price_short * (1 - take_profit_pct)
        strategy.exit("Exit Short", from_entry="Short", stop=short_stop_level, limit=short_take_profit_level)

// Plotting support and resistance levels on the chart
plot(support_level, title="Support", color=color.green, linewidth=2, style=plot.style_line)
plot(resistance_level, title="Resistance", color=color.red, linewidth=2, style=plot.style_line)

// Adding labels to show pivot values
if (long_condition and not na(support_level))
    label.new(bar_index, low[pivot_length], str.tostring(low[pivot_length]), style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small)

if (short_condition and not na(resistance_level))
    label.new(bar_index, high[pivot_length], str.tostring(high[pivot_length]), style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small)