
Il s’agit d’une stratégie de suivi de tendance basée sur les moyennes mobiles pondérées en volume (VWMA) et les moyennes mobiles indicielles (EMA), combinant l’analyse des angles de prix et un mécanisme de suivi dynamique des arrêts de perte. La stratégie consiste principalement à déterminer le moment d’entrée en jeu en surveillant l’intersection des VWMA avec les moyennes mobiles rapides, tout en combinant les conditions angulaires du mouvement des prix, et à gérer le risque en utilisant le suivi des arrêts en pourcentage.
La logique fondamentale de la stratégie repose sur les éléments clés suivants :
Il s’agit d’une stratégie de suivi de tendance bien structurée qui, grâce à l’analyse d’angle et à la combinaison de multiples moyennes mobiles, permet de mieux performer dans les principales tendances. Bien qu’il existe un certain retard et des problèmes de sensibilité aux paramètres, la stratégie peut être améliorée par une orientation d’optimisation recommandée.
/*backtest
start: 2024-02-18 00:00:00
end: 2024-10-16 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("PVSRA Trailing Strategy with Angle Condition (40-50 degrees)", overlay=true)
// === INPUTS ===
priceData = input.source(close, title="Price Data")
maLength = input.int(25, title="Moving Average Length", minval=2)
useBias = input.bool(false, title="Long/Short just above/below 200 EMA")
useTrailing = input.bool(true, title="Use Trailing Stop")
trailPerc = input.float(1.0, title="Trailing Stop Percentage", minval=0.1)
anglePeriod = input.int(14, title="Period for Angle Calculation", minval=1)
// === CÁLCULOS ===
maValue = ta.vwma(priceData, maLength)
maLong = ta.ema(high, 50)
maShort = ta.ema(low, 50)
maFast = ta.vwma(close, 8)
bias = ta.ema(close, 200)
longBias = useBias ? close > bias : true
shortBias = useBias ? close < bias : true
// === CÁLCULO DO ÂNGULO DA MÉDIA MÓVEL DE 50 ===
ma50 = ta.ema(close, 50)
angle = math.atan((ma50 - ma50[anglePeriod]) / anglePeriod) * (180 / math.pi) // Converte radianos para graus
// === CONDIÇÃO DE ÂNGULO ===
validAngleL = angle >= 45
validAngleS = angle <= 45
// === PLOTS ===
plot(maValue, color=color.orange, title="Moving Average")
plot(maFast, color=color.green, title="Fast MA")
plot(ma50, color=color.blue, title="50 EMA")
plotshape(series=(strategy.position_size > 0) ? maValue : na,
color=color.red, style=shape.circle, location=location.absolute,
title="Long Stop")
plotshape(series=(strategy.position_size < 0) ? maValue : na,
color=color.red, style=shape.cross, location=location.absolute,
title="Short Stop")
// === CONDIÇÕES DE ENTRADA ===
enterLong = close > maValue and ta.crossover(maFast, maValue) and close > maLong and longBias and validAngleL
enterShort = close < maValue and ta.crossunder(maFast, maValue) and close < maShort and shortBias and validAngleS
// === CONDIÇÕES DE SAÍDA ===
exitLong = ta.crossunder(maFast, maValue) and strategy.position_size > 0
exitShort = ta.crossover(maFast, maValue) and strategy.position_size < 0
// === EXECUÇÃO DA ESTRATÉGIA ===
if (enterLong)
strategy.entry("EL", strategy.long)
if (enterShort)
strategy.entry("ES", strategy.short)
if (exitLong or exitShort)
strategy.close_all()
// === TRAILING STOP ===
if (useTrailing and strategy.position_size > 0)
trailPrice = close * (1 - trailPerc / 100)
strategy.exit("Trailing Long", from_entry="EL", stop=trailPrice)
if (useTrailing and strategy.position_size < 0)
trailPrice = close * (1 + trailPerc / 100)
strategy.exit("Trailing Short", from_entry="ES", stop=trailPrice)