
Die Dual Moving Average Crossover Trend Strategy ist eine Trend-Tracking-Strategie, bei der ein Kauf- und Verkaufssignal aus einer Kreuzung von schnellen und langsamen Moving Averages gebildet wird. Die Strategie kombiniert mehrere Indikatoren wie MACD, RSI und andere, um die Richtung des Trends zu bestimmen.
Die Strategie basiert auf folgenden Kennzahlen:
Schnelle und langsame Moving Averages: Überschneidung der schnellen Linie als Kaufsignal und unterhalb der schnellen Linie als Verkaufssignal.
MACD: Mehrkopfsignal, wenn die MACD-Linie über der Signal-Linie liegt und der MACD-Tiefstwert steigt.
RSI: RSI über 50 ist ein Mehrkopfsignal, unter 50 ein Leerkopfsignal.
Der Messoszillator (AO): Wenn der oberste Teil der AO die 0-Achse als Kaufsignal durchläuft, wird der untere Teil der AO als Verkaufssignal durchläuft.
Drei bewegliche Durchschnittswerte auf Tageslinie-Ebene: Die Tageslinie-Ebene ist ein Kaufsignal, das auf einem kurzfristigen beweglichen Durchschnitt und einem längerfristigen beweglichen Durchschnitt platziert wird.
Die Strategie kombiniert mehrere Zeiträume und mehrere Indikatoren, um die Logik zu kaufen und zu verkaufen. Wenn mehrere Indikatoren gleichzeitig ein Kaufsignal erzeugen, erzeugen Sie einen Kaufbefehl, wenn mehrere Indikatoren gleichzeitig ein Verkaufssignal erzeugen, um den Trend zu verfolgen.
Die Strategie hat folgende Vorteile:
Mehrindikator-Kombinationen zur Vermeidung von Fehlsignalen und zur Verbesserung der Genauigkeit der Beurteilung.
In Kombination mit mehreren Zeiträumen kann man die Richtung von Trends auf einer größeren Ebene erkennen.
Die Parameter sind optimiert, Parameters tuning, mit einer besseren Rendite.
Um Risiken zu kontrollieren und Verluste zu verhindern, wird der mobile Stop eingesetzt.
Automatische Trends werden ohne menschliche Eingriffe durchgeführt, wodurch die Betriebskosten gesenkt werden.
Die Strategie birgt auch Risiken:
In einem wackligen Umfeld kann es zu mehr ungültigen Handelssignalen kommen. Die ungültigen Signale können durch Optimierung der Parameter reduziert werden.
Ein plötzliches Ereignis kann zu einem schnellen Rückzug führen. Ein mobiler Stopp kann eingerichtet werden, um den Verlust zu kontrollieren.
Die Regeln für die Bestimmung von Mehrraumsignalen sind kompliziert, und die Optimierung der Parameter erfordert eine große Menge an historischen Daten.
Die falsche Einstellung des Tracking-Stopps kann zu einem vorzeitigen Stopp führen. Es müssen wiederholte Tests durchgeführt werden, um die optimalen Parameter zu bestimmen.
Die Strategie kann in folgenden Richtungen optimiert werden:
Testen Sie mehr Kombinationen von Indikatoren, um stabilere und präzisere Handelssignale zu finden.
Optimierung der Kennzahlenparameter und Verringerung der Anzahl ungültiger Transaktionen. Automatische Optimierung der Parameter durch Maschinelles Lernen und genetische Algorithmen.
Modellintegrationstechniken werden hinzugefügt, um mehr unabhängige strategische Modellbeurteilungen zu integrieren. Stabilität wird erhöht.
Eintritt in der Hochfrequenz und Ausstieg in der Niedrigfrequenz.
Zunahme der Quantifizierung der Windmodule, strenge Kontrolle der Einmal-Stopp-Verlust-Rate, maximale Rücknahme-Rate usw.
Die Schnelldurchschnitts-Doppel-Indikator-Kreuz-Mehrraum-Strategie erzeugt Handelssignale durch die Kreuzung von schnellen und langsamen Moving Averages und kombiniert mehrere Indikatoren wie MACD, RSI, um die Trendrichtung zu bestimmen und die Trendverfolgung zu automatisieren. Die Strategie hat viel Optimierungsraum und kann durch die Einführung von mehr Indikatoren, Anpassung der Parameter und Modellintegration verbessert werden.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy('SteffVans', shorttitle='SteffVans strategy', overlay=true, process_orders_on_close = true)
// Input settings
macd_fast_length = input(12)
macd_slow_length = input(26)
macd_signal_length = input(9)
// Calculate MACD values
[macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length)
mg = ta.lowest(signal_line, 30) >= -0
// RSI
ma(source, length, type) =>
switch type
"SMA" => ta.sma(source, length)
"Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
rsiLengthInput = input.int(14, minval=1)
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
RSI = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
// AO
AO = ta.sma((high + low) / 2, 5) - ta.sma((high + low) / 2, 34)
crossaosell = AO < AO[1] and AO[1] < AO[2] and AO[2] > AO[3] and ta.lowest(low,3)
// Uptrend sma
len1 = input.int(5, minval=1)
len2 = input.int(10, minval=1)
len3 = input.int(20, minval=1)
src = input(close)
out1 = ta.sma(src, len1)
out2 = ta.sma(src, len2)
out3 = ta.sma(src, len3)
// Timeframe
macdl60 = request.security(syminfo.tickerid, "60", signal_line,lookahead = barmerge.lookahead_on)
ao = request.security(syminfo.tickerid, "60", AO,lookahead = barmerge.lookahead_on)
rsi = request.security(syminfo.tickerid, "60", RSI,lookahead = barmerge.lookahead_on)
good = request.security(syminfo.tickerid, "60", mg,lookahead = barmerge.lookahead_on)
bad = request.security(syminfo.tickerid, "60", crossaosell,lookahead = barmerge.lookahead_on)
ma1 = request.security(syminfo.tickerid, "D", out1,lookahead = barmerge.lookahead_on)
ma2 = request.security(syminfo.tickerid, "D", out2, lookahead = barmerge.lookahead_on)
ma3 = request.security(syminfo.tickerid, "D", out3, lookahead = barmerge.lookahead_on)
// Kriteria BUY and SELL
uptrend1 = request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) > ma1 and ma1 > ma3 and ma2 > ma3
uptrend2 = ta.lowest(ma1,12) > ta.lowest(ma3,12) and ta.lowest(ma2,12) > ta.lowest(ma3,12)
// Triger BUY and SELL
cross1 = ao > ao[1] and ao[1] < ao[2] and ao > 0 and good and rsi >= 60 and uptrend1
cross2 = ao > 0 and ao[1] < 0 and good and rsi >=50 and uptrend1
cross3 = ao > 0 and ao[1] < 0 and not good and uptrend2 and uptrend1
cross4 = ao > ao[1] and ao[1] > ao[2] and ao[2] < ao[3] and ao[3] < ao[4] and not good and uptrend2 and uptrend1
s1 = ao < ao[1] and ao[1] < ao[2] and ao[2] < ao[3] and ao > 0 and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
s2 = ao < 0 and ao < ao[2] and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
// Variabel Buy dan Sell
buySignal = false
sellSignal = false
// Syarat masuk Buy
buyCondition = cross1 or cross2 or cross3 or cross4
if buyCondition
buySignal := true
// Syarat masuk Sell
sellCondition = s1 or s2
if sellCondition
sellSignal := true
// Reset sinyal jika ada sinyal berulang
if buySignal and sellSignal
sellSignal := false
if sellSignal and buySignal
buySignal := false
// Logika perdagangan
if buySignal
strategy.entry("Buy", strategy.long, comment = "BUY")
if sellSignal
strategy.close("Buy")
plotshape(cross1,title = "Stefkuy1", style = shape.labelup, location = location.belowbar, color = color.green,text = "1", textcolor = color.white,size = size.small)
plotshape(cross2,title = "Stefkuy2", style = shape.labelup, location = location.belowbar, color = color.green, text = "2", textcolor= color.white, size = size.small)
plotshape(cross3,title = "StefVan1", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "3", textcolor= color.white,size = size.small)
plotshape(cross4,title = "StefVan2", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "4", textcolor= color.white,size = size.small)