La rupture de l'élan détermine la stratégie

Auteur:ChaoZhang est là., Date: 2023-11-02 14h39 et 22h
Les étiquettes:

img

Résumé

Cette stratégie identifie les stocks en hausse rapide et prend des positions longues lorsque le prix atteint de nouveaux sommets.

Principe

La stratégie repose principalement sur deux indicateurs:

  1. Rapide RSI: Il calcule la hausse et la baisse des 3 barres récentes pour juger de la dynamique des prix.

  2. Filtre du corps: il calcule la taille moyenne du corps des 20 dernières barres.

Lorsque le RSI rapide est inférieur à 10 et que le filtre du corps est valide, une position longue sera ouverte. Après cela, un profit fixe de 20% est défini. Lorsque le prix dépasse le prix d'ouverture * (1 + pourcentage de profit), la position sera fermée.

L'avantage de cette stratégie est qu'elle peut capturer les opportunités de rupture au début des tendances. Le RSI rapide juge les niveaux de survente et le filtre corporel évite les fausses ruptures.

Analyse des avantages

Les avantages de cette stratégie:

  1. L'indicateur RSI rapide identifie les niveaux de survente et augmente la précision d'entrée.

  2. Le filtre corporel évite les fausses éruptions causées par les fluctuations.

  3. Le pourcentage fixe de prise de bénéfices réalise des bénéfices stables et capte les tendances.

  4. La logique est simple et claire, facile à comprendre et à mettre en œuvre.

  5. Une structure de code élégante avec une grande extensibilité, facile à optimiser.

  6. Des rendements positifs stables et un taux de réussite élevé dans les backtests.

Analyse des risques

Quelques risques à noter:

  1. Aucun mécanisme de stop loss, risque d'augmentation des pertes.

  2. Des niveaux de prise de profit inappropriés peuvent conduire à une sortie prématurée ou trop profonde.

  3. Des pertes consécutives peuvent survenir sur des marchés instables.

  4. Les coûts de financement ne sont pas pris en compte, les rendements réels peuvent être inférieurs.

  5. Optimisation insuffisante des paramètres pour différents produits.

Directions d'optimisation

Certains aspects peuvent être optimisés:

  1. Ajouter un stop loss pour contrôler les pertes d'une seule transaction.

  2. Optimiser la dynamique et tirer profit pour suivre les tendances.

  3. Améliorez la logique de sortie pour améliorer la précision d'entrée.

  4. Ajouter un module de dimensionnement de position pour optimiser l'utilisation du capital.

  5. Ajouter un module d'optimisation de paramètres pour différents produits.

  6. Ajoutez des filtres pour éviter les pertes sur les marchés agités.

  7. Envisagez d'ajouter la gestion des coûts moyens.

Conclusion

En résumé, il s'agit d'une stratégie de suivi de tendance élégante et simple. Il utilise un RSI rapide pour identifier les niveaux de survente, un filtre corporel pour confirmer une rupture valide et un pourcentage fixe de profit pour générer des rendements réguliers. Bien qu'il existe des possibilités d'optimisation, la stratégie est réactive et adaptée aux marchés en évolution rapide, ce qui en fait une stratégie de trading très pratique.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")


Plus de