
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.
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.
Die Strategie nutzt eine Kombination aus drei Indikatoren, CCI, MACD und ATR, um die Trends, Dynamik und Volatilität des Marktes zu beurteilen.
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.
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.
Die meisten Parameter der Strategie haben nicht viel Spielraum, um ihre Wirksamkeit zu begrenzen, was eine weitere Verbesserung der Strategie einschränkt.
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.
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.
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.
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.
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.
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.
/*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)