Stratégie de rupture des barres positives en pourcentage

Auteur:ChaoZhang est là., Date: 2024-01-08 10:32:25 Le projet de loi est en cours d'adoption.
Les étiquettes:

img

Résumé

La stratégie de rupture en pourcentage de barres positives est une stratégie de trading quantitative basée sur les jugements d'action des prix. Elle calcule le pourcentage de bougies de tendance haussière dans une période spécifiée pour déterminer si le marché est actuellement dans un état de tendance haussière. Lorsque le pourcentage de bougies de tendance haussière est supérieur à la limite supérieure définie par l'utilisateur, la stratégie juge que le marché est actuellement en tendance haussière et va long. Lorsque le pourcentage est inférieur à la limite inférieure définie par l'utilisateur, la stratégie juge que le marché est actuellement en tendance haussière et va court.

La logique de la stratégie

L'indicateur de base de cette stratégie est le pourcentage de bougies à tendance haussière. Une bougie à tendance haussière s'ouvre en dessous du bas précédent et se ferme au-dessus de l'ouverture, indiquant que le prix a augmenté au cours de cette période. La stratégie compte le nombre de bougies à tendance haussière dans la période de rétrospective définie par l'utilisateur et calcule le pourcentage de bougies à tendance haussière parmi toutes les bougies. Lorsque le pourcentage est supérieur à la limite supérieure, la stratégie juge que le marché est en tendance haussière persistante et va long. Lorsque le pourcentage est inférieur à la limite inférieure, la stratégie juge que le marché est en tendance haussière et court. Les ordres de stop loss et take profit sont définis selon la méthode de stop loss définie par l'utilisateur.

Par exemple, si l'utilisateur définit la période de rétrospective à 20, limite supérieure à 70, limite inférieure à 30, la stratégie retrace les 20 dernières bougies. Si 16 d'entre elles sont des bougies à tendance haussière, le pourcentage sera de 16/20=80%. Puisque 80% est supérieur à la limite supérieure de 70%, la stratégie exécutera un ordre long. Si parmi les 20 dernières bougies, seuls 5 sont des bougies à tendance haussière, alors le pourcentage sera de 5/20=25%. Ceci est inférieur à la limite inférieure de 30%, la stratégie exécutera un ordre court.

Analyse des avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. La logique de la stratégie est simple et intuitive, facile à comprendre;
  2. Elle repose sur un seul indicateur, ce qui réduit le risque de surmontage;
  3. Les utilisateurs peuvent personnaliser les paramètres pour différents produits;
  4. Il dispose de fonctions de stop loss/take profit intégrées pour éviter les pertes énormes;
  5. Permettre un commerce inverse sans quitter les positions en premier, un suivi plus rapide des tendances.

Analyse des risques

Les principaux risques de cette stratégie sont les suivants:

  1. Le recours à un seul indicateur peut générer de faux signaux;
  2. Les paramètres sont sujets à un surmonté, les performances en direct peuvent varier considérablement;
  3. Le stop loss peut être affecté par des fluctuations volatiles des prix, entraînant des pertes;
  4. Les échanges inversés peuvent amplifier les pertes;
  5. Les performances dépendent fortement du symbole, nécessitant des tests séparés.

Les risques peuvent être réduits par:

  1. Ajout de filtres pour éviter les faux signaux;
  2. Optimisation de la logique de stop loss pour limiter les pertes;
  3. Évaluer et contrôler la taille maximale des pertes;
  4. Test sur différents symboles séparément.

Directions d'optimisation

Les principales orientations pour optimiser cette stratégie sont les suivantes:

  1. Ajout d'indicateurs auxiliaires comme le volume pour éviter les faux signaux;
  2. Optimiser les méthodes de stop loss, telles que le stop loss de suivi;
  3. Ajout de filtres d'entrée comme la rupture des bandes de Bollinger;
  4. Test des paramètres optimaux des bougies à tendance haussière pour différents symboles;
  5. Évaluer le recours maximal et contrôler la taille des pertes.

Conclusion

La stratégie de rupture de pourcentage des barres positives a une logique simple et directe pour capturer les tendances en jugeant statistiquement la persistance des tendances haussières / baissières. Elle est facile à comprendre et conviviale, adaptée aux débutants.


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-04 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ZenAndTheArtOfTrading 
// © TweakerID

// Based on the calculations by ZenAndTheArtOfTrading, I added stop loss, take profit and reverse line codes.
// The Positive Bars % calculates the number of green (positive) bars, relative to a lookback period, defined 
// by the user. If the percentage is low, it means that there was a bigger number of red candles in the 
// lookback period. The strategy goes long when the percentage is high and short when it's low, although
// this logic can be reversed with positive results on different time frames.

//@version=4
strategy("Positive Bars % Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

lookback = input(title="Lookback", type=input.integer, defval=13)
upperLimit = input(title="Upper Limit", type=input.integer, defval=70)
lowerLimit = input(title="Lower Limit", type=input.integer, defval=30)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(10, step=.1, title="ATR Multiple")
i_TPRRR = input(1.6, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR

// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//Calculations
positiveBars = 0
for i = (lookback - 1) to 0
    if close[i] > open[i]
        positiveBars := positiveBars + 1
positiveBarsPercent = (positiveBars / lookback) * 100

BUY=positiveBarsPercent >= upperLimit
SELL=positiveBarsPercent <= lowerLimit

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)

Plus de