Strategie für die Verlagerung des gleitenden Durchschnitts

Schriftsteller:ChaoZhang, Datum: 23.10.2023
Tags:

img

Übersicht

Diese Strategie basiert auf dem Prinzip des gleitenden Durchschnitts. Es geht lang, wenn der kurzfristige gleitende Durchschnitt über den langfristigen gleitenden Durchschnitt von unten kreuzt, und geht kurz, wenn der kurzfristige gleitende Durchschnitt unter den langfristigen gleitenden Durchschnitt von oben kreuzt.

Strategie Logik

Die Strategie berechnet hauptsächlich die kurzfristigen und langfristigen einfachen gleitenden Durchschnitte und bestimmt die Trendrichtung anhand ihrer Überschneidung.

Insbesondere berechnet er zunächst den kurzfristigen gleitenden Durchschnitt xMA und den langfristigen gleitenden Durchschnitt, wobei der kurzfristige Zeitraum Len und der langfristige Zeitraum 2*Len ist.

Dann überprüft es, ob der kurzfristige MA über den langfristigen MA überschreitet, und erzeugt ein langes Signal, wenn der Crossover eintritt.

Nach Erhalt eines Long-Signals eröffnet er eine Long-Position zum Marktpreis, wenn keine Position vorliegt.

Darüber hinaus sind Stop-Loss- und Take-Profit-Punkte konfiguriert. Für lange Trades wird der Stop-Loss auf den Einstiegspreis - Stop-Loss-Prozent * Einstiegspreis und den Profit auf den Einstiegspreis + Take-Profit-Prozent * Einstiegspreis festgelegt. Für kurze Trades wird der Stop-Loss auf den Einstiegspreis + Stop-Loss-Prozent * Einstiegspreis und den Profit auf den Einstiegspreis - Take-Profit-Prozent * Einstiegspreis festgelegt.

Schließlich werden die gleitenden Durchschnitte für die Visualisierung gezeichnet, um bei der Trendbestimmung zu helfen.

Vorteile

  • Einfach und leicht verständlich, geeignet für Anfänger.

  • Kann Markttrends effektiv auf der Grundlage gleitender Durchschnittsquerschnitte verfolgen.

  • Die Risiken werden durch die Konfiguration von Stop-Loss und Take-Profit kontrolliert.

  • Die Visualisierung von gleitenden Durchschnitten spiegelt die Trendänderungen intuitiv wider.

Risiken

  • Gleitende Durchschnitte haben Verzögerungseffekte, die dazu führen können, dass die besten Einstiegspunkte verpasst werden.

  • Eine unsachgemäße Stop-Loss-Konfiguration kann dazu führen, dass die Stops zu breit oder zu eng sind.

  • Preisschwankungen können falsche Signale erzeugen.

  • Eine Optimierung ausschließlich auf der Grundlage der gleitenden Durchschnittsperioden kann zu einer Überanpassung führen.

Diese Risiken können durch die Verwendung von lockeren Stopps, die Optimierung von Kombinationen von gleitenden Durchschnittsperioden, das Hinzufügen von Filterindikatoren usw. verringert werden.

Optimierungsrichtlinien

  • Hinzufügen anderer Indikatoren wie MACD, KDJ zum Filtern, um falsche Signale zu vermeiden.

  • Optimieren Sie Kombinationen von kurzen und langen gleitenden Durchschnittsperioden, um optimale Parameter zu finden.

  • Verschiedene Stop-Loss-/Take-Profit-Strategien wie Trailing-Stops testen.

  • Zusätzliche Positionsgröße zur Optimierung der Kapitalverwertung.

Zusammenfassung

Die Strategie hat eine klare und einfache Logik, kann Trends effektiv auf der Grundlage von gleitenden Durchschnitts-Kreuzungen verfolgen und hat kontrollierbare Risiken. Sie ist für Anfänger geeignet, um daraus zu lernen.


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

Mehr