Gleitende Durchschnitt-Crossover-Strategie


Erstellungsdatum: 2023-10-24 16:39:40 zuletzt geändert: 2023-10-24 16:39:40
Kopie: 0 Klicks: 671
1
konzentrieren Sie sich auf
1617
Anhänger

Gleitende Durchschnitt-Crossover-Strategie

Überblick

Diese Strategie basiert auf dem Prinzip der Kreuzung von Moving Averages und ist eine typische Trend-Tracking-Strategie, wenn die kurzfristige Durchschnittslinie von unten durch die langfristige Durchschnittslinie geht und wenn die kurzfristige Durchschnittslinie von oben durch die langfristige Durchschnittslinie geht.

Strategieprinzip

Die Strategie basiert hauptsächlich auf der Berechnung von zwei einfachen gleitenden Durchschnitten für die kurzfristige und die langfristige Periode und der Beurteilung der Richtung der Trends anhand ihrer Kreuzung.

Konkret berechnet die Strategie zunächst den kurzfristigen Mittelwert xMA und den langfristigen Mittelwert, wobei die kurzfristige Mittelwertlänge Len und die langfristige Mittelwertlänge 2 ist.*Len。

Die Strategie beurteilt dann, ob die kurzfristige Durchschnittslinie die langfristige Durchschnittslinie überschreitet, und wenn dies der Fall ist, erzeugt dies ein Mehrfachsignal. Die Strategie beurteilt, ob die kurzfristige Durchschnittslinie die langfristige Durchschnittslinie überschreitet, und wenn dies der Fall ist, erzeugt dies ein Fehlsignal.

Nach dem Empfang des Signals zum Überschreiten der Positionen wird eine Position zum Marktpreis eröffnet, wenn derzeit keine Positionen gehalten werden. Nach dem Empfang des Signals zum Abnehmen der Positionen wird eine Position zum Marktpreis eröffnet, wenn keine Positionen gehalten werden.

Zusätzlich gibt es eine Stop-Loss-Stop-Punkt-Strategie. Der Stop-Loss-Preis ist der Einstiegspreis - Stop-Loss-Prozentsatz.*Eintrittspreis, Stop-Loss-Prozent als Eintrittspreis + Stop-Loss-Prozent*Eintrittspreis; nach der Börsenabwicklung wird der Stop-Loss-Preis als Eintrittspreis + Stop-Loss-Prozentsatz festgelegt*Eintrittspreis, Stop-Loss-Prozent als Eintritts-Stop-Loss*Eintrittspreise

Die Strategie liefert eine visuelle Kurve mit einer Gleichlinie, um Trends zu beurteilen.

Strategische Vorteile

  • Die Idee ist einfach, klar, leicht zu verstehen und geeignet für Anfänger;

  • Die Beurteilung der Trendrichtung anhand von Moving Averages ermöglicht eine effiziente Beobachtung der Markttrends.

  • Ein Stop-Loss-Stop-Punkt, um das Risiko zu kontrollieren.

  • Die visuelle Darstellung einer Gleichlaufkurve spiegelt die Trendänderungen intuitiv wider.

Strategisches Risiko

  • Die Durchschnittslinie ist nachlässig und kann das Risiko verursachen, die besten Einstiegsmomente zu verpassen.

  • Unzumutbare Stop-Loss-Einstellungen können zu zu lockeren oder zu strengen Stop-Losses führen.

  • Die Wahrscheinlichkeit, dass die Erfolgslinie falsche Signale erzeugt, wenn die Aktienkurse stark schwanken;

  • Parameteroptimierungen nur auf Basis der mittleren Periodenparameter können zu einer Überpassung führen.

Diese Risiken können durch eine angemessene Lockerung des Stop-Losses, die Optimierung der Kombination von Parametern für die lineare Periode und die Filterung anderer Indikatoren verringert werden.

Richtung der Strategieoptimierung

  • Hinzufügen von Filter für andere Indikatoren, wie MACD, KDJ, etc., um zu vermeiden, dass ein einheitliches Linienfehler falsche Signale erzeugt;

  • Multi-Kombination-Optimierung der kurzfristigen und langfristigen Durchschnittslänge, um die optimale Kombination der Parameter zu finden;

  • Verschiedene Stop-Loss-Strategien, wie z. B. Wort-Stop, Bewegungs-Stop, wurden getestet.

  • Ein zusätzliches Modul zur Positionsverwaltung, um die Kapitalnutzung zu optimieren.

Zusammenfassen

Die Gesamtkonzeption dieser Strategie ist klar und prägnant, basierend auf der Gleichlinien-Kreuzung wird die Trendrichtung beurteilt, Trends können wirksam verfolgt werden, und das Risiko ist kontrollierbar und eignet sich für Anfänger. Allerdings kann es zu Fehlsignalen kommen, wenn man sich nur auf die Gleichlinien stützt. Der Optimierungsraum ist groß und kann in vielerlei Hinsicht optimiert werden.

Strategiequellcode
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')