Strategie zur statistischen Analyse des Fibonacci-Musters

斐波那契 模式识别 统计分析 技术指标 趋势跟踪 ATR 风险管理 IQR
Erstellungsdatum: 2025-03-03 10:24:54 zuletzt geändert: 2025-03-03 10:24:54
Kopie: 3 Klicks: 478
2
konzentrieren Sie sich auf
319
Anhänger

Strategie zur statistischen Analyse des Fibonacci-Musters Strategie zur statistischen Analyse des Fibonacci-Musters

Überblick

Die Fibonacci-Strategie ist eine fortgeschrittene quantitative Handelsmethode, die die drei Kerntechnologien der Fibonacci-Rückschlag-Ebene, der Mustererkennungsalgorithmen und der statistischen Analyse geschickt kombiniert. Die Strategie nutzt die Fibonacci-Rückschlag-Ebene von 19% und 82,56% als Grundlage für die Handelssignale und identifiziert die hochwahrscheinlichen Handelssätze durch die Muster-Matching-Algorithmen und bestätigt diese durch die statistische Analyse.

Strategieprinzip

Die Kernprinzipien der Fibonacci-Modell-Strategie für die statistische Analyse basieren auf der Zusammenarbeit von drei Hauptkomponenten:

  1. Fibonacci-RückrufDie Strategie berechnet spezielle Fibonacci-Rückschlag-Levels von 19% und 82,56% an den Höchst- und Tiefpunkten in 93 Perioden. Diese außergewöhnlichen Fibonacci-Levels sind einzigartig für die Strategie und können auf der Grundlage statistischer Analysen bestimmter Marktverhaltens erstellt werden. Ein vorläufiges Handelssignal wird erzeugt, wenn der Preis diese Level erreicht oder überschreitet.

  2. PatternerkennungDie Strategie implementiert einen komplexen Muster-Matching-Algorithmus, der die Ähnlichkeit mit dem aktuellen Muster durch Analyse des vergangenen Preismusters berechnet. Sie verwendet ein Diagrammmuster mit einer bestimmten Länge (default 5) und sucht nach der besten Übereinstimmung in den historischen Daten (default 93). Wenn die gefundene Muster-Ähnlichkeit über den eingestellten Threshold (default 0.7) hinausgeht, prognostiziert die Strategie den möglichen Kursverlauf nach dem aktuellen Muster basierend auf der Preisentwicklung nach diesem historischen Muster.

  3. Statistische AnalyseDie Strategie führt eine statistische Bestätigungsmechanik ein, um die statistische Verteilung der Preise zu bestimmen, indem die Mittel-, Viertel- und Viertelstufen (IQR) berechnet werden. Es werden statistische Signale erzeugt, wenn der Preis die Mittel-, obere Viertelstufen oder die obere und untere Grenze (definiert als Q3 + 1.5 * IQR und Q1 - 1.5 * IQR) überschreitet. Die Stärke dieser Signale wird anhand des Durchbruchsniveaus und der vom Benutzer eingestellten statistischen Berechtigungen neu berechnet.

Die Erzeugung von Handelssignalen ist das Ergebnis einer Kombination aus drei Komponenten:

  • Mehrfache Bedingungen müssen Fibonacci-Touch- oder Durchbruchsignale erfüllen (je nach Benutzereinstellung), während die Modellrichtung mehrseitig oder neutral ist.
  • Die Lüftungskonditionen müssen Fibonacci-Touch- oder Breakout-Signale erfüllen, die Modellrichtung ist luftseitig oder neutral und die statistische Luftseitigkeit ist größer als 0.

Die Strategie umfasst auch komplexe Risikomanagementmechanismen, darunter:

  • Optionale Stop-Loss auf Basis von Prozentsatz oder ATR
  • Optionale Verfolgungsschutz
  • Sieben Stufen der Gewinnausschüttung, mit 14,28% der Positionen pro Stufe

