Stratégie personnalisée de cassure vers le haut


Date de création: 2024-01-08 10:32:25 Dernière modification: 2024-01-08 10:32:25
Copier: 0 Nombre de clics: 629
1
Suivre
1617
Abonnés

Stratégie personnalisée de cassure vers le haut

Aperçu

La stratégie de rupture à la hausse est une stratégie de négociation quantitative basée sur le jugement de la tendance des prix. La stratégie détermine si le marché est actuellement en hausse continue en calculant la proportion de la ligne K positive au cours d’un cycle spécifié.

Principe de stratégie

La stratégie utilise le nombre de lignes positives de K comme proportion de toutes les lignes K au cours d’une période transitoire spécifiée par l’utilisateur de la statistique. Si le nombre est supérieur à la limite supérieure, le jugement est en hausse continue et le cours est plus élevé.

Exemple: le nombre de cycles de configuration de l’utilisateur est de 20, la limite supérieure est de 70, la limite inférieure est de 30. La stratégie recule les 20 lignes K les plus récentes, si 16 d’entre elles sont des lignes K positives, le rapport est de 1620 = 80%.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. La stratégie est simple, intuitive et compréhensible.
  2. Il n’y a qu’un seul indicateur nécessaire pour réduire le risque d’une optimisation excessive.
  3. Les utilisateurs peuvent personnaliser les paramètres pour les différentes variétés.
  4. La fonction anti-destruction intégrée permet de prévenir les pertes massives;
  5. Il est possible d’effectuer des opérations inverses directement, sans attendre que les positions soient ouvertes, et de suivre les événements plus rapidement.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. L’utilisation d’un seul indicateur est susceptible de générer des signaux erronés.
  2. Les paramètres de l’indicateur sont faciles à sur-optimiser, et les résultats peuvent varier considérablement.
  3. La rupture du stop loss peut entraîner des pertes en cas de forte volatilité;
  4. La fonction de rétrogradation peut augmenter les pertes.
  5. L’efficacité est fortement liée à la variété et doit être testée séparément.

Pour réduire les risques, il est possible d’optimiser les choses de la manière suivante:

  1. Les conditions de filtrage ont été améliorées pour éviter les signaux erronés.
  2. Optimiser les stratégies de coupe des pertes et réduire les pertes ponctuelles;
  3. évaluer et contrôler le montant des pertes individuelles;
  4. Les résultats des tests sur les différentes variétés.

Direction d’optimisation

Cette stratégie peut être optimisée dans les directions suivantes:

  1. Augmentation des indicateurs de jugement auxiliaires, tels que la rationalité des prix, afin d’éviter les faux signaux
  2. Optimisation des modes d’arrêt des pertes, en prenant en compte l’arrêt des mouvements, l’arrêt des oscillations, etc.
  3. Augmentation des conditions de filtrage de l’ouverture de la position, par exemple en cas de rupture de la ligne de Brin
  4. Test de l’adaptation de différents paramètres de la ligne K positive à différentes variétés
  5. Évaluation des retraits maximaux et contrôle des pertes individuelles

Résumer

L’idée générale de la stratégie de rupture à la hausse personnalisée est claire et simple. Elle permet de déterminer les tendances à la hausse ou à la baisse en utilisant des indicateurs simples. La stratégie est facile à comprendre, conviviale et adaptée aux débutants.

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