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