Strategische Vorteile

  1. Mehrdimensionale SignalbestätigungDie Strategie kombiniert die drei Dimensionen der technischen Analyse (Fibonacci), der Mustererkennung und der statistischen Analyse zu einem leistungsfähigen Mehrheitsbestätigungsmechanismus, der die Wahrscheinlichkeit von Falschmeldungen erheblich reduziert.

  2. Äußerst anpassungsfähigDie Strategie bietet eine Vielzahl von Parameter-Einstellungen, darunter Zeitzyklus-Auswahl, Modell-Längen, Ähnlichkeits-Thresholds, historische Rückblenden und statistische Zyklen, die es ermöglichen, sich an unterschiedliche Marktumgebungen und Handelsarten anzupassen.

  3. Intelligente MustererkennungDie Modell-Matching-Algorithmen der Strategie berücksichtigen nicht nur die Form der Modelle, sondern auch die Ähnlichkeits-Thresholds, um sicherzustellen, dass nur sehr ähnliche Modelle zur Vorhersage verwendet werden, was die Genauigkeit der Vorhersage erhöht.

  4. Statistische ÜberprüfungDurch die Einführung statistischer Methoden der Quadratur und des IQR ist die Strategie in der Lage, die Position des Preises in der statistischen Verteilung zu erkennen und eine zusätzliche objektive Grundlage für Handelsentscheidungen zu liefern.

  5. Gutes RisikomanagementDie Strategie bietet verschiedene Stop-Loss-Optionen (feste Prozentsätze, ATR-Multiplikatoren, Tracking-Stopps) und eine siebenstufige Gewinnspanne, die ein flexibles und systematisches Risikomanagement ermöglicht.

  6. Intuitive VisualisierungDie Strategie bietet eine Vielzahl von visuellen Elementen, darunter Hintergrundfarben, Pfeile, Markierungen und Tags, die dem Händler helfen, die aktuelle Marktlage und die Signalstärke intuitiv zu verstehen.

  7. Echtzeit-Status-PanelDie Strategie zeigt eine in Echtzeit aktualisierte Status-Panel auf der Tabelle, die den aktuellen Status der drei Komponenten Fibonacci, Modelle und Statistiken sowie ihre zusammengefassten Ergebnisse deutlich darstellt.

Strategisches Risiko

  1. ParameterempfindlichkeitDie Strategie verwendet mehrere Parameter, wie z. B. Modelllänge, Ähnlichkeits-Threshold, statistische Perioden, deren Einstellungen die Strategie-Performance erheblich beeinflussen können. Fehlende Parameter-Einstellungen können zu Über- oder Fehlsignalen führen. Es wird empfohlen, eine Kombination von Parametern zu finden, die für einen bestimmten Markt geeignet sind, indem Sie die Optimierung durch Rückmeldung durchführen.

  2. Abhängigkeit vom MarktumfeldDie Wirksamkeit der Strategie kann sich je nach Marktbedingungen ändern. Die Lösung ist die Einführung eines Marktumfeld-Detektionsmechanismus, der in verschiedenen Marktumgebungen verschiedene Parameter-Sätze verwendet.

  3. Komplexität der BerechnungDie Strategie erfordert, dass die Modell-Matching-Algorithmen die historischen Daten in jedem Zyklus durchlaufen und die Ähnlichkeiten berechnen, was zu einer höheren Rechenbelastung in kürzeren Zeitrahmen führen kann. Um dieses Problem zu verringern, kann man überlegen, die Algorithmen zu optimieren oder die Rechenfrequenz zu reduzieren.

  4. ÜberhändlerrisikenEs wird empfohlen, eine Handelsfrequenzbeschränkung oder ein Signalintensitätsfilter hinzuzufügen, um nur die höchste Qualität der Signale auszuführen.

  5. Schadensbegrenzungs-HerausforderungenObwohl die Strategie eine Vielzahl von Stop-Optionen bietet, ist es immer noch eine Herausforderung, die optimale Stop-Level zu bestimmen. Zu eng kann zu häufigen Stop-Losses führen, zu breit kann zu hohen Verlusten führen. Es wird empfohlen, die Stop-Levels an die dynamischen Marktschwankungen anzupassen.

  6. Mangel an grundlegenden ÜberlegungenDie Strategie basiert ausschließlich auf technischen und statistischen Analysen ohne Berücksichtigung von Fundamentaldaten. Rein technische Strategien können bei wichtigen Nachrichten oder Ereignissen herausgefordert werden. Die Lösung besteht darin, einen Nachrichtenfilter hinzuzufügen oder den Handel vor oder nach einem wichtigen Ereignis auszusetzen.

