
La stratégie est un système de suivi des tendances basé sur le volume des transactions et les variations de prix, qui permet de prédire l’orientation du marché en calculant l’indicateur de volatilité du volume des transactions netes (NVO). La stratégie combine plusieurs types de moyennes mobiles (EMA, WMA, SMA, HMA) pour juger de la tendance du marché en comparant la relation de position de l’indicateur de volatilité avec sa ligne de superposition EMA, et pour effectuer des transactions au moment opportun.
Le cœur de la stratégie est de juger de l’humeur du marché en calculant les fluctuations quotidiennes du volume net de transactions. Les étapes de calcul sont les suivantes:
La génération du signal de transaction est basée sur les règles suivantes:
Suggestions de contrôle des risques :
Optimisation du mécanisme de confirmation des signaux:
Optimisation de la gestion des risques :
Optimisation des paramètres:
La stratégie est principalement caractérisée par la combinaison de plusieurs indicateurs techniques et offre des options de configuration de paramètres flexibles. Bien qu’il existe un certain risque, la stratégie est susceptible de générer des rendements stables dans les transactions réelles grâce à un contrôle raisonnable du risque et à une optimisation continue. Il est recommandé aux traders de faire un retour d’expérience suffisant avant de l’utiliser sur le terrain et d’ajuster les paramètres de manière appropriée en fonction des conditions spécifiques du marché.
/*backtest
start: 2024-02-25 00:00:00
end: 2025-02-22 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("EMA-Based Net Volume Oscillator with Trend Change", shorttitle="NVO Trend Change", overlay=false, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Input parameters
maType = input.string("WMA", "Moving Average Type", options=["WMA", "EMA", "SMA", "HMA"])
maLength = input.int(21, "MA Length", minval=1)
emaOverlayLength = input.int(9, "EMA Overlay Length", minval=1)
oscillatorMultiplier = input.float(1.0, "Oscillator Multiplier", minval=0.1, step=0.1)
showHistogram = input.bool(true, "Show Histogram")
stopLossPerc = input.float(1.0, "Stop Loss (%)", tooltip="Set 999 to disable")
takeProfitPerc = input.float(2.0, "Take Profit (%)", tooltip="Set 999 to disable")
// Calculate Net Volume Oscillator
priceRange = high - low
multiplier = priceRange > 0 ? (close - low) / priceRange : 0.5
var float effectiveUpVol = 0.0
var float effectiveDownVol = 0.0
if close > close[1]
effectiveUpVol := volume * multiplier
effectiveDownVol := volume * (1 - multiplier)
else if close < close[1]
effectiveUpVol := volume * multiplier
effectiveDownVol := volume * (1 - multiplier)
else
effectiveUpVol := 0.0
effectiveDownVol := 0.0
netVolume = effectiveUpVol - effectiveDownVol
dailyNetOscillator = volume > 0 ? (netVolume / volume) * 100 : 0
// Apply selected Moving Average
var float oscillator = na
if maType == "WMA"
oscillator := ta.wma(dailyNetOscillator, maLength) * oscillatorMultiplier
else if maType == "EMA"
oscillator := ta.ema(dailyNetOscillator, maLength) * oscillatorMultiplier
else if maType == "SMA"
oscillator := ta.sma(dailyNetOscillator, maLength) * oscillatorMultiplier
else if maType == "HMA"
oscillator := ta.hma(dailyNetOscillator, maLength) * oscillatorMultiplier
// EMA Overlay
emaOverlay = ta.ema(oscillator, emaOverlayLength)
// Rate of Change (ROC) for Oscillator
roc = ta.roc(oscillator, 1) // 1-period rate of change
// Trading logic
longCondition = oscillator > emaOverlay
shortCondition = oscillator < emaOverlay
// Exit conditions
exitLong = oscillator < emaOverlay and strategy.position_size > 0
exitShort = oscillator > emaOverlay and strategy.position_size < 0
// Execute trades
if longCondition and strategy.position_size <= 0
strategy.entry("Long", strategy.long)
if exitLong
strategy.close("Long")
if shortCondition and strategy.position_size >= 0
strategy.entry("Short", strategy.short)
if exitShort
strategy.close("Short")
// Stop Loss and Take Profit
stopLossLong = stopLossPerc != 999 ? strategy.position_avg_price * (1 - stopLossPerc/100) : na
takeProfitLong = takeProfitPerc != 999 ? strategy.position_avg_price * (1 + takeProfitPerc/100) : na
stopLossShort = stopLossPerc != 999 ? strategy.position_avg_price * (1 + stopLossPerc/100) : na
takeProfitShort = takeProfitPerc != 999 ? strategy.position_avg_price * (1 - takeProfitPerc/100) : na
if (not na(stopLossLong) and not na(takeProfitLong) and strategy.position_size > 0)
strategy.exit("Long SL/TP", "Long", stop=stopLossLong, limit=takeProfitLong)
if (not na(stopLossShort) and not na(takeProfitShort) and strategy.position_size < 0)
strategy.exit("Short SL/TP", "Short", stop=stopLossShort, limit=takeProfitShort)
// Plotting
plot(oscillator, "Net Volume Oscillator", color.blue)
plot(emaOverlay, "EMA Overlay", color.orange)
hline(0, "Zero Line", color.gray)
// Histogram with Trend Change Visualization
var color histogramColor = na
if oscillator > 0
histogramColor := roc >= 0 ? color.new(color.green, 70) : color.new(color.lime, 70) // Green for bullish, light green for weakening
else if oscillator < 0
histogramColor := roc >= 0 ? color.new(color.red, 70) : color.new(color.maroon, 70) // Red for bearish, light red for weakening
plot(showHistogram ? oscillator : na, style=plot.style_histogram, color=histogramColor, title="Histogram")