Momentum-Indikator – Entscheidungsstrategie für den Handel


Erstellungsdatum: 2023-12-15 15:31:52 zuletzt geändert: 2023-12-15 15:31:52
Kopie: 0 Klicks: 596
1
konzentrieren Sie sich auf
1621
Anhänger

Momentum-Indikator – Entscheidungsstrategie für den Handel

Überblick

Die Dynamometer-Entscheidung ist eine Trendverfolgungsstrategie. Die Strategie nutzt den Doppelindex-Moving Average, um Dynamometer zu erstellen, die dann in Verbindung mit dem Preisveränderungs-Rate-Indikator verwendet werden, um ein Handelssignal zu erzeugen. Wenn die Dynamometer steigen, erzeugen Sie mehrere Signale; wenn die Dynamometer fallen, erzeugen Sie eine Leerzeichen.

Strategieprinzip

Die Strategie misst die Dynamik anhand des Decision Point-Oszillators. Zuerst wird die tägliche Veränderungsrate der Preise berechnet, anschließend wird die Preisänderungsrate anhand von 31- und 20-Tage-Doppel-Indikatoren ausgeglichen und schließlich mit einem 9-Tage-Gleichlaufdurchschnitt ein Handelssignal gesendet.

Die Strategie führt auch einen Preisänderungsindikator ein, um falsche Signale bei der Bilanzierung des Marktes zu vermeiden. Konkret wird die prozentuale Veränderung der Preise in den letzten 30 Tagen berechnet, um anhand ihres gleitenden Durchschnitts zu beurteilen, ob der Markt aktiv ist. Nur wenn der Markt aktiv ist, wird ein Handelssignal ausgegeben.

Analyse der Stärken

Die Strategie kombiniert Dynamometer und Preisänderungsraten, um mittelfristige Trends zu erkennen und häufige Trades in turbulenten Zeiten zu vermeiden. Sie reduziert die Wahrscheinlichkeit von Fehltrades erheblich im Vergleich zu Trendstrategien wie einfachen Moving Averages. Darüber hinaus wird ein Stop-Loss für Risikokontrolle eingerichtet, um den Einzelschaden rechtzeitig und effektiv zu kontrollieren.

Risikoanalyse

Die Strategie handelt hauptsächlich auf mittleren und langen Trendlinien und kann kurzfristige Preisschwankungen nicht erfassen. In extremen Situationen kann der Stop-Loss-Punkt überschritten werden, was zu großen Verlusten führt. Darüber hinaus wirkt sich eine falsche Parameterstellung auf die Strategie aus.

Um Risiken zu vermeiden, kann der Stop-Loss-Punkt angepasst werden, um den Stop-Loss-Wert zu erweitern. Es kann auch vorübergehend geschlossen werden, um die Wahrscheinlichkeit zu vermeiden, dass der Stop-Loss durchbrochen wird, wenn die Situation dramatisch ist.

Optimierungsrichtung

Die Strategie kann in folgenden Richtungen optimiert werden:

  1. Das Hinzufügen anderer Filterindikatoren, wie z. B. der Volatilitätsindikatoren, verhindert den Handel in Zeiten starker Marktschwankungen.

  2. Durch das Hinzufügen von maschinellen Lernmodellen, die die Richtung und Stärke von Trends bestimmen, kann die Genauigkeit der Signale verbessert werden.

  3. Versuchen Sie mit verschiedenen dynamischen Indikatoren, z. B. relativ starken Indikatoren, stochastischen Oszillatoren usw., um die Kauf- und Verkaufszeit zu optimieren.

  4. Die Festplatte wird in Kombination mit den Merkmalen der jüngsten Veranstaltung und der dynamischen Anpassung der Parameter in der Suche nach der optimalen Kombination von Parametern betrieben.

Zusammenfassen

Die Dynamik-Indikator-Entscheidung Handelsstrategie ist insgesamt eine solide mittelfristige Trend-Tracking-Strategie. Es kombiniert den binären Index Moving-Average-Indikator für die Menge und die Preisänderungsrate, Trends zu identifizieren und Fehler zu vermeiden. Gleichzeitig, Setzen Sie Stop-Loss-Punkte, um Risiken zu kontrollieren.

Strategiequellcode
/*backtest
start: 2022-12-08 00:00:00
end: 2023-11-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Decision BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
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

/////////////// Decision ///////////////
src = input(ohlc4, title="Source")
length1 = input(31, title="First Smoothing")
length2 = input(20, title="Second Smoothing")
siglength = input(9, title="Signal Smoothing")
fr = input(true, title="Fill Region")

calc_csf(src, length) => 
	sm = 2.0 / length
	csf = 0.0
	csf := (src - nz(csf[1])) * sm + nz(csf[1])
	csf
i = (src / nz(src[1], src)) * 100
pmol2 = calc_csf(i - 100, length1)
pmol = calc_csf(10 * pmol2, length2)
pmols = ema(pmol, siglength)
d = pmol - pmols
duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL")

hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = d > 0 and isMoving() 
short = d < 0 and isMoving() 

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])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[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

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal")
mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO")
fill(duml, sigl, color.green, transp=20, title="PosFill")
fill(duml, mdl, color.red, transp=20, title="NegFill")
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)