Stratégie de retracement croisé SMA avec stop loss suiveur en position dynamique

SMA MA RRR TP SL
Date de création: 2025-02-21 13:51:50 Dernière modification: 2025-02-21 13:51:50
Copier: 0 Nombre de clics: 338
2
Suivre
319
Abonnés

Stratégie de retracement croisé SMA avec stop loss suiveur en position dynamique Stratégie de retracement croisé SMA avec stop loss suiveur en position dynamique

Aperçu

Cette stratégie est un système de trading automatisé basé sur la gestion des positions croisées et dynamiques. Elle utilise les moyennes mobiles simples à 50 et 200 jours (SMA) comme indicateur principal, combinées à des ajustements de position dynamiques et à un mécanisme de suivi des arrêts de perte, pour rechercher des opportunités de négociation dans les tendances du marché.

Principe de stratégie

La stratégie est basée sur les principes suivants:

  1. Les signaux d’entrée sont basés sur la croisée des prix avec la moyenne des 50 jours, tout en se référant à la position relative de la moyenne des 50 jours et de la moyenne des 200 jours pour juger de la tendance générale
  2. Un signal de multiplication est déclenché lorsque le prix franchit la ligne médiane; un signal de rupture est déclenché au contraire.
  3. La gestion des positions utilise un mécanisme d’ajustement dynamique qui augmente le nombre de positions détenues lorsque le bénéfice du compte dépasse 4000
  4. Le stop loss utilise un mécanisme de suivi du stop loss, qui modifie dynamiquement la position du stop loss au fur et à mesure que le profit augmente.
  5. Le rapport risque/bénéfice est défini à 1:2.5, assurant que les bénéfices attendus de chaque transaction sont supérieurs au risque

Avantages stratégiques

  1. La logique de négociation est claire et précise, et les indicateurs techniques et le comportement des prix permettent de déterminer le moment d’entrée.
  2. La gestion dynamique des positions permet d’augmenter la taille des transactions et d’améliorer l’efficacité de l’utilisation des fonds en cas de profit.
  3. Le suivi des arrêts de perte permet de verrouiller efficacement les bénéfices et d’éviter les retraits importants.
  4. Le filtrage des heures de négociation est mis en place et fonctionne uniquement pendant les heures de négociation principales, afin d’éviter les risques de basse liquidité
  5. Avoir un mécanisme de contrôle du risque bien établi, y compris des objectifs de stop-loss, de profit et de gestion des positions

Risque stratégique

  1. Les signaux de fausse rupture peuvent être fréquemment déclenchés dans les marchés en crise, entraînant des arrêts de pertes continus.
  2. La gestion dynamique des positions peut entraîner des pertes plus importantes en cas de changement soudain du marché
  3. Les systèmes qui s’appuient sur la linéarité peuvent être retardés dans les marchés en évolution rapide.
  4. Le rapport risque/bénéfice fixe pourrait nous faire manquer des opportunités potentielles de grandes tendances
  5. Les restrictions de temps de négociation pourraient nous faire rater des opportunités importantes.

Orientation de l’optimisation de la stratégie

  1. Il est possible d’introduire des indicateurs de volatilité pour ajuster dynamiquement les paramètres dans différents environnements de marché.
  2. Envisagez d’ajouter des indicateurs de sentiment de marché pour améliorer la précision des signaux d’entrée
  3. Optimisation des paramètres de suivi des arrêts de perte afin de mieux les adapter aux différents environnements de marché
  4. Augmentation de l’analyse des cycles de temps multiples et amélioration de la stabilité des systèmes de négociation
  5. L’introduction d’analyses de trafic pour améliorer la fiabilité du signal

Résumer

La stratégie est construite en un système de négociation relativement complet par la combinaison d’un système homogène, une gestion de position dynamique et un mécanisme de suivi des arrêts. L’avantage de la stratégie est d’avoir une logique de négociation claire et un mécanisme de contrôle des risques parfait, mais il y a aussi des endroits où il faut optimiser.

