Die ADR-Even-Line-Cross-Strategie ist eine auf der TradingView-Plattform basierende, quantitative Handelsstrategie, die mehrere technische Indikatoren kombiniert, um Trends zu beurteilen, Signale zu filtern und Stop-Losses zu setzen. Die Strategie verwendet einen Index-Moving-Average (EMA) mit zwei verschiedenen Perioden, um die wichtigsten Trends zu identifizieren, verwendet die durchschnittliche tatsächliche Breite (ATR) als Schwankungsfilter und setzt Stop-Losses dynamisch nach dem Risiko-Rendite-Verhältnis.
Die Strategie nutzt zwei EMA-Linien mit unterschiedlichen Perioden, um Trends zu beurteilen. Wenn ein kurzfristiger EMA eine langfristige EMA durchläuft, wird der Trend als aufwärts betrachtet und ein Mehrfachsignal erzeugt.
ADR-Schwankungen-Filter: Um zu vermeiden, dass Handelssignale in einer Umgebung mit geringer Volatilität erzeugt werden, wurde die ADR-Anzeige als Schwankungen-Filter eingeführt. Der Start einer Position ist nur dann erlaubt, wenn der ADR-Wert über dem vorgegebenen Mindestschwellenwert liegt.
Handelszeitfenster: Diese Strategie erlaubt dem Benutzer, die Start- und Endzeit für tägliche Geschäfte festzulegen. Die Geschäfte werden nur innerhalb des angegebenen Zeitfensters ausgeführt. Dies hilft, schlechte oder volatile Zeiten zu vermeiden.
Dynamische Stop-Loss-Strategie: Die Strategie basiert auf den durchschnittlichen Höchst- und Tiefstpreisen der jüngsten N-Wurzel-K-Linie und kombiniert mit dem vorgegebenen Risiko-Rendite-Verhältnis, um den Stop-Loss-Preis und den Stop-Loss-Preis dynamisch zu berechnen. Dies stellt sicher, dass der Risiko-Rendite für jeden Handel kontrollierbar ist.
Ausgleich: Wenn die Position eine bestimmte Gewinnspanne erreicht hat (der Benutzer kann den Retour-Risiko-Verhältnis festlegen), wird die Strategie die Stop-Loss-Position auf den Eröffnungspreis, den Ausgleichswert, verschoben. Dies hilft, die erzielten Gewinne zu schützen.
Maximaler Tagesverlust: Um den maximalen Tagesverlust zu kontrollieren, setzt die Strategie eine tägliche Verlustlimit. Sobald die Tagesverluste diese Grenze erreichen, wird die Strategie den Handel bis zum nächsten Tag einstellen.
Die Strategie schließt alle Positionen zu einem festen Zeitpunkt an jedem Handelstag (z. B. 16:00) aus, unabhängig davon, ob die Position die Stop-Line oder die Stop-Loss-Linie erreicht hat, um das Übernachtungsrisiko zu vermeiden.
Trend-Tracking-Fähigkeit: Durch die Beurteilung von Trends durch die Überschneidung von doppelten Gleichlinien kann die wichtigsten Trends des Marktes effektiv erfasst werden, was die Gewinnrate und das Gewinnpotenzial der Strategie verbessert.
Die Einführung von ADR-Indikatoren als Fluktuationsfilter verhindert häufige Transaktionen in Umgebungen mit geringer Volatilität und reduziert die Verluste durch ungültige Signale und falsche Durchbrüche.
Strenge Risikokontrolle: Die Strategie setzt Risikokontrolle in mehreren Dimensionen ein, einschließlich dynamischer Stop-Loss-Stopps, Verlustbilanz und maximaler Tagesverlustlimits, um das Abwärtsrisiko der Strategie effektiv zu kontrollieren und die risikobereinigten Erträge zu erhöhen.
Die Parameter sind flexibel einstellbar: Die verschiedenen Parameter der Strategie, wie der Durchschnittszyklus, die Länge der ADR, die Rendite-Risiko-Ratio und die Handelszeitfenster, können flexibel angepasst werden, um die Strategie zu optimieren.
Hohe Automatisierung: Die Strategie basiert auf der TradingView-Plattform, wobei die Handelslogik vollständig automatisch durch das Programm ausgeführt wird, was die Störung durch menschliche Emotionen und subjektive Urteile reduziert und den langfristigen stabilen Betrieb der Strategie fördert.
Risiko der Parameteroptimierung: Obwohl die Parameter der Strategie flexibel angepasst werden können, kann eine Überoptimierung zu einer Überpassung führen, die in der Außenstichprobe nicht gut funktioniert. Daher ist eine ausreichende Rückmeldung und Analyse erforderlich, um die Stabilität der Strategie zu gewährleisten, wenn die Parameter eingestellt werden.
Das Risiko von Unerwarteten Ereignissen: Die Strategie basiert hauptsächlich auf dem Handel mit technischen Indikatoren und kann auf einige unerwartete, wichtige grundlegende Ereignisse wie politische Änderungen oder starke Schwankungen der Wirtschaftsdaten unzureichend reagieren, was zu einem größeren Rückzug führt.
Trendwechselrisiko: Bei einem Trendwechsel kann es zu einer Verzögerung des Binär-Hochsymbol-Kreuzungssignals kommen, wodurch die Strategie den optimalen Zeitpunkt für die Positionierung verpasst oder zu einem Verlust in der Anfangsphase des Trendwechsels kommt.
Liquiditätsrisiko: Die Strategie ist zwar mit einem Zeitfenster ausgestattet, aber wenn die Liquidität der Marke des Handels schlechter ist, kann es zu Risiken wie Gleitpunkten und Handelsverzögerungen kommen, die die Strategie beeinträchtigen.
Risiko, dass technische Kennzahlen fehlschlagen: Die Strategie ist stark auf technische Kennzahlen angewiesen und kann weniger effektiv sein, wenn sich die Marktbedingungen erheblich ändern und die Kennzahlen ihre ursprüngliche Indikationsbedeutung verlieren.
Einführung von mehrdimensionalen Indikatoren: Auf der Grundlage der vorhandenen Doppel-Gleichgewicht und ADR kann die Einführung von mehr effektiven technischen Indikatoren wie MACD, RSI usw. in Betracht gezogen werden, um die Zuverlässigkeit und Stabilität des Signals zu verbessern.
Dynamische Optimierungsparameter: Es kann ein Mechanismus zur Optimierung von Parametern entwickelt werden, der die Schlüsselparameter der Strategie dynamisch an die Veränderungen des Marktes anpasst.
Hinzufügen von Fundamentaldaten: Die richtige Berücksichtigung wichtiger Fundamentaldaten wie Wirtschaftsdaten, politische Trends usw. kann der Strategie helfen, Markttrends besser zu erfassen und systemische Risiken rechtzeitig zu vermeiden.
Verbesserung der Stop-Loss-Mechanismen: Auf der Grundlage der vorhandenen dynamischen Stop-Loss-Logik kann die Stop-Loss-Logik weiter optimiert werden, z. B. durch die Einführung von Methoden wie Tracking Stop, Partial Stop, um die Gewinne besser zu schützen und das Risiko zu kontrollieren.
Multi-Punkte, mehrere Zeiträume: Erweitern Sie die Strategie auf mehrere Handelspunkte und mehrere Zeiträume, um die Anpassungsfähigkeit und Stabilität der Strategie zu verbessern, indem Sie die Investitionen und die Zeiträume optimieren.
Die ADR-Strategie ist eine auf der technischen Analyse basierende quantitative Handelsstrategie, die Trends anhand von doppelten Gleichgewichtskreuzungen beurteilt und die Volatilität mit ADR-Indikatoren filtert. Die Strategie bietet außerdem strenge Risikokontrollmaßnahmen, einschließlich dynamischer Stop-Losses, Verlustbilanz und maximaler Tagesverlustlimits, um das Abwärtsrisiko zu kontrollieren. Die Vorteile der Strategie liegen in der starken Trendverfolgung, der guten Volatilitätsanpassungsfähigkeit, der strengen Risikokontrolle, der flexiblen Anpassung der Parameter und der hohen Automatisierung.
/*backtest
start: 2024-02-26 00:00:00
end: 2024-03-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Sameh_Hussein
//@version=5
strategy('EMA Cross ADR Strategy with Stats', overlay=true)
// Adjustable Parameters
shortEmaLength = input(10, title='Short EMA Length')
longEmaLength = input(50, title='Long EMA Length')
adrLength = input(14, title='ADR Length')
riskRewardRatio = input(2.0, title='Risk/Reward Ratio')
lookbackCandles = input(10, title='Lookback Candles for Stop Loss')
startTime = input(0900, title='Start Time')
endTime = input(1600, title='End Time')
minAdrValue = input(10, title='Minimum ADR Value for Entry')
breakEvenProfit = input.float(1.0, title='Break-Even Profit', minval=0.0)
breakEvenRR = input.float(1.0, title='Break-Even Risk-Reward Ratio', minval=0.0)
dailyLossLimit = input(-2000.0, title='Daily Loss Limit')
// Exponential Moving Averages
shortEma = ta.ema(close, shortEmaLength)
longEma = ta.ema(close, longEmaLength)
// Average Daily Range
adr = ta.sma(ta.tr, adrLength)
// Time Filter Function
timeFilter() => true
// Entry Conditions with ADR filter
longCondition = ta.crossover(shortEma, longEma) and timeFilter() and adr > minAdrValue
shortCondition = ta.crossunder(shortEma, longEma) and timeFilter() and adr > minAdrValue
// Calculate the average low and average high of the previous 'lookbackCandles' candles
averageLow = ta.sma(low, lookbackCandles)
averageHigh = ta.sma(high, lookbackCandles)
// Risk and Reward Calculation
stopLossLong = averageLow
takeProfitLong = close + (close - averageLow) * riskRewardRatio
stopLossShort = averageHigh
takeProfitShort = close - (averageHigh - close) * riskRewardRatio
// Entry Control Variables
var longEntryAllowed = true
var shortEntryAllowed = true
// Update entry price on trade execution
var float entryPriceLong = na
var float entryPriceShort = na
if (strategy.position_size > 0)
if (strategy.position_size[1] <= 0)
entryPriceLong := strategy.opentrades.entry_price(strategy.opentrades - 1)
else
entryPriceLong := entryPriceLong
else
entryPriceLong := na
if (strategy.position_size < 0)
if (strategy.position_size[1] >= 0)
entryPriceShort := strategy.opentrades.entry_price(strategy.opentrades - 1)
else
entryPriceShort := entryPriceShort
else
entryPriceShort := na
// Adjust stop loss to break-even plus the defined profit when the specified risk-reward ratio is reached
breakEvenTriggerLong = entryPriceLong + (entryPriceLong - stopLossLong) * breakEvenRR
breakEvenTriggerShort = entryPriceShort - (stopLossShort - entryPriceShort) * breakEvenRR
if (longEntryAllowed and close >= breakEvenTriggerLong)
stopLossLong := entryPriceLong + breakEvenProfit
if (shortEntryAllowed and close <= breakEvenTriggerShort)
stopLossShort := entryPriceShort - breakEvenProfit
// Close all trades at 1600
if (hour == 15 and minute == 59)
strategy.close_all(comment='Close at 1600')
// Define the daily loss variable and last trade day
var float[] dailyLossArray = array.new_float(1, 0.0)
var int[] lastTradeDayArray = array.new_int(1, na)
// Function to update the daily loss
updateDailyLoss() =>
_dailyLoss = array.get(dailyLossArray, 0)
_lastTradeDay = array.get(lastTradeDayArray, 0)
if na(_lastTradeDay) or dayofmonth != _lastTradeDay
_dailyLoss := 0.0
array.set(lastTradeDayArray, 0, dayofmonth)
if not na(strategy.closedtrades.entry_bar_index(strategy.closedtrades - 1))
_dailyLoss += strategy.closedtrades.profit(strategy.closedtrades - 1)
array.set(dailyLossArray, 0, _dailyLoss)
// Call the function to update the daily loss
updateDailyLoss()
// Execute Strategy
if longCondition and longEntryAllowed
strategy.entry('Long', strategy.long)
strategy.exit('Take Profit/Stop Loss', 'Long', stop=stopLossLong, limit=takeProfitLong)
longEntryAllowed := false
if shortCondition and shortEntryAllowed
strategy.entry('Short', strategy.short)
strategy.exit('Take Profit/Stop Loss', 'Short', stop=stopLossShort, limit=takeProfitShort)
shortEntryAllowed := false
// Reset entry control variables on position close
if strategy.position_size == 0
longEntryAllowed := true
shortEntryAllowed := true
// // Statistics
// winRate = strategy.wintrades / strategy.closedtrades * 100
// totalTrades = strategy.closedtrades
// averageProfit = strategy.grossprofit / strategy.wintrades
// averageLoss = strategy.grossloss / strategy.losstrades
// // Plotting
// plot(shortEma, color=color.new(color.red, 0), title='Short EMA')
// plot(longEma, color=color.new(color.blue, 0), title='Long EMA')
// // Display Table
// table statsTable = table.new(position=position.top_right, columns=2, rows=4, bgcolor=color.gray, border_width=1)
// table.cell(statsTable, column=0, row=0, text='Win Rate (%)', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=0, text=str.tostring(winRate), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=1, text='Total Trades', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=1, text=str.tostring(totalTrades), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=2, text='Average Profit', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=2, text=str.tostring(averageProfit), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=3, text='Average Loss', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=3, text=str.tostring(averageLoss), bgcolor=color.blue)