Handelsstrategie für Multi-MA-Limitorder

Schriftsteller:ChaoZhang, Datum: 22.09.2023
Tags:

Übersicht

Dies ist eine Handelsstrategie, die Limitorders auf der Grundlage mehrerer gleitender Durchschnitte setzt. Es wird verschiedene Anzahl von langen oder kurzen Limitordern setzen, wenn der Preis durch verschiedene MA-Level bricht, um eine pyramidenförmige Multi-Position zu bilden. Wenn der Preis erneut durch den MA bricht, werden umgekehrte Limitordern geöffnet. Wenn Positionen gehalten werden, werden die Positionen durch umgekehrte Marktordern geschlossen, wenn der Preis den mittleren MA bricht.

Strategie Logik

Die Strategie verwendet gleitende Durchschnitte, um die Trendrichtung zu bestimmen. Insbesondere bestimmt sie die Anzahl der langen Limit-Orders, basierend darauf, ob der Preis die 3 nach oben gerichteten MA-Linien durchbricht. Und sie bestimmt die Anzahl der kurzen Limit-Orders, basierend darauf, ob der Preis die 3 nach unten gerichteten MA-Linien durchbricht.

Der mittlere MA wird verwendet, um den Durchbruch bestehender Positionen zu beurteilen und Schließsignale zu generieren.

Die gesamte Strategie kombiniert Pyramiden-Style-Öffnung mit Durchbruch-Style-Schließung, um die Handelslogik zu bilden.

Analyse der Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Mit MAs werden Trends ermittelt, einfach und intuitiv zu bedienen.

  2. Pyramidenförmige Öffnungen können zu einem besseren Durchschnittspreis im frühen Trendstadium führen.

  3. Der mittlere MA-Stop-Loss kann Verluste rechtzeitig stoppen und Risiken kontrollieren.

  4. Grenzbefehle, Vermeidung von Ausrutschungen.

  5. Anpassungsfähige Parameter passen sich an verschiedene Produkte an.

  6. Eine klare Struktur, leicht zu verstehen und zu erweitern.

Risikoanalyse

Zu den Risiken der Strategie gehören:

  1. Eine Verzögerung der MA kann zu Fehleinschätzungen führen.

  2. Fehlgeschlagene Limit-Orders können die Einstiegschancen verpassen.

  3. Mittlerer MA-Stop-Loss kann zu grob sein, um Durchbrüche zu beurteilen.

  4. Die falsche Einstellung der Parameter kann zu zu großen Positionen führen.

  5. Eine unzureichende Rückprüfung kann zu einer Überanpassung führen.

  6. Keine Berücksichtigung der Transaktionskosten.

Die Lösungen sind:

  1. Hinzufügen anderer Indikatoren zur Bestätigung, Optimierung von Parametern.

  2. Setzen Sie den Ablauf, passen Sie die Grenzpreise an.

  3. Hinzufügen von Profit Taking oder Logik bei mittlerem MA Stop Loss.

  4. Optimieren Sie die Parameter, bewerten Sie die Risiko-Rendite-Verhältnisse.

  5. Erweitern Sie den Backtest-Zeitraum, Multi-Markt-Backtests.

  6. Hinzu kommen Transaktionskosten und Schlupflogik.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Optimieren von Parametern für mehr Produkte mithilfe von Methoden des maschinellen Lernens.

  2. Hinzufügen anderer Indikatoren zur Bestätigung, z. B. MACD, KDJ usw.

  3. Fügen Sie die Profit-taking-Logik an der mittleren MA-Linie hinzu.

  4. Dynamische Anpassung der Positionsgrößen und Stop-Loss-Niveaus.

  5. Optimierung der Grenzpreise für bessere Einstiegskosten, z. B. aufgrund von Volatilität.

  6. Kosten steuern, um zu vermeiden, dass Trends übertrieben werden.

  7. Testparameter für verschiedene Produkte zur Erstellung von Parameterpools.

Schlussfolgerung

Diese Strategie eröffnet pyramidenförmige Positionen mit Limit-Orders, um bessere durchschnittliche Kosten zu erzielen. Sie verwendet den mittleren MA für Stop-Loss, um Risiken zu kontrollieren. Die Strategiestruktur ist einfach und klar, leicht zu verstehen und zu erweitern. Aber sie kann durch die Einführung anderer Indikatoren, die Optimierung von Parametern, die Verbesserung der Limit-Order-Logik usw. verbessert werden, um sie robuster zu machen. Insgesamt bietet diese Strategie eine einfache und praktische Idee des Limit-Order-Handels, die einen gewissen Referenzwert hat.


/*backtest
start: 2022-09-15 00:00:00
end: 2023-09-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Variables
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close
longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close
shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close
shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
lots = 0.0
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Mehr