Code source de la stratégie
/*backtest
start: 2024-02-22 00:00:00
end: 2025-02-19 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("15m - Rebound 50SMA with Dynamic Lots & Trailing Stop, RRR 2:1, Date Filter (Closed Bars Only)", 
     overlay=true, 
     initial_capital=50000, 
     default_qty_type=strategy.fixed, 
     default_qty_value=1, 
     pyramiding=0, 
     calc_on_order_fills=true)

// ===== INPUTS =====
sma50Period  = input.int(50, "50 SMA Period", minval=1)
sma200Period = input.int(200, "200 SMA Period", minval=1)

// ===== CALCULATE SMAs =====
sma50  = ta.sma(close, sma50Period)
sma200 = ta.sma(close, sma200Period)

// ===== PLOT SMAs =====
plot(sma50, color=color.red, title="50 SMA")
plot(sma200, color=color.blue, title="200 SMA")

// ===== DEFINE TRADING SESSIONS =====
// Trading is allowed 15 minutes after market open:
//   - New York: 09:45–16:00 (America/New_York)
//   - London:   08:15–16:00 (Europe/London)
nySession     = not na(time("15", "0945-1600", "America/New_York"))
londonSession = not na(time("15", "0815-1600", "Europe/London"))
inSession     = nySession or londonSession

// ===== DEFINE DATE RANGE =====
// Only allow orders on or after January 1, 2024.
// (We include seconds in the timestamp for proper parsing.)
startDate   = timestamp("UTC", 2024, 1, 1, 0, 0, 0)
inDateRange = time >= startDate

// ===== DEFINE ENTRY CONDITIONS =====
// ----- LONG ENTRY CONDITION -----
// A long entry is triggered when:
//   - The previous candle closed below the 50 SMA and the current candle closes above it,
//   - And the 50 SMA is above the 200 SMA.
longCondition = (close[1] < sma50[1]) and (close > sma50) and (sma50 > sma200)

// ----- SHORT ENTRY CONDITION -----
// A short entry is triggered when:
//   - The previous candle closed above the 50 SMA and the current candle closes below it,
//   - And the 50 SMA is below the 200 SMA.
shortCondition = (close[1] > sma50[1]) and (close < sma50) and (sma50 < sma200)

// ===== DEBUG PLOTS =====
plotshape(longCondition and barstate.isconfirmed, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.tiny)
plotshape(shortCondition and barstate.isconfirmed, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.tiny)

// ===== VARIABLES FOR STOP LOSS MANAGEMENT =====
// For long positions.
var float initialLongStop = na   // Set at entry: low of the rebound candle.
var float trailStopLong   = na   // Updated trailing stop for long.
// For short positions.
var float initialShortStop = na  // Set at entry: high of the rebound candle.
var float trailStopShort   = na  // Updated trailing stop for short.

// ===== DYNAMIC LOT SIZE =====
// If current profit (strategy.equity - 50000) exceeds 4000, lot size becomes 3; otherwise, 2.
lotSize = (strategy.equity - 50000 > 4000) ? 3 : 2

// ===== ENTRY LOGIC (EXECUTED ON CONFIRMED BARS) =====
if barstate.isconfirmed and inSession and inDateRange and longCondition and strategy.position_size <= 0
    initialLongStop := low
    trailStopLong   := initialLongStop
    if strategy.position_size < 0
        strategy.close("Short", comment="Close Short before Long")
    // Submit a market order entry (no offset).
    strategy.entry("Long", strategy.long, qty=lotSize, comment="Enter Long")
    
if barstate.isconfirmed and inSession and inDateRange and shortCondition and strategy.position_size >= 0
    initialShortStop := high
    trailStopShort   := initialShortStop
    if strategy.position_size > 0
        strategy.close("Long", comment="Close Long before Short")
    // Submit a market order entry (no offset).
    strategy.entry("Short", strategy.short, qty=lotSize, comment="Enter Short")
    
// ===== TRAILING STOP LOGIC & EXIT ORDERS (ON CLOSED BARS) =====

if barstate.isconfirmed and strategy.position_size > 0
    // For Long Positions:
    floatingProfitLong = (close - strategy.position_avg_price) / syminfo.mintick
    newTrailLong = trailStopLong  // Default: no change.
    if floatingProfitLong >= 20 and floatingProfitLong < 30
        newTrailLong := initialLongStop + 5 * syminfo.mintick
    else if floatingProfitLong >= 31 and floatingProfitLong < 40
        newTrailLong := initialLongStop + 10 * syminfo.mintick
    else if floatingProfitLong >= 41 and floatingProfitLong < 50
        newTrailLong := initialLongStop + 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopLong := math.max(trailStopLong, newTrailLong)
    
    longRisk = strategy.position_avg_price - trailStopLong
    tpLong   = strategy.position_avg_price + 2.5 * longRisk
    strategy.exit("Exit Long", from_entry="Long", stop=trailStopLong, limit=tpLong)

if barstate.isconfirmed and strategy.position_size < 0
    // For Short Positions:
    floatingProfitShort = (strategy.position_avg_price - close) / syminfo.mintick
    newTrailShort = trailStopShort  // Default: no change.
    if floatingProfitShort >= 20 and floatingProfitShort < 30
        newTrailShort := initialShortStop - 5 * syminfo.mintick
    else if floatingProfitShort >= 31 and floatingProfitShort < 40
        newTrailShort := initialShortStop - 10 * syminfo.mintick
    else if floatingProfitShort >= 41 and floatingProfitShort < 50
        newTrailShort := initialShortStop - 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopShort := math.min(trailStopShort, newTrailShort)
    
    shortRisk = trailStopShort - strategy.position_avg_price
    tpShort = strategy.position_avg_price - 2.5 * shortRisk
    strategy.exit("Exit Short", from_entry="Short", stop=trailStopShort, limit=tpShort)