
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.
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.
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.
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.
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.
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.
/*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')