
Die Strategie ist speziell für die OKX-Signal-Roboter-Plattform entwickelt und verfügt über die Advanced-Funktionalität der dynamischen Positionsanpassung und des teilweisen Positionsniedrigens. Die Strategie identifiziert hauptsächlich die Durchbrüche in den Preisbereichen in Verbindung mit den Abweichungen der RSI-Indikatoren und filtert die Markttrends durch mehrere Periodische Moving Averages, um so mehrere Gelegenheiten in Abwärtstrends zu finden und die richtigen Handelszeiten zu erlangen.
Die Strategie ist einzigartig durch ihre dynamische Positionsmanagement-System, das die Transaktionsgröße dynamisch an die Differenz zwischen dem aktuellen Preis und dem durchschnittlichen Preis für die Position anpassen kann, so dass die Strategie Positionen erhöhen kann, wenn die Preise in eine günstige Richtung weitergehen, während die Positionen schrittweise reduziert werden, wenn die Preise sich umkehren, wodurch die Kapital-Effizienz und die Risikobereitschaft optimiert werden.
Die Strategie basiert auf drei zentralen Komponenten:
PreisbereichsprüfungStrategie: Die Berechnung von Höchst- und Tiefstpreisen innerhalb eines bestimmten Zeitraums (die Einstellung des boxLength-Parameters) zur Bestimmung der Preisspanne. Diese Preisniveaus werden als obere und untere Grenzlinien auf der Grafik abgebildet und bieten einen visuellen Preisreferenzbereich für den Handel.
RSI-Entfernung von der UntersuchungDie Strategie berechnet die Marktdynamik anhand des Relative Strength/Weakness-Index (RSI) und erkennt Abweichungen zwischen dem Preis und dem RSI. Bei einem neuen Tief und einem höheren Tief entsteht ein bullish Abweichung. Bei einem neuen Hoch und einem niedrigeren Tief entsteht ein bullish Abweichung.
Trendanalyse für bewegliche DurchschnitteDie Strategie berechnet mehrere Arten von Moving Averages (MA20, MA50, MA100 und MA200) auf einem benutzerdefinierten Zeitrahmen, um Markttrends zu ermitteln, indem sie die Anordnung und den Preis dieser Mittelwerte in Bezug auf die Mittelwerte analysiert. Die Strategie löst mehrere Signale aus, nur wenn sie in einem Abwärtstrend ist, um sicherzustellen, dass der Handel mit der Gesamtmarktumgebung übereinstimmt.
Die Transaktionslogik lautet wie folgt:
Mehrdimensionale BestätigungsmechanismenIn Kombination mit einem Preis-Bereich-Breakout, einem RSI-Abweichsignal und einem Trendfilter für Moving Averages entsteht ein mehrdimensionales Transaktionsbestätigungssystem, das die Zuverlässigkeit und Genauigkeit der Handelssignale erheblich verbessert.
Dynamische PositionsverwaltungStrategie: Die Strategie passt die Positionsgröße dynamisch an die Marktlage und die Preisentwicklung an, anstatt eine feste Positionsverteilung zu verwenden. Dies ermöglicht der Strategie, das Gewinnpotenzial in günstigen Marktbedingungen zu maximieren und gleichzeitig das Risiko unter ungünstigen Bedingungen zu kontrollieren. Formelmath.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1), 100), minEnterPercent)Stellen Sie sicher, dass Positionsanpassungen sowohl flexibel als auch begrenzt sind.
Anpassung an die MarktbedingungenDie Strategie ist in der Lage, sich an unterschiedliche Marktumgebungen anzupassen, indem sie die Kreuzung und Anordnung von Moving Averages analysiert und nur dann handelt, wenn die technischen Formen mit den Gesamttrends übereinstimmen.
Genaue Ein- und AusstiegspunkteAbweichung von Signalen plus Preis-Bereich-Bruch bietet genaue Ein- und Ausgangspunkte und reduziert die Möglichkeit von Falschsignalen. Rückblick-Parameter (leftLookback und rightLookback) verbessern die Genauigkeit der Erkennung von Extremepunkten.
Visualisierte RückmeldungStrategie: Preisspanne, Moving Averages und Handelssignal-Tags werden in Diagrammen dargestellt, um intuitive visuelle Rückmeldungen zu liefern, die es Händlern erleichtern, ihre Handelsentscheidungen zu verstehen und zu überprüfen.
Flexible ParameterkonfigurationEine Vielzahl anpassbarer Parameter ermöglicht es der Strategie, sich an verschiedene Märkte und Handelsstile anzupassen, wie z. B. die Länge des RSI, die Preispausen-Perioden und die Abweichungs-Rücklauf-Perioden.
Falsche DurchbruchgefahrDer Preis-Bereich-Bruch kann manchmal kurz sein und nicht der Beginn eines tatsächlichen Trends sein. Dies kann zu unnötigen Transaktionen führen und zu Verlusten führen. Der Weg, das Risiko zu verringern, besteht darin, Bestätigungsfaktoren wie die Verlängerung des Rücklaufzyklus oder die Erhöhung der Bestätigung des Umsatzes zu erhöhen.
ÜberhändlerrisikenEs wird empfohlen, angemessene Mindest-Anpassungs-Thresholds (minEnterPercent und minExitPercent) festzulegen, um zu vermeiden, dass geringe Preisschwankungen zu häufigen Transaktionen führen.
Gefahr der DurchschnittszeitverzögerungEs ist möglich, dieses Risiko zu verringern, indem die Art der verwendeten Durchschnittskurve angepasst wird (z. B. von SMA zu EMA) oder die Durchschnittskurve-Periode angepasst wird.
ParameterempfindlichkeitDie Strategie ist von mehreren Parametern abhängig, z. B. RSI-Schwellen, Durchschnittszyklen usw. Kleine Änderungen dieser Parameter können die Strategieleistung erheblich beeinflussen. Es wird empfohlen, durch Rückprüfung verschiedener Parameterkombinationen nach robusten Einstellungen zu suchen und die Parameter regelmäßig neu zu optimieren, um sich den veränderten Marktbedingungen anzupassen.
Abhängigkeit vom BinnenmarktDie Strategie kann unter bestimmten Marktbedingungen gut und unter anderen Bedingungen schlecht funktionieren. Es wird empfohlen, die Strategie unter verschiedenen Marktbedingungen und in verschiedenen Zeitrahmen zu testen und zu erwägen, einen Marktzustandfilter hinzuzufügen, um den Handel unter unangemessenen Marktbedingungen auszusetzen.
Bestätigung zur LautstärkeerhöhungDie derzeitige Strategie beruht auf den Preisen und dem RSI, um Handelsentscheidungen zu treffen. Durch die Erhöhung der Transaktionsvolumenanalyse kann die Wirksamkeit von Preisabschnitten verifiziert werden, um falsche Durchbrüche zu vermeiden, bei denen die Transaktionsmenge nicht ausreicht. Die konkrete Umsetzung kann durch Überprüfung erfolgen, ob die Transaktionsmenge zum Zeitpunkt des Durchbruchs höher ist als die durchschnittliche Transaktionsmenge der vorherigen Zyklen.
Einführung eines Mechanismus zur Anpassung der FluktuationsrateIn Zeiten hoher Volatilität: Signalfilter hinzufügen oder die Positionsgrößenformel anpassen, um das Risiko von Falschsignalen zu verringern und die maximale Risikogrenze zu kontrollieren. Der ATR-Indikator kann zur Quantifizierung der Volatilität verwendet werden und die Handelsparameter dynamisch anpassen.
Hinzufügen von Gewinn-Verlust-FilterDas ist möglich, indem man ATR-basierte dynamische Stop-Loss- und Stop-Stop-Levels einrichtet.
Einführung von Multi-Time-Frame AnalysenDie Signalqualität kann durch die Hinzufügung von Trendbestätigungen auf höheren Zeitfenstern verbessert werden. Zum Beispiel wird ein Handel nur ausgeführt, wenn der Trend der Japaner Linie mit dem Trend des aktuellen Handelszeitfensters übereinstimmt.
Verbesserte dynamische PositionsalgorithmenEs kann überlegen werden, ob es sich um komplexere Algorithmen handelt, die sich anpassungsbereit auf der Grundlage von Marktvolatilität und aktuellen Verlustsituationen anpassen, oder die Einführung von Risikoprenzen, um sicherzustellen, dass einzelne Transaktionen den gesamten Portfolio nicht übermäßig beeinflussen.
Hinzufügen automatischer OptimierungsparameterDie Strategie wird in der Lage sein, sich besser an veränderte Marktbedingungen anzupassen. Dies kann durch Feedback-Frameworks oder Machine Learning-Algorithmen erreicht werden.
Die Dynamic Price Range and RSI Offset Trading Strategy ist ein hochwertiges, quantitatives Trading-System, das mehrere Methoden der technischen Analyse integriert. Durch die Kombination von Preisspanne, RSI Offset und Moving Average Trends bietet es einen leistungsfähigen Rahmen für die Handelsentscheidung. Sein größter Vorteil liegt in der Dynamic Position Management System, das die Handelsscale automatisch an die Marktbedingungen anpasst und die Kapitaleffizienz optimiert, während das Risiko unter Kontrolle bleibt.
Obwohl Strategien mit einigen inhärenten Risiken verbunden sind, wie False Breakouts und Parameter-Sensitivität, können sie durch empfohlene Optimierungsrichtungen, wie die Erhöhung der Bilanzbestätigung, die Einführung von Volatilitätsanpassungen und Multi-Time-Framework-Analysen, die Stabilität und Anpassungsfähigkeit von Strategien weiter verbessern. Für Händler, die eine hochentwickelte Strategie auf einer automatisierten Handelsplattform (z. B. OKX Signal Robots) einsetzen möchten, bietet dies eine flexible und leistungsstarke Basis, die nach individuellen Handelsstilen und Marktpräferenzen angepasst und erweitert werden kann.
/*backtest
start: 2025-05-07 00:00:00
end: 2025-05-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// Strategy: Box Range with RSI Divergence (Dynamic Adjustment - OKX Signal Format)
// © aws2333
//I'm chinese
strategy("Kaito Box with RSI Div(Dynamic Adjustment + MA + Long)", overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=10)
rsiOverbought = 80
rsiOversold = 13
boxLength = input.int(3, title="Box Length", minval=1)
rsiLength = input.int(2, title="RSI Length", minval=1)
divergenceLookback = input.int(2, title="Divergence Lookback Period", minval=1)
leftLookback = input.int(2, title="Left Lookback", minval=1)
rightLookback = input.int(2, title="Right Lookback", minval=1)
var float avgPrice = na
//var float position_size = 0
signalToken = input.string("**********", "Signal Token")
enterOrderType = input.string("limit", "Order Type", options=["market", "limit"])
enterOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
enterInvestmentType = input.string("percentage_investment", "Investment Type", options=["margin", "contract", "percentage_balance", "percentage_investment"])
exitOrderType = input.string("limit", "Order Type", options=["market", "limit"])
exitOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
exitInvestmentType = input.string("percentage_position", "Investment Type", options=["percentage_position"])
maxLag = input.float(30, "maxLag")
minEnterPercent = 1.3
minExitPercent = 0.09
highestHigh = ta.highest(high, boxLength)
lowestLow = ta.lowest(low, boxLength)
plot(highestHigh, title="Upper Box", color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
plot(lowestLow, title="Lower Box", color=color.new(color.red, 0), linewidth=1, style=plot.style_line)
rsi = ta.rsi(low, rsiLength)
isLowestLeft = low < ta.lowest(low[1], leftLookback)
isLowestRight = low <= ta.lowest(low, rightLookback)
isLowestClose = isLowestLeft and isLowestRight
isHighestLeft = low > ta.highest(low[1], leftLookback)
isHighestRight = low >= ta.highest(low, rightLookback)
isHighestClose = isHighestLeft and isHighestRight
lowestClose = ta.lowest(low, divergenceLookback)
lowestRsi = ta.lowest(rsi, divergenceLookback)
highestClose = ta.highest(low, divergenceLookback)
highestRsi = ta.highest(rsi, divergenceLookback)
lowestClosePrev = ta.lowest(low[1], leftLookback)
lowestRsiPrev = ta.lowest(rsi[1], leftLookback)
highestClosePrev = ta.highest(low[1], leftLookback)
highestRsiPrev = ta.highest(rsi[1], leftLookback)
bullishDivergence = isLowestClose and (low < lowestClosePrev) and (rsi > lowestRsiPrev) and (rsi < rsiOversold)
bearishDivergence = isHighestClose and (low > highestClosePrev) and (rsi < highestRsiPrev) and (rsi > rsiOverbought)
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :type == "EMA" ? ta.ema(source, length) :type == "SMMA (RMA)" ? ta.rma(source, length) :type == "WMA" ? ta.wma(source, length) :type == "VWMA" ? ta.vwma(source, length) :na
custom_timeframe = input.timeframe("3", "Custom time period (leave blank for current period)")
ma_type = input.string("SMA", "Moving average type", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma20_period = input.int(20, "MA20 ", minval=1)
ma50_period = input.int(50, "MA50 ", minval=1)
ma100_period = input.int(100, "MA100 ", minval=1)
ma200_period = input.int(200, "MA200 ", minval=1)
source_close = request.security(syminfo.tickerid, custom_timeframe, close)
ma20 = ma(source_close, ma20_period, ma_type)
ma50 = ma(source_close, ma50_period, ma_type)
ma100 = ma(source_close, ma100_period, ma_type)
ma200 = ma(source_close, ma200_period, ma_type)
up_signal_1 = ma20 > ma200
up_signal_2 = ma50 > ma200
up_signal_3 = ma100 > ma200
up_signal_4 = (high > ma20 and high > ma50 and high > ma100 and high > ma200)
up_trend = (up_signal_1 and up_signal_2 and up_signal_3 and (source_close > ma200)) or up_signal_4
down_signal_1 = ma20 < ma200
down_signal_2 = ma50 < ma200
down_signal_3 = ma100 < ma200
down_signal_4 = (low < ma20 and low < ma50 and low < ma100 and low < ma200)
down_trend = (down_signal_1 and down_signal_2 and down_signal_3 and (source_close < ma200)) or down_signal_4
plot(ma20, color=color.yellow, title="MA20")
plot(ma50, color=color.orange, title="MA50")
plot(ma100, color=color.red, title="MA100")
plot(ma200, color=color.maroon, title="MA200")
var float longAddPercent = na
var float shortAddPercent = na
roundToFourDecimals(value) => math.round(value * 10000) / 10000
if not na(avgPrice)
if close < avgPrice
longAddPercent := roundToFourDecimals(math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1) , 100), minEnterPercent))
if close > avgPrice
longAddPercent := 1
if close == avgPrice
longAddPercent := 1
if not na(avgPrice)
if close < avgPrice
shortAddPercent := 0.01
if close > avgPrice
shortAddPercent := roundToFourDecimals(math.max(math.min(math.pow((close - avgPrice)*1000,1.1), 100), minExitPercent))
if close == avgPrice
longAddPercent := 1
longSignal = (close <= lowestLow) and bullishDivergence
shortSignal = (close >= highestHigh) and bearishDivergence
plotLongSignal = down_trend and longSignal and close < avgPrice
plotShortSignal = up_trend and shortSignal and close > avgPrice
if plotLongSignal
label.new(bar_index, avgPrice, "average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_up, color=color.green, textcolor=color.white )
if plotShortSignal
label.new(bar_index, avgPrice,"average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_down, color=color.red, textcolor=color.white)
if plotLongSignal
label.new(
bar_index,
close,
"LONG :" + str.tostring(longAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_up,
color=color.new(color.green, 80),
textcolor=color.white
)
if plotShortSignal
label.new(
bar_index,
close,
"EXIT LONG :" + str.tostring(shortAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_down,
color=color.new(color.red, 80),
textcolor=color.white
)
if longSignal
avgPrice := na(avgPrice) ? close : (avgPrice + close) / 2
if down_trend and longSignal
strategy.entry("Long",strategy.long,qty=longAddPercent )
var float close_size = na
if up_trend and shortSignal
if strategy.position_size > 0
close_size := strategy.position_size * (shortAddPercent/100)
strategy.order("Partial Close Long", strategy.short, close_size)