La stratégie consiste à calculer deux moyennes mobiles basées sur le volume des transactions et à déterminer la direction de la tendance actuelle en fonction de la direction de leur différence, puis à opérer en position longue ou courte. La stratégie est simple et pratique et permet de suivre efficacement les tendances du marché.
Calculer les lignes rapides et les lignes lentes. Les lignes rapides sont des moyennes mobiles quantitatives basées sur des cycles de lignes rapides définis par l’utilisateur, et les lignes lentes sont des moyennes mobiles quantitatives basées sur des cycles de lignes lentes.
Calculer la différence entre les deux lignes. La ligne rapide moins la ligne lente donnent la courbe différentielle.
Déterminez la direction de la tendance. Lorsque la ligne rapide traverse la ligne lente, faites plus pour un signal positif; lorsque la ligne rapide traverse la ligne lente, faites moins pour un signal négatif.
Émission de signaux de négociation. Émission de signaux de multiples lors d’une hausse; Émission de signaux de rupture lors d’une baisse.
Réglage des arrêts. Réglage de la position des arrêts avec un pourcentage de stop fixe défini par l’utilisateur ou un stop dynamique basé sur l’ATR.
Conditions de sortie: Si un stop loss ou un signal de revers est déclenché lors de la tenue d’une position, la position est levée.
L’utilisation d’indicateurs quantitatifs pour identifier les tendances est moins susceptible d’être induite en erreur par les faux percées.
Les lignes rapides et lentes sont combinées pour filtrer le bruit du marché et éviter les transactions fréquentes.
Les paramètres Stop Loss permettent de contrôler efficacement le risque de perte.
La logique de la stratégie est simple, claire et facile à comprendre.
Les paramètres peuvent être personnalisés pour répondre aux besoins de différentes variétés et périodes.
Une mauvaise configuration des paramètres peut entraîner une fréquence de transaction trop élevée ou une tendance manquée.
Le stop loss fixe peut être trop mécanique pour s’adapter aux changements du marché.
Les variations de la relation quantité-prix peuvent affecter l’efficacité de l’indicateur quantitatif.
Le risque 1 peut être obtenu en utilisant les paramètres d’optimisation pour trouver la meilleure combinaison.
Le risque 2 peut être remplacé par un stop fixe avec un stop ATR dynamique.
Le risque n°3 concerne l’impact de la variation des volumes sur la stratégie.
Tester différentes combinaisons de paramètres de ligne rapide et de ligne lente.
Essayez d’utiliser d’autres indicateurs de type prix, comme l’OBV, l’indice William, etc.
Augmentation des arrêts basés sur les fluctuations.
Évaluer l’efficacité de l’utilisation en combinaison avec d’autres indicateurs.
Évaluation de l’efficacité des différentes variétés commerciales.
La stratégie suit la tendance en utilisant une combinaison rapide et lente de la moyenne quantifiée, la logique de négociation est simple et claire et les paramètres peuvent être ajustés de manière optimale. Le paramètre de stop loss aide à contrôler le risque. L’efficacité de l’utilisation de la combinaison avec d’autres indicateurs peut ensuite être évaluée.
/*backtest
start: 2023-08-18 00:00:00
end: 2023-09-17 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("EVWMA 6HR", overlay=false, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
// Credit to QuantNomad for the main idea behind this code
/////////////// Time Frame ///////////////
_1 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// EVWMA /////////////
_2 = input(false, "════════ EVMA ═══════")
fast_sum_length = input(5, title = "Fast Sum Length", type = input.integer)
slow_sum_length = input(11, title = "Slow Sum Length", type = input.integer)
fast_vol_period = sum(volume, fast_sum_length)
slow_vol_period = sum(volume, slow_sum_length)
fast_evwma = 0.0
fast_evwma := ((fast_vol_period - volume) * nz(fast_evwma[1], close) + volume * close) / (fast_vol_period)
slow_evwma = 0.0
slow_evwma := ((slow_vol_period - volume) * nz(slow_evwma[1], close) + volume * close) / (slow_vol_period)
diff = fast_evwma - slow_evwma
/////////////// Strategy ///////////////
long = fast_evwma > slow_evwma
short = fast_evwma < slow_evwma
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false, "════════ Stop Loss ═══════")
SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inp = input(9.0, title='Fixed Stop Loss %') / 100
atrLkb = input(20, minval=1, title='ATR Stop Period')
atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1 = atr(atrLkb)
longStop1 = 0.0
longStop1 := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1]
shortStop1 = 0.0
shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1]
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
_5 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")
/////////////// Execution ///////////////
if testPeriod()
if useLongs
strategy.entry("L", strategy.long, when=long)
strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > -1)
if useShorts
strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > -1)
strategy.entry("S", strategy.short, when=short)
if not useShorts
strategy.close("L", when=short)
if not useLongs
strategy.close("S", when=long)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
p1 = plot(diff, title = "Delta", color = long ? color.lime : short ? color.red : na, transp=0)
p2 = plot(0, color = color.white)
fill(p1, p2, color = long ? color.lime : short ? color.red : na, transp=60)