Strategie zum Überqueren gleitender Durchschnittswerte in mehreren Zeitrahmen


Erstellungsdatum: 2024-02-19 15:41:29 zuletzt geändert: 2024-02-19 15:41:29
Kopie: 0 Klicks: 654
1
konzentrieren Sie sich auf
1617
Anhänger

Strategie zum Überqueren gleitender Durchschnittswerte in mehreren Zeitrahmen

Überblick

Die Multi Timeframe Moving Average Crossover Strategy ist eine algorithmische Handelsstrategie, die die Kreuzung von Signalen zwischen Moving Averages in verschiedenen Zeiträumen nutzt, um die Richtung des Trends zu bestimmen. Die Strategie nutzt eine Kombination aus Trend-, Dynamik- und Schwankungsindikatoren, um die Strategie zu verlässlichen.

Strategieprinzip

Die Strategie ermittelt die Richtung des Markttrends durch die Berechnung der CCI-Indikatoren für verschiedene Perioden, dann in Verbindung mit den MACD-Indikatoren, um nach Goldfork-Death-Fork-Signalen zu suchen, und schließlich mit den ATR-Indikatoren, um die Stop-Loss-Position einzustellen, um einen niedrigen Kauf zu erzielen.

Konkret wird zunächst der 20-Zyklus-CCI-Indikator berechnet, um den Markttrend aufgrund seiner positiven und negativen Auswirkungen zu beurteilen. Dann wird die schnelle und langsame Durchschnittslinie des MACD-Indikators berechnet, um zu beurteilen, ob ein Kauf- und Verkaufssignal erzeugt wird.

Strategische Vorteile

  1. Mehrindikator-Kombinationen zur Verbesserung der Signalgenauigkeit

Die Strategie nutzt eine Kombination aus drei Indikatoren, CCI, MACD und ATR, um die Trends, Dynamik und Volatilität des Marktes zu beurteilen.

  1. Mehrfache Zeitrahmenanalyse, um den Markt zu erfassen

Der CCI nutzt die verschiedenen Zyklen, um die Gesamtbewegung des Marktes zu beurteilen, und der MACD mit hohen Zyklen sucht nach niedrigen Kauf- und Verkaufsknoten, um die größeren Trendrhythmen des Marktes zu erfassen.

  1. ATR-Verlustverfolgung und Risikokontrolle

Mit Hilfe des Stop-Loss-Generators des ATR-Indikators können angemessene Stop-Loss-Positionen auf Basis der Marktfluktuation eingestellt werden, während die Stop-Loss-Funktion die Risiken der Strategie gut kontrollieren kann.

Strategisches Risiko

  1. Es gibt nur einen begrenzten Platz für Parameteroptimierungen.

Die meisten Parameter der Strategie haben nicht viel Spielraum, um ihre Wirksamkeit zu begrenzen, was eine weitere Verbesserung der Strategie einschränkt.

  1. Mehrfaches Portfolio erhöht die Rechenlast

Da die Strategie mit mehreren Indikatoren kombiniert wird, erhöht sich die Berechnungslast der Strategie in gewissem Maße. Bei Hochfrequenz-Trading kann es zu Karton-Problemen kommen.

  1. Häufige Signale, begrenzte Risikokontrolle

Strategie-Signale können häufiger sein, während die Risikokontrolle hauptsächlich auf die Verlustverfolgung der ATR-Indikatoren beruht. Die Risikokontrolle für Extremsituationen ist nicht vollständig.

Strategieoptimierung

  1. Parameteroptimierung mit Hilfe von Machine-Learning-Algorithmen

Man kann einige Hyperparameter-Optimierungs-Algorithmen aus maschinellem Lernen, wie Bayesian-Optimierung, genetische Algorithmen usw. ausprobieren, um die Parameter-Anpassung intelligenter und effizienter zu machen.

  1. Erhöhung der Funktionalitätsindikatoren und Erhöhung der Strategieflexibilität

Einige andere funktionelle Indikatoren, wie z. B. Volatilitäts-, Quantitativ- und Emotionsindikatoren, können in Betracht gezogen werden, um die Anpassungsfähigkeit und Robustheit der Strategie zu verbessern.

  1. Stärkung der Risikomanagement-Module und Risikokontrollstrategien

Es ist möglich, ein wissenschaftlicheres Stop-Loss-Prinzip zu entwerfen oder ein bestimmtes Positionskontroll- oder Geldmanagementmodul hinzuzufügen, um das Risiko von Extremsituationen besser abzuwehren und die Stabilität der Strategie zu gewährleisten.

Zusammenfassen

Die Strategie berücksichtigt die drei Dimensionen Trend, Dynamik und Schwankungen. Sie hat die Vorteile einer hohen Signalgenauigkeit, des Erfassens des Markttaktes und der effektiven Risikokontrolle. Natürlich gibt es auch einen bestimmten Parameter-Optimierungsraum, eine begrenzte Berechnungslast und Risikokontrolle. Durch die Einführung von mehr Indikatoren, die Verwendung von besseren Parameter-Optimierungsmitteln und die Entwicklung eines stärkeren Risikokontrollmoduls kann die Strategie weiter verbessert und optimiert werden.

Strategiequellcode
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal

trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)