Die Strategie berechnet die aktuelle Trendrichtung durch die Berechnung von zwei auf dem Handelsvolumen basierenden Moving Averages und beurteilt die Richtung ihrer Differenz, um dann eine Long- oder Short-Position zu ergreifen. Die Strategie ist einfach zu bedienen und kann die Markttrends effektiv verfolgen.
Berechnung von Schnell- und Langzeilen. Schnelllinie ist ein quantitativer Moving Average auf Basis von benutzerdefinierten Schnelllinie-Perioden, Langzeile ist ein quantitativer Moving Average auf Basis von Langzeilen-Perioden.
Berechnen Sie die Differenz zwischen den beiden Linien. Die schnelle Linie minus die langsame Linie ergibt die Differenzkurve.
Beurteilen Sie die Richtung des Trends. Wenn die Schnelllinie die langsame Linie überschreitet, machen Sie mehr als ein bullish Signal. Wenn die Schnelllinie die langsame Linie überschreitet, machen Sie eine Beseitigung als ein bearish Signal.
Ausstrahlung von Handelssignalen. Mehrfaches Signal bei Aufwärtsbewegungen; Leerzeichen bei Abwärtsbewegungen.
Einstellung des Stop-Losses. Der Stop-Loss wird durch einen benutzerdefinierten festen Stop-Loss-Prozentsatz oder einen ATR-basierten dynamischen Stop-Loss eingestellt.
Ausstiegsbedingungen: Wenn ein Stop-Loss ausgelöst wird oder ein Umkehrsignal auftritt, wird die Position aus dem Spiel gelöst.
Trends werden durch quantitative Indikatoren erkannt, die nicht leicht von False Breaks ablenken lassen.
Die Kurz- und Langzeit-Linien kombinieren Filter für Marktgeräusche und verhindern häufige Transaktionen.
Die Stop-Loss-Einstellungen sind eine effektive Steuerung des Verlustrisikos.
Die Strategie ist einfach, klar und verständlich.
Anpassbare Parameter für verschiedene Sorten und Zeiträume.
Die falsche Einstellung der Parameter kann zu einer zu hohen Handelsfrequenz oder zu einem verpassten Trend führen.
Der Fixed Stop könnte zu mechanisch sein, um sich an Marktveränderungen anzupassen.
Veränderungen in der Preis-Leistungs-Relation können die Effektivität der Quantifizierung beeinflussen.
Risiko 1 kann durch Optimierungsparameter zur optimalen Kombination gefunden werden.
Risiko 2 kann mit dynamischen ATR-Stopps als Alternative zu festen Stopps verwendet werden.
Risiken 3: Die Auswirkungen von Umsatzveränderungen auf die Strategie.
Verschiedene Kombinationen von schnellen und langsamen Parametern werden getestet.
Versuchen Sie es mit anderen Preis-Leistungs-Indikatoren, wie OBV, William-Indikator usw.
Erhöhung des Stop-Losses auf Basis der Volatilität.
Beurteilung der Wirksamkeit in Kombination mit anderen Indikatoren.
Bewertung der Effektivität der verschiedenen Handelsarten.
Die Strategie verfolgt Trends durch eine Kombination von Quantifizierung der Mittelwert, die schnelle und langsame Linie, die Handelslogik ist einfach und klar, die Parameter können optimiert werden. Die Stop-Loss-Einstellung hilft, das Risiko zu kontrollieren. Die Wirksamkeit der Verwendung mit anderen Indikatoren kann nachträglich weiter bewertet werden.
/*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)