
Die Binary-Band-ATR-Strategie ist ein fortschrittliches quantitatives Handelssystem, das die dynamische Anpassung der Binary-Band-Breakthrough-Signale und der durchschnittlichen realen Schwankungsbreite (ATR) kombiniert, um Markttrends durch die “Follow Line”-Mechanik zu identifizieren und zu verfolgen. Die Strategie führt insbesondere eine Multi-Time-Frame- (HTF) -Bestätigungsmechanik ein, die Handelssignale in Richtung von Trends in höheren Zeiträumen filtern kann, was die Stabilität und Profitabilität der Strategie erheblich verbessert. Die System enthält auch mehrere erweiterte Funktionen, wie das Filtern von optional auswählbaren Handelsphasen, die automatische Anpassung der ATR-Schwankungsrate und die Echtzeit-Reaktionsmechanik für HHTF-Trends, um eine umfassende und flexible Handelslösung für Quantität zu bilden.
Im Zentrum der Strategie steht die “Tracking Line” -Mechanik, die dynamisch Markttrends identifiziert und an sie anpasst, und zwar durch folgende Schritte:
Brin-Band-Signal erzeugtDas System berechnet zunächst die Standard-Bollinger-Bänder, die ein bullishes Signal erzeugen, wenn der Preis einen Aufwärtstrend durchbricht, und ein bearishes Signal, wenn er einen Abwärtstrend durchbricht, und ein neutrales Signal, wenn er sich innerhalb des Bandes befindet.
Berechnung der Tracking-LinieDas System berechnet die temporäre Tracking-Linie entsprechend dem Brin-Band-Signal und der aktuellen Preisposition. Bei bullish Signalen wird die Tracking-Linie als der aktuelle K-Line-Tiefpunkt minus der ATR-Wert (wenn der ATR-Filter aktiviert ist) oder direkt mit dem Tiefpunkt eingestellt. Bei bullish Signalen wird die Tracking-Linie als der aktuelle K-Line-Hochpunkt plus der ATR-Wert oder direkt mit dem Hochpunkt eingestellt.
Verfolgungslinie-SperrmechanismusDie Strategie verwendet die “Spitzenrad” -Logik, um die Tracking-Linie aufrechtzuerhalten. In einem Aufwärtstrend wird der neue Tracking-Linie-Wert als temporärer Wert gegenüber dem größeren der vorherigen Werte und in einem Abwärtstrend als temporärer Wert gegenüber dem kleineren der vorherigen Werte genommen. Dies stellt sicher, dass die Tracking-Linie nur in der Richtung des Trends bewegt und eine dynamische Unterstützung / Widerstandsstufe bildet.
Trends festgestellt: Durch den Vergleich der aktuellen Tracking-Linie mit der vorherigen Tracking-Linie-Wert, das System bestimmt die Richtung des Trends: Aufstieg bedeutet mehrköpfigen Trend ((1)), Abstieg bedeutet ungebundenen Trend ((-1), und das Gleichgewicht hält den vorherigen Trend.
Mehrfache ZeitrahmenanalyseStrategie: Verwenden Sie eine ähnliche Logik, um die Tracking-Linie und den Trendstatus auf einem höheren Zeitrahmen zu berechnen, und wählen Sie den entsprechenden höheren Zeitrahmen automatisch oder manuell aus (z. B. 1 Minute entspricht automatisch 15 Minuten HTF).
ZulassungsvoraussetzungenWenn ein Handelszeitrahmentrend von neutral oder fallend zu bullish wird und HTF einen Aufwärtstrend feststellt, erzeugt es ein Mehrwertsignal; umgekehrt erzeugt es ein Kurzwertsignal.
SpielbedingungenStrategie-Plating-Positions: Strategie-Plating-Positionen bestehen, wenn der Handelszeitrahmen-Trend in die entgegengesetzte Richtung wechselt oder der HTF-Trend in die entgegengesetzte Richtung wechselt (neue Version v2.5).
Zeit-FilterSie können wählen, ob Sie nur in einem bestimmten Handelszeitraum handeln möchten (wie z. B. in der regulären Börsenzeit 0930-1600).
AnpassungsfähigkeitDer Tracking Line-Mechanismus kann sich automatisch an die Marktvolatilität anpassen und bietet eine dynamische Anpassungsfähigkeit an unterschiedliche Volatilitätsumgebungen, insbesondere wenn der ATR-Filter aktiviert ist.
TrendbestätigungsmechanismusDie Multi-Time-Frame-Bestätigung filtert “Noise” -Transactions und tritt nur dann ein, wenn die HTF-Trendrichtung übereinstimmt, was die Signalqualität erheblich verbessert.
Flexible KonfigurationsoptionenDie Strategie bietet eine Vielzahl von Parameter-Einstellungen, darunter Brin-Band-Perioden und Abweichungen, ATR-Perioden, Zeitfilter und HTF-Selektionsmethoden, die für verschiedene Märkte und Handelsarten optimiert werden können.
Hohe ReaktionsfähigkeitDer neue Trendwechsel-Reaktionsmechanismus der HTF in der Version 2.5 ermöglicht es der Strategie, schneller auf große Trendwechsel zu reagieren, um Schäden rechtzeitig zu stoppen und schwerwiegende Rückgängen zu vermeiden.
Visuelle UnterstützungStrategie: Zeichnen Sie die Handelszeiträume und die HTF-Track-Linien auf den Diagramm und zeigen Sie optional die Etiketten für Kauf- und Verkaufssignale an, um die Handelslogik intuitiv zu machen.
VermögensverwaltungDurch die Einstellung von pyramiding=0 wird verhindert, dass mehrere Eintritte in die gleiche Richtung vorgenommen werden, wodurch unnötige Risiken vermieden werden.
Falsche DurchbruchgefahrLösungen: Die Brin-Band-Abweichungswerte können erhöht oder die Bestätigungszeit verlängert werden, und sogar zusätzliche Bestätigungsmechanismen für Durchbrüche können hinzugefügt werden.
ParameterempfindlichkeitStrategie-Performance ist empfindlich auf Parameter wie ATR-Perioden, Brin-Band-Einstellungen und andere. Lösung: Die Kombination von Parametern, die für die jeweilige Handelsart am besten geeignet sind, sollte durch Rückverfolgung gefunden werden, um die Kurvenpassung zu vermeiden, die durch Überoptimierung verursacht wird.
Nachträglicher TrendwechselLösung: Eine geringere ATR-Mehrzahl oder Brin-Bring-Periode kann in Betracht gezogen werden, um die Reaktionsgeschwindigkeit zu erhöhen, aber die Signalqualität und Reaktionsfähigkeit auszugleichen.
ZeitrahmenabhängigkeitLösungsmechanismus: Es wird empfohlen, die Funktion “Automatische HTF-Auswahl” zu verwenden, die automatisch einen geeigneten höheren Zeitrahmen auswählt, der auf dem aktuellen Chart-Zeitrahmen basiert.
Fehlende FinanzverwaltungDie Strategie selbst beinhaltet keine vollständige Geldverwaltungsmechanik. Lösung: In der praktischen Anwendung sollte eine geeignete Stop-Loss-Strategie mit Position-Management-Regeln, wie z. B. Fixed-Percentage-Risk oder ATR-Multiplikator-Stopp, kombiniert werden.
Erweiterte SignalfilterungEs kann in Erwägung gezogen werden, andere technische Indikatoren einzuführen, z. B. die relativ schwache RSI oder die stochastische Stochastik, um ein Einstiegssignal zu bestätigen und nur dann zu handeln, wenn der Indikator überkauft/überverkauft ist. Dies wird die False-Breakout-Signale weiter reduzieren und die Gewinnrate erhöhen.
Anpassung der dynamischen ParameterEs können Anpassungsmechanismen entwickelt werden, die sich an den Marktbedingungen anpassen, z. B. die automatische Erhöhung der Bollinger Bands bei hoher Volatilität und die Verringerung der Abweichungen bei geringer Volatilität, so dass Strategien besser an unterschiedliche Marktbedingungen angepasst werden können.
Optimierung der HTF-Trendbeurteilung: Die Algorithmen zur Bestätigung von HTF-Trends können verbessert werden, z. B. durch die Einführung von Index-Moving-Average-Kreuzungen oder anderen Trendindikatoren, anstatt nur auf die Richtung der Tracking-Linie angewiesen zu sein, um eine stabilere Trendbeurteilung zu erzielen.
Vervollkommnung der GeldverwaltungEin integriertes, umfassendes Geldmanagementsystem, das die Positionsgröße dynamisch an die Marktvolatilität und die Größe des Kontos anpasst, ATR-basierte Stop-Loss-Levels und Gewinnziele setzt, um den risikobereinigten Return zu maximieren.
Hinzufügen von Analysen zur MarktlageEinführung einer Klassifizierung des Marktumfelds, um Trends und Shocks zu unterscheiden, und automatische Anpassung der Strategie-Parameter oder der Handelsregeln an die Marktlage, sogar die Aussetzung des Handels in einem Marktumfeld, das nicht für die Strategie geeignet ist.
Mehrstrategische IntegrationDie Strategie wird als Komponente kombiniert mit anderen komplementären Strategien (z. B. Umkehr- oder Durchbruchbestätigungsstrategien), um eine vollständige Strategie zu bilden, die die Performance in verschiedenen Marktumgebungen ausgleicht.
Die Brin-Band-ATR-Strategie ist ein gut konzipiertes quantitatives Handelssystem, das durch die Kombination von Brin-Band-, ATR- und Multi-Time-Frame-Analysen effektiv Markttrends identifiziert und verfolgt. Die Kernvorteile der Strategie liegen in ihrer Anpassungsfähigkeit und Flexibilität, die sich an die Dynamik der Marktbedingungen anpasst und gleichzeitig die Signalqualität und die Gewinnrate durch die HTF-Bestätigungsmechanismen verbessert.
Obwohl einige inherente Risiken wie Parameter-Sensitivität und False-Breakout-Probleme bestehen, können diese durch geeignete Parameter-Optimierung und zusätzliche Filtermechanismen gemildert werden. Strategische Optimierungsrichtungen wie verstärkte Signalfilterung, dynamische Parameteranpassung und verbesserte Kapitalverwaltung bieten einen klaren Weg zur weiteren Verbesserung der Strategieleistung.
Insgesamt eignet sich diese Strategie besonders für Trader mit mittlerem und langem Trend, da sie einen soliden Rahmen bietet, um Trendänderungen zu erkennen und bei günstigen Marktbedingungen zu handeln. Mit einem vernünftigen Parameter-Set und einem angemessenen Risikomanagement hat die Strategie das Potenzial, in einer Vielzahl von Marktumgebungen stabile Renditen zu erzielen.
/*backtest
start: 2024-07-20 00:00:00
end: 2025-04-07 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
//@fenyesk
//Optional Working Hours and ATR based TP/SL removed
// Added Optional Higher Timeframe Confirmation with Auto/Manual Selection
// Revised for improved profitability: Trend-following Entries/Exits
// v2.5: React to HTF trend changes as well
strategy('Follow Line Strategy Version 2.5 (React HTF)', overlay = true, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 1, pyramiding = 0) // Version bump overlay=true, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1, pyramiding=0) // Prevent multiple entries in the same direction )
// --- Settings ---
// Indicator Parameters
atrPeriodInput = input.int(defval = 5, title = 'ATR Period', minval = 1, group = 'Indicator Settings')
bbPeriodInput = input.int(defval = 21, title = 'Bollinger Bands Period', minval = 1, group = 'Indicator Settings')
bbDeviationInput = input.float(defval = 1.00, title = 'Bollinger Bands Deviation', minval = 0.1, step = 0.1, group = 'Indicator Settings')
useAtrFilterInput = input.bool(defval = true, title = 'Use ATR for Follow Line Offset?', group = 'Indicator Settings')
showSignalsInput = input.bool(title = 'Show Trade Signals on Chart?', defval = true, group = 'Indicator Settings')
// --- Higher Timeframe Confirmation ---
htf_group = 'Higher Timeframe Confirmation'
useHTFConfirmationInput = input.bool(false, title = 'Enable HTF Confirmation?', group = htf_group)
htfSelectionMethodInput = input.string('Auto', title = 'HTF Selection Method', options = ['Auto', 'Manual'], group = htf_group)
manualHTFInput = input.timeframe('240', title = 'Manual Higher Timeframe', group = htf_group) // Default to 4h if Manual
showHTFLineInput = input.bool(false, title = 'Show HTF Follow Line?', group = htf_group)
// --- Determine Higher Timeframe ---
// Revised function with explicit return variable
f_getAutoHTF() =>
string htfResult = 'D' // Initialize with a default value (e.g., Daily)
if timeframe.isintraday
if timeframe.multiplier <= 1 and timeframe.isminutes
htfResult := '15' // 1min -> 15min
htfResult
else if timeframe.multiplier <= 5 and timeframe.isminutes
htfResult := '240' // 5min -> 4h (240min)
htfResult
else if timeframe.multiplier <= 30 and timeframe.isminutes
htfResult := '240' // 15-30min -> 4h (240min)
htfResult
else if timeframe.multiplier == 60 and timeframe.isminutes // 1 hour
htfResult := 'D' // 1h -> 1 Day
htfResult
else if timeframe.multiplier <= 240 and timeframe.isminutes // Up to 4 hours
htfResult := 'W' // 4h -> 1 Week
htfResult
// else // The default "D" is already set if none of the above match
// htfResult := "D" // Default for other intraday -> 1 Day (already default)
else if timeframe.isdaily // Daily
htfResult := 'M' // 1 Day -> 1 Month
htfResult
else if timeframe.isweekly // Weekly
htfResult := 'M' // 1 Week -> 1 Month
htfResult
else // Monthly or higher (or unknown)
htfResult := '3M' // Default to 3 Months
htfResult
htfResult // Explicitly return the variable value
autoHTF = f_getAutoHTF()
selectedHTF = htfSelectionMethodInput == 'Auto' ? autoHTF : manualHTFInput
// --- Trade Timeframe Calculations ---
// Bollinger Bands calculation
bbMiddle_trade = ta.sma(close, bbPeriodInput)
bbStdDev_trade = ta.stdev(close, bbPeriodInput)
BBUpper_trade = bbMiddle_trade + bbStdDev_trade * bbDeviationInput
BBLower_trade = bbMiddle_trade - bbStdDev_trade * bbDeviationInput
// ATR calculation
atrValue_trade = ta.atr(atrPeriodInput)
// Signal initialization for Trade TF
var float followLine_trade = na
var int bbSignal_trade = 0
var int trend_trade = 0 // Renamed from iTrend
// Determine BB signal based on current close (Trade TF)
if close > BBUpper_trade
bbSignal_trade := 1
bbSignal_trade
else if close < BBLower_trade
bbSignal_trade := -1
bbSignal_trade
else
bbSignal_trade := 0 // Reset signal if price is within bands
bbSignal_trade
// Calculate potential new FollowLine value for the current bar (Trade TF)
float tempFollowLine_trade = na // Explicit type
if bbSignal_trade == 1
tempFollowLine_trade := useAtrFilterInput ? low - atrValue_trade : low
tempFollowLine_trade
else if bbSignal_trade == -1
tempFollowLine_trade := useAtrFilterInput ? high + atrValue_trade : high
tempFollowLine_trade
// Determine the final FollowLine for the current bar, applying the "ratchet" logic (Trade TF)
if bbSignal_trade == 1 // Price closed above upper BB
followLine_trade := na(followLine_trade[1]) ? tempFollowLine_trade : math.max(tempFollowLine_trade, nz(followLine_trade[1], tempFollowLine_trade))
followLine_trade
else if bbSignal_trade == -1 // Price closed below lower BB
followLine_trade := na(followLine_trade[1]) ? tempFollowLine_trade : math.min(tempFollowLine_trade, nz(followLine_trade[1], tempFollowLine_trade))
followLine_trade
else // Price closed within bands, FollowLine continues from previous bar
if not na(followLine_trade[1])
followLine_trade := followLine_trade[1]
followLine_trade
// else followLine_trade remains na if followLine_trade[1] was na
// Trend direction determination (Based on current FollowLine vs previous FollowLine - Trade TF)
if not na(followLine_trade) and not na(followLine_trade[1])
if followLine_trade > followLine_trade[1]
trend_trade := 1
trend_trade
else if followLine_trade < followLine_trade[1]
trend_trade := -1
trend_trade
else
trend_trade := nz(trend_trade[1], 0) // Maintain previous trend if line is flat but valid
trend_trade
else if not na(followLine_trade) and na(followLine_trade[1])
trend_trade := bbSignal_trade == 1 ? 1 : bbSignal_trade == -1 ? -1 : 0 // Use ternary for initial trend
trend_trade
else if na(followLine_trade)
trend_trade := 0 // Reset trend if FollowLine becomes invalid
trend_trade
// --- Higher Timeframe Calculations ---
// Function revised to return only one value (as float) based on parameter
f_calculateHTFData(htf_close, htf_high, htf_low, return_type) =>
// Explicitly type potentially 'na' indicator results
float htf_atrValue = ta.atr(atrPeriodInput)
float htf_bbMiddle = ta.sma(htf_close, bbPeriodInput)
float htf_bbStdDev = ta.stdev(htf_close, bbPeriodInput)
float htf_BBUpper = na
float htf_BBLower = na
// Calculate BBands only if middle/stdev are valid
if not na(htf_bbMiddle) and not na(htf_bbStdDev)
htf_BBUpper := htf_bbMiddle + htf_bbStdDev * bbDeviationInput
htf_BBLower := htf_bbMiddle - htf_bbStdDev * bbDeviationInput
htf_BBLower
// Determine BB signal (HTF) - Default to 0
int htf_bbSignal = 0
// Check if bands are valid before comparing
if not na(htf_BBUpper) and not na(htf_BBLower)
if htf_close > htf_BBUpper
htf_bbSignal := 1
htf_bbSignal
else if htf_close < htf_BBLower
htf_bbSignal := -1
htf_bbSignal
// Calculate potential new FollowLine (HTF)
float htf_tempFollowLine = na // Explicitly typed float
if htf_bbSignal == 1
htf_tempFollowLine := useAtrFilterInput and not na(htf_atrValue) ? htf_low - htf_atrValue : htf_low
htf_tempFollowLine
else if htf_bbSignal == -1
htf_tempFollowLine := useAtrFilterInput and not na(htf_atrValue) ? htf_high + htf_atrValue : htf_high
htf_tempFollowLine
// Maintain FollowLine state using 'var'
var float htf_followLine = na
var int htf_trend = 0
// Determine the final FollowLine (HTF)
if htf_bbSignal == 1
htf_followLine := na(htf_followLine[1]) ? htf_tempFollowLine : math.max(htf_tempFollowLine, nz(htf_followLine[1], htf_tempFollowLine))
htf_followLine
else if htf_bbSignal == -1
htf_followLine := na(htf_followLine[1]) ? htf_tempFollowLine : math.min(htf_tempFollowLine, nz(htf_followLine[1], htf_tempFollowLine))
htf_followLine
else
if not na(htf_followLine[1])
htf_followLine := htf_followLine[1]
htf_followLine
// else htf_followLine remains na if htf_followLine[1] was na (unless reset below)
// Reset FollowLine if it's based on invalid temp line
if na(htf_tempFollowLine) and htf_bbSignal != 0 // If the signal existed but calc failed (e.g., na ATR)
htf_followLine := na // Reset line
htf_followLine
// Determine Trend (HTF)
if not na(htf_followLine) and not na(htf_followLine[1])
if htf_followLine > htf_followLine[1]
htf_trend := 1
htf_trend
else if htf_followLine < htf_followLine[1]
htf_trend := -1
htf_trend
else
htf_trend := nz(htf_trend[1], 0)
htf_trend
else if not na(htf_followLine) and na(htf_followLine[1])
htf_trend := htf_bbSignal == 1 ? 1 : htf_bbSignal == -1 ? -1 : 0
htf_trend
else if na(htf_followLine) // Trend is 0 if line becomes (or is) na
htf_trend := 0
htf_trend
// Return the requested value as float type (or na)
float return_value = na
if return_type == 'line'
return_value := htf_followLine
return_value
else if return_type == 'trend'
return_value := float(htf_trend) // Convert int trend to float for consistent return type
return_value
return_value // Return the single calculated value
// Explicitly declare variables that will receive the security call result
float followLine_htf = na
int trend_htf = 0 // Initialize with a default value (0 for neutral)
// Request HTF data UNCONDITIONALLY
followLine_htf_result = request.security(syminfo.tickerid, selectedHTF, f_calculateHTFData(close, high, low, 'line'), lookahead = barmerge.lookahead_off)
trend_htf_result_float = request.security(syminfo.tickerid, selectedHTF, f_calculateHTFData(close, high, low, 'trend'), lookahead = barmerge.lookahead_off)
// Conditionally assign the results based on whether the HTF feature is enabled
if useHTFConfirmationInput or showHTFLineInput
// Assign results, handling potential 'na' values safely
followLine_htf := followLine_htf_result // Assign float/na directly
trend_htf := na(trend_htf_result_float) ? 0 : int(nz(trend_htf_result_float)) // Convert float result back to int, default to 0 if na
trend_htf
else // If HTF features are disabled, set variables to 'na'
followLine_htf := na
trend_htf := 0 // or na if preferred
trend_htf
// HTF Filter
// Use the potentially 'na' followLine_htf and the guaranteed non-'na' trend_htf
htfConfirmsLong = not useHTFConfirmationInput or useHTFConfirmationInput and trend_htf == 1
htfConfirmsShort = not useHTFConfirmationInput or useHTFConfirmationInput and trend_htf == -1
// --- Entry/Exit Conditions ---
// Buy & Sell Conditions (Based on Trade TF trend crossover)
longCondition_trade = nz(trend_trade[1]) <= 0 and trend_trade == 1
shortCondition_trade = nz(trend_trade[1]) >= 0 and trend_trade == -1
// Combined Entry Conditions with Filters
goLong = htfConfirmsLong and longCondition_trade and strategy.position_size <= 0 // Only enter long if flat or short & HTF confirms
goShort = htfConfirmsShort and shortCondition_trade and strategy.position_size >= 0 // Only enter short if flat or long & HTF confirms
// Exit conditions based on *either* TTF or HTF changing trend against the position
exitLong = trend_trade == -1 or trend_htf == -1 // TTF to short OR HTF to short
exitShort = trend_trade == 1 or trend_htf == 1 // TTF to long OR HTF to long
// --- Strategy Execution ---
if goLong
strategy.close('Short', comment = 'Close Short for Long')
strategy.entry('Long', strategy.long, comment = 'Enter Long')
if goShort
strategy.close('Long', comment = 'Close Long for Short')
strategy.entry('Short', strategy.short, comment = 'Enter Short')
if exitLong
strategy.close('Long', comment = 'Exit Long')
if exitShort
strategy.close('Short', comment = 'Exit Short')
// --- Alerts ---
// Alerts trigger on the same bar as the entry condition, respecting all filters
// NOTE: Removed dynamic HTF from message as alertcondition requires const string
alertcondition(goLong, title = 'FL Buy Signal', message = 'Follow Line Buy Signal - {{ticker}} {{interval}}')
alertcondition(goShort, title = 'FL Sell Signal', message = 'Follow Line Sell Signal - {{ticker}} {{interval}}')
alertcondition(goLong or goShort, title = 'FL Signal', message = 'Follow Line Signal - {{ticker}} {{interval}}')
// --- Plotting ---
// Plot the Trade Timeframe Follow Line
lineColor_trade = trend_trade > 0 ? color.new(color.blue, 0) : trend_trade < 0 ? color.new(color.red, 0) : color.new(color.gray, 0)
plot(followLine_trade, color = lineColor_trade, linewidth = 2, title = 'Follow Line (Trade TF)')
// Plot the Higher Timeframe Follow Line (optional)
// Use the potentially 'na' followLine_htf and the guaranteed non-'na' trend_htf for coloring
lineColor_htf = trend_htf > 0 ? color.new(color.aqua, 0) : trend_htf < 0 ? color.new(color.orange, 0) : color.new(color.gray, 70)
plot(showHTFLineInput and useHTFConfirmationInput ? followLine_htf : na, color = lineColor_htf, linewidth = 2, style = plot.style_circles, title = 'Follow Line (HTF)', offset = 0)
// Plot shapes on the bar the trade signal occurs (based on trade TF condition), placing them AT the calculated Trade TF price level.
// Use the original trade long/short conditions for plotting shapes for clarity, before plots
plotshape(longCondition_trade and showSignalsInput and not na(followLine_trade) and not na(atrValue_trade) ? followLine_trade - atrValue_trade : na, text = 'BUY', style = shape.labelup, location = location.absolute, color = color.new(color.blue, 0), textcolor = color.new(color.white, 0), offset = 0, size = size.auto)
plotshape(shortCondition_trade and showSignalsInput and not na(followLine_trade) and not na(atrValue_trade) ? followLine_trade + atrValue_trade : na, text = 'SELL', style = shape.labeldown, location = location.absolute, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), offset = 0, size = size.auto)
// Plot BBands for reference if desired
// plot(BBUpper_trade, "Upper BB", color=color.gray)
// plot(BBLower_trade, "Lower BB", color=color.gray)