Stratégie d'identification de la rupture de Momentum


Date de création: 2023-11-02 14:39:22 Dernière modification: 2023-11-02 14:39:22
Copier: 0 Nombre de clics: 554
1
Suivre
1617
Abonnés

Stratégie d’identification de la rupture de Momentum

Aperçu

Cette stratégie consiste à identifier les actions qui augmentent rapidement et à faire des placements supplémentaires lorsqu’elles atteignent de nouveaux sommets, en utilisant des arrêts de pourcentage fixes. Cette stratégie est une stratégie de suivi de tendance.

Le principe

La stratégie est basée sur deux indicateurs principaux:

  1. Le RSI rapide: mesure la dynamique des prix en calculant les variations à la baisse des 3 dernières lignes K. Lorsque le RSI rapide est inférieur à 10, le titre est considéré comme étant en surbaisse.

  2. Filtrage des entités principales: calculer la taille moyenne des entités des 20 dernières lignes K, considérée comme une percée efficace lorsque l’entité de prix est 2,5 fois plus grande que la moyenne.

Lorsque le RSI rapide est inférieur à 10 et que le filtrage de l’entité est actif, un plus d’ouverture est effectué. Ensuite, un point d’arrêt fixe de 20% est défini lorsque le prix dépasse le prix d’ouverture.*Le taux de placement est le même que le taux de placement de l’option.

L’avantage de cette stratégie est qu’elle permet de capturer les occasions de rupture au début de la tendance, de juger les zones inférieures par le RSI rapide, de filtrer les entités pour éviter les fausses ruptures. En utilisant un blocage fixe pour verrouiller chaque gain, il est possible de maintenir la tendance.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. L’utilisation du RSI rapide pour déterminer la zone de dépassement de la zone inférieure peut améliorer l’exactitude de l’entrée.

  2. Le mécanisme de filtrage principal permet d’éviter les fausses percées causées par les secousses.

  3. En adoptant une méthode de stop-loss à pourcentage fixe, vous pouvez maintenir vos bénéfices et suivre la tendance.

  4. La logique de la stratégie est simple, claire et facile à comprendre.

  5. La structure du code est élégante et extensible, ce qui facilite l’optimisation stratégique.

  6. Au cours de la période de référence, la stratégie a obtenu des gains positifs stables et un taux de réussite élevé.

Analyse des risques

Cette stratégie comporte également des risques à prendre en compte:

  1. Il n’y a pas de mécanisme de stop-loss dans la stratégie et il y a un risque d’augmentation des pertes individuelles.

  2. Une mauvaise configuration du point d’arrêt fixe peut entraîner un arrêt prématuré ou un arrêt trop profond.

  3. La situation est instable et les petites pertes sont fréquentes.

  4. Les bénéfices en temps réel sont plus faibles que les bénéfices en temps réel, sans tenir compte des coûts de financement et de liquidation.

  5. Les paramètres de la stratégie sont insuffisamment optimisés et doivent être ajustés selon les variétés.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. L’augmentation des mécanismes de prévention des pertes permet de contrôler les pertes individuelles.

  2. Optimiser les points d’arrêt pour suivre les tendances de manière dynamique.

  3. Optimiser les critères de réussite et accroître la précision de l’admission.

  4. Ajout d’un module de gestion des positions et optimisation de l’occupation des positions.

  5. Ajouter un module d’optimisation des paramètres de variété pour optimiser automatiquement les paramètres de différentes variétés.

  6. Les conditions de filtrage sont renforcées pour éviter les pertes en cas de forte volatilité.

  7. Envisagez d’ajouter un module de gestion du coût moyen de la position.

Résumer

Cette stratégie est une stratégie de suivi de tendance très simple et élégante dans l’ensemble. Elle utilise le RSI rapide pour juger les hauts et les bas, le filtrage des entités pour déterminer les percées efficaces et la prise de points d’arrêt fixes pour obtenir des gains stables. Bien qu’il y ait de la place pour l’optimisation, la stratégie est agile et adaptée pour capturer les scénarios de changements rapides de comportement.

Code source de la stratégie
/*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")