Richtung der Strategieoptimierung

  1. Anpassung der dynamischen ParameterEs können Anpassungsmechanismen eingeführt werden, die die Parameter wie die Modelllänge, die Ähnlichkeitsdämpfung und die statistische Periode dynamisch an die Marktvolatilität oder die Trendstärke anpassen. Dies erhöht die Anpassungsfähigkeit der Strategie in verschiedenen Marktumgebungen.

  2. Algorithmen für die Erweiterung der Modell-MatchingDerzeit basiert die Modellmatching hauptsächlich auf der Beziehung zwischen Schlusskurs und Eröffnungskurs (Bei-, Bei- oder Flachkurs). Es kann in Betracht gezogen werden, kompliziertere Modellmerkmale einzuführen, z. B. Hoch-Low-Punkt-Beziehungen, Transaktionsvolumen- oder Volatilitätsmodelle, um die Genauigkeit der Modellerkennung zu verbessern.

  3. Klassifizierung der Marktumgebung: Einführung von Klassifizierungsmechanismen für Marktumgebungen wie Trends/Bereiche/Chaos-Klassifizierungen und Verwendung von unterschiedlichen Handelsregeln oder Parameter-Sets für verschiedene Marktumgebungen. Dies hilft der Strategie, sich besser an unterschiedliche Marktbedingungen anzupassen.

  4. Optimierung der statistischen AnalyseEs kann in Erwägung gezogen werden, kompliziertere statistische Methoden wie Z-Score oder Prozentzahl zu verwenden oder dynamische statistische Zyklen einzuführen, um die Qualität der statistischen Signale zu verbessern.

  5. Integration von maschinellem LernenDie Verwendung von Machine Learning-Algorithmen zur Optimierung der Mustererkennung und der statistischen Gewichtsverteilung oder zur Vorhersage der Wahrscheinlichkeitsverteilung von Preisbewegungen nach bestimmten Mustern kann in Erwägung gezogen werden.

  6. Verbesserung des RisikomanagementsEs ist möglich, eine dynamische Positionsmanagementstrategie zu implementieren, die die Positionsgröße an die Signalstärke, die Marktvolatilität und das Kontorisiko anpasst. Darüber hinaus können die Ertragszielziele in Abhängigkeit von den Marktbedingungen dynamisch angepasst werden.

  7. Filter hinzufügenDie Einführung verschiedener Filter, wie z. B. Trendfilter, Schwankungsratefilter oder Übertragungsmengefilter, verbessert die Signalqualität weiter und reduziert die Falschsignale.

Zusammenfassen

Die Fibonacci-Strategie ist eine strukturierte, funktionsreiche und quantitative Handelsstrategie, die durch die innovative Kombination von Fibonacci-Rückschlag-Ebenen, Mustererkennung und statistische Analyse ein leistungsfähiges, mehrdimensionales Signalsystem erstellt. Die Kernvorteile der Strategie liegen in ihren vielschichtigen Bestätigungsmechanismen, ihrer Anpassungsfähigkeit und ihren ausgefeilten Risikomanagementfunktionen, die es ermöglichen, in verschiedenen Marktumgebungen nach hochwahrscheinlichen Handelsmöglichkeiten zu suchen.

Die Strategie sieht sich jedoch auch mit Herausforderungen konfrontiert, wie Parameter-Sensitivität, Marktumfeld-Abhängigkeit und Rechenkomplexität. Die Strategie hat viel Raum für Optimierungen durch die Einführung von dynamischen Parameteranpassungen, erweiterte Modell-Matching-Algorithmen, Klassifizierung der Marktumgebung und maschinelles Lernen.

Für Trader, die diese Strategie verwenden möchten, ist es empfehlenswert, zuerst die Performance der Strategie unter verschiedenen Markteinstellungen und Parameter zu erfassen, indem sie zurückgespürt werden, und dann die Parameter schrittweise anzupassen und zu optimieren, um sie an bestimmte Handelsstile und Marktumgebungen anzupassen. Am wichtigsten ist, dass die Strategie als ein Instrument in der Handels-Toolbox betrachtet wird, nicht als ein isoliertes System, das in Kombination mit anderen Analysemethoden und Risikomanagementprinzipien verwendet wird, um sein Potenzial zu maximieren.

Strategiequellcode
/*backtest
start: 2024-03-03 00:00:00
end: 2024-05-01 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Fibonacci-Only Strategi V2", overlay=true)

timeframe = input.timeframe("15", "Select Timeframe", options=["1", "5", "15", "30", "60", "240", "D"])
use_break_strategy = input(true, "Use Break Strategy")
stop_loss_percent = input.float(1.0, "Stop Loss %", minval=0.1, maxval=2.0, step=0.1)
use_atr_for_sl = input(true, "Use ATR for Stop Loss")
atr_multiplier = input.float(2.0, "ATR Multiplier for SL", minval=0.5, maxval=5.0, step=0.1)
use_trailing_stop = input(true, "Use Trailing Stop")
trailing_stop_percent = input.float(1.5, "Trailing Stop %", minval=0.1, maxval=5.0, step=0.1)

pattern_length = input.int(5, "Candle Pattern Length", minval=3, maxval=10)
similarity_threshold = input.float(0.7, "Pattern Similarity Threshold", minval=0.6, maxval=0.95)
lookback_window = input.int(93, "Historical Lookback Window", minval=10, maxval=93)

stat_period = input.int(50, "Statistical Period", minval=20, maxval=200)
stat_weight = input.float(0.5, "Statistical Confirmation Weight", minval=0.1, maxval=1.0, step=0.1)

fib_high = ta.highest(high, 93)
fib_low = ta.lowest(low, 93)
fib_diff = fib_high - fib_low
fib_19 = fib_high - fib_diff * 0.19
fib_8256 = fib_high - fib_diff * 0.8256
fib_19_reverse = fib_low + fib_diff * 0.19

plot(fib_8256, color=color.purple, style=plot.style_line, title="82.56% Fib")
plot(fib_19_reverse, color=color.orange, style=plot.style_line, title="19% Fib (Low to High)")

fib_19_touch = low[1] > fib_19 and low <= fib_19
fib_8256_touch = high[1] < fib_8256 and high >= fib_8256
fib_19_break = close < fib_19 and open > fib_19
fib_8256_break = close > fib_8256 and open < fib_8256
fib_19_reverse_touch = high[1] < fib_19_reverse and high >= fib_19_reverse
fib_19_reverse_break = close > fib_19_reverse and open < fib_19_reverse

bull_confirmation = close > open
bear_confirmation = close < open

getMedianAndQuartiles(src, len) =>
    values = array.new_float(0)
    for i = 0 to len - 1
        array.push(values, src[i])
    array.sort(values)
    size = array.size(values)
    median = size % 2 == 1 ? array.get(values, math.floor(size / 2)) : (array.get(values, size / 2 - 1) + array.get(values, size / 2)) / 2
    q1_idx = math.floor(size / 4)
    q3_idx = math.floor(3 * size / 4)
    q1 = array.get(values, q1_idx)
    q3 = array.get(values, q3_idx)
    [median, q1, q3]

[price_median, price_q1, price_q3] = getMedianAndQuartiles(close, stat_period)
iqr = price_q3 - price_q1
upper_bound = price_q3 + 1.5 * iqr
lower_bound = price_q1 - 1.5 * iqr

stat_bull_signal = close > price_median and close[1] <= price_median
stat_bear_signal = close < price_median and close[1] >= price_median
stat_strong_bull = close > price_q3 and close[1] <= price_q3
stat_strong_bear = close < price_q1 and close[1] >= price_q1
stat_extreme_bull = close > upper_bound
stat_extreme_bear = close < lower_bound

long_condition_fib_touch = (fib_19_touch or fib_19_reverse_touch) and bull_confirmation
long_condition_fib_break = use_break_strategy and (fib_19_break or fib_19_reverse_break) and bull_confirmation

short_condition_fib_touch = fib_19_touch and bear_confirmation
short_condition_fib_break = use_break_strategy and fib_19_break and bear_confirmation

getPatternSignature(start_idx, len) =>
    pattern = array.new_float(len)
    
    for i = 0 to len - 1
        if close[start_idx + i] > open[start_idx + i]
            array.set(pattern, i, 1.0)
        else if close[start_idx + i] < open[start_idx + i]
            array.set(pattern, i, -1.0)
        else
            array.set(pattern, i, 0.0)
    
    pattern

calcSimilarity(current_pattern, hist_pattern) =>
    matches = 0.0
    
    for i = 0 to array.size(current_pattern) - 1
        if array.get(current_pattern, i) == array.get(hist_pattern, i)
            matches := matches + 1.0
    
    matches / array.size(current_pattern)

findBestMatch() =>
    curr_pattern = getPatternSignature(1, pattern_length)
    
    best_idx = -1
    best_sim = 0.0
    direction = 0
    
    for i = pattern_length + 2 to lookback_window + 1
        if i < pattern_length * 2
            continue
            
        hist_pattern = getPatternSignature(i, pattern_length)
        sim = calcSimilarity(curr_pattern, hist_pattern)
        
        if sim > best_sim and sim >= similarity_threshold
            best_sim := sim
            best_idx := i
            
            next_close = close[i - pattern_length - 1]
            curr_close = close[i - pattern_length]
            
            if next_close > curr_close
                direction := 1
            else if next_close < curr_close
                direction := -1
    
    [best_idx, best_sim, direction]

var latest_pattern_sim = 0.0
var pattern_direction = 0

if barstate.isconfirmed
    [idx, sim, dir] = findBestMatch()
    
    if sim >= similarity_threshold
        latest_pattern_sim := sim
        pattern_direction := dir

calculateStatWeight(stat_signal, stat_strong, stat_extreme) =>
    weight = 0.0
    if stat_signal
        weight := stat_weight * 0.5
    if stat_strong
        weight := weight + stat_weight * 0.3
    if stat_extreme
        weight := weight + stat_weight * 0.2
    weight

stat_bull_weight = calculateStatWeight(stat_bull_signal, stat_strong_bull, stat_extreme_bull)
stat_bear_weight = calculateStatWeight(stat_bear_signal, stat_strong_bear, stat_extreme_bear)

long_condition = (long_condition_fib_touch or long_condition_fib_break) and 
                 (pattern_direction == 1 or pattern_direction == 0)

short_condition = (short_condition_fib_touch or short_condition_fib_break) and 
                  (pattern_direction == -1 or pattern_direction == 0) and
                  stat_bear_weight > 0

atr = ta.atr(14)

if long_condition
    strategy.entry("Long", strategy.long)

if short_condition
    strategy.entry("Short", strategy.short)

var float long_stop_loss = na
var float short_stop_loss = na

if strategy.position_size > 0
    long_stop_loss := use_atr_for_sl ? strategy.position_avg_price - atr * atr_multiplier : strategy.position_avg_price * (1 - stop_loss_percent / 100)

if strategy.position_size < 0
    short_stop_loss := use_atr_for_sl ? strategy.position_avg_price + atr * atr_multiplier : strategy.position_avg_price * (1 + stop_loss_percent / 100)

take_profit_levels = array.new_float(7)
for i = 0 to 6
    tp_percent = 1 + (i + 1) * 0.5 / 100
    array.set(take_profit_levels, i, tp_percent * strategy.position_avg_price)

if strategy.position_size > 0
    if use_trailing_stop
        trail_price = high - (high - strategy.position_avg_price) * trailing_stop_percent / 100
        strategy.exit("Long TS", "Long", stop=math.max(trail_price, long_stop_loss))
    else
        strategy.exit("Long SL", "Long", stop=long_stop_loss)
    
    for i = 0 to 6
        long_tp_price = array.get(take_profit_levels, i)
        strategy.exit("Long TP" + str.tostring(i+1), "Long", limit=long_tp_price, qty_percent=14.28)

if strategy.position_size < 0
    if use_trailing_stop
        trail_price = low + (strategy.position_avg_price - low) * trailing_stop_percent / 100
        strategy.exit("Short TS", "Short", stop=math.min(trail_price, short_stop_loss))
    else
        strategy.exit("Short SL", "Short", stop=short_stop_loss)
    
    for i = 0 to 6
        short_tp_price = array.get(take_profit_levels, i)
        strategy.exit("Short TP" + str.tostring(i+1), "Short", limit=short_tp_price, qty_percent=14.28)

bgcolor(long_condition ? color.new(color.green, 80) : short_condition ? color.new(color.red, 80) : na)

plotarrow(long_condition ? 1 : short_condition ? -1 : 0, title="Signal Direction", colorup=color.green, colordown=color.red, minheight=10, maxheight=20)

long_touch_marker = long_condition and long_condition_fib_touch ? low - atr : na
long_break_marker = long_condition and long_condition_fib_break ? low - atr * 1.5 : na
short_touch_marker = short_condition and short_condition_fib_touch ? high + atr : na
short_break_marker = short_condition and short_condition_fib_break ? high + atr * 1.5 : na

plotshape(long_touch_marker, style=shape.circle, color=color.green, size=size.normal, title="Long Touch Marker", location=location.absolute)
plotshape(long_break_marker, style=shape.xcross, color=color.green, size=size.normal, title="Long Break Marker", location=location.absolute)
plotshape(short_touch_marker, style=shape.circle, color=color.red, size=size.normal, title="Short Touch Marker", location=location.absolute)
plotshape(short_break_marker, style=shape.xcross, color=color.red, size=size.normal, title="Short Break Marker", location=location.absolute)

plotshape(stat_bear_signal, style=shape.triangledown, color=color.red, size=size.tiny, title="Statistical Bear Signal", location=location.abovebar)

if barstate.islast
    var table info = table.new(position.top_right, 4, 5, color.black, color.white, 2, color.gray, 2)
    
    table.clear(info, 0, 0, 3, 4)
    
    table.cell(info, 0, 0, "Fibonacci-Pattern with Stats", bgcolor=color.blue, text_color=color.white)
    table.cell(info, 0, 1, "Fib Status", bgcolor=color.blue, text_color=color.white)
    
    fib_status = "NEUTRAL"
    fib_color = color.gray
    
    if long_condition_fib_touch or long_condition_fib_break
        fib_status := "LONG"
        fib_color := color.green
    else if short_condition_fib_touch or short_condition_fib_break
        fib_status := "SHORT"
        fib_color := color.red
        
    table.cell(info, 1, 1, fib_status, bgcolor=fib_color, text_color=color.white)
    
    table.cell(info, 0, 2, "Pattern", bgcolor=color.blue, text_color=color.white)
    
    pattern_status = "NEUTRAL"
    pattern_color = color.gray
    
    if pattern_direction == 1
        pattern_status := "LONG"
        pattern_color := color.green
    else if pattern_direction == -1
        pattern_status := "SHORT"
        pattern_color := color.red
        
    table.cell(info, 1, 2, pattern_status, bgcolor=pattern_color, text_color=color.white)
    table.cell(info, 2, 2, pattern_direction != 0 ? str.tostring(math.round(latest_pattern_sim * 100)) + "%" : "N/A", bgcolor=color.gray, text_color=color.white)
    
    table.cell(info, 0, 3, "Statistics", bgcolor=color.blue, text_color=color.white)
    
    stat_status = "NEUTRAL"
    stat_color = color.gray
    
    if stat_bull_weight > 0
        stat_status := "BULL"
        stat_color := color.green
    else if stat_bear_weight > 0
        stat_status := "BEAR"
        stat_color := color.red
        
    table.cell(info, 1, 3, stat_status, bgcolor=stat_color, text_color=color.white)
    table.cell(info, 2, 3, stat_bull_weight > 0 ? str.tostring(math.round(stat_bull_weight * 100)) + "%" : 
                          stat_bear_weight > 0 ? str.tostring(math.round(stat_bear_weight * 100)) + "%" : "0%", 
                          bgcolor=color.gray, text_color=color.white)
    
    table.cell(info, 0, 4, "Combined", bgcolor=color.blue, text_color=color.white)
    
    combined_status = "NEUTRAL"
    combined_color = color.gray
    
    if long_condition
        combined_status := "LONG"
        combined_color := color.green
    else if short_condition
        combined_status := "SHORT"
        combined_color := color.red
        
    table.cell(info, 1, 4, combined_status, bgcolor=combined_color, text_color=color.white)

var label_id = label.new(na, na, "", color=color.gray, style=label.style_label_down, textcolor=color.white)

if long_condition and barstate.isconfirmed
    label.set_xy(label_id, bar_index, high)
    label.set_text(label_id, "LONG\n" + 
                           (long_condition_fib_touch ? "Touch" : "Break") + 
                           (pattern_direction == 1 ? " + Pattern " + str.tostring(math.round(latest_pattern_sim * 100)) + "%" : "") +
                           "\nStat: " + str.tostring(math.round(stat_bull_weight * 100)) + "%")
    label.set_color(label_id, color.green)
    label.set_style(label_id, label.style_label_down)

if short_condition and barstate.isconfirmed
    label.set_xy(label_id, bar_index, low)
    label.set_text(label_id, "SHORT\n" + 
                           (short_condition_fib_touch ? "Touch" : "Break") + 
                           (pattern_direction == -1 ? " + Pattern " + str.tostring(math.round(latest_pattern_sim * 100)) + "%" : "") +
                           "\nStat: " + str.tostring(math.round(stat_bear_weight * 100)) + "%")
    label.set_color(label_id, color.red)
    label.set_style(label_id, label.style_label_up)

alertcondition(long_condition, title="Long Entry", message="Long entry signal detected")
alertcondition(short_condition, title="Short Entry", message="Short entry signal detected")