2
konzentrieren Sie sich auf
319
Anhänger

Eine kurze Diskussion über die Entwicklungsgeschichte eines Kryptowährungs-Trendindikators

Erstellt in: 2025-06-23 16:08:06, aktualisiert am: 2025-06-24 09:54:54
comments   0
hits   516

Eine kurze Diskussion über die Entwicklungsgeschichte eines Kryptowährungs-Trendindikators

Im Bereich der technischen Analyse ist die Identifizierung der vier zentralen Preisstrukturmuster „höhere Hochs (HH)“, „höhere Tiefs (HL)“, „niedrigere Hochs (LH)“ und „niedrigere Tiefs (LL)“ der Eckpfeiler für die Beurteilung der Markttrendrichtung und potenzieller Umkehrpunkte. Diese Muster offenbaren intuitiv das dynamische Gleichgewicht der Marktangebots- und -nachfragekräfte und die vorherrschende Stimmung (bullisch oder bärisch) und bieten eine objektive Grundlage für Handelsentscheidungen.

Kernmerkmale von Bullen- und Bärenmärkten

Eine kurze Diskussion über die Entwicklungsgeschichte eines Kryptowährungs-Trendindikators

Bullischer TrendHöhere Hochs und höhere Tiefs sind wichtige Indikatoren für einen Aufwärtstrend. Höhere Hochs treten auf, wenn ein Preisgipfel den vorherigen übersteigt. Dies deutet darauf hin, dass Käufer die Preise in die Höhe treiben und damit die Marktstärke widerspiegeln. Höhere Tiefs treten auf, wenn ein Preisrückgang auf einem höheren Niveau als dem vorherigen endet. Dies deutet darauf hin, dass der Markt seine Aufwärtsdynamik beibehält. Zusammen deuten diese Muster auf einen starken Aufwärtstrend hin, der im Chart durch eine Reihe steigender Hochs und Tiefs gekennzeichnet ist.

Bärischer Trend: Niedrigere Hochs und niedrigere Tiefs deuten auf einen rückläufigen Trend hin. Niedrigere Hochs entstehen, wenn ein Preisgipfel das Niveau des vorherigen Gipfels nicht erreicht, was auf einen nachlassenden Kaufdruck hindeutet. Niedrigere Tiefs entstehen, wenn die Preise unter den vorherigen Tiefststand fallen, was auf erhöhten Verkaufsdruck und Marktschwäche hindeutet. Diese Muster sind wichtig, um Abwärtstrends zu erkennen, die in einem Preischart durch eine Reihe fallender Hochs und Tiefs gekennzeichnet sind.

Die Notwendigkeit quantitativer Trendidentifikation

Der Kryptowährungsmarkt ist geprägt von hoher Volatilität, 247-Handel und starken, stimmungsgetriebenen Trends. In einem solchen Umfeld ist es umso wichtiger, Trendmuster präzise zu erkennen. Durch die Quantifizierung der Kontinuität von „höheren Hochs, höheren Tiefs“ oder „niedrigeren Hochs, niedrigeren Tiefs“ lassen sich Markttrends präziser identifizieren und bieten eine objektive Grundlage für Handelsentscheidungen.

Warum die FMZ-Plattform wählen?

Die FMZ Inventor Quantitative Platform bietet eine ideale Umgebung für die Entwicklung solcher Indikatoren:

Datenvorteil

  • Kostenlose Bereitstellung historischer Daten der wichtigsten Börsen
  • Vollständige K-Line-Daten zu gängigen Kryptowährungen
  • Zuverlässige Datenqualität und zeitnahe Updates

Entwicklungsumgebung

  • Leichtgewichtige und schnelle Codebearbeitungsseite
  • Unterstützt mehrere Programmiersprachen wie Python
  • Integrierte umfangreiche Funktionsbibliothek für technische Analysen

Testkomfort

  • Vollständige Backtesting-Funktion
  • Echtzeitüberwachung und Visualisierung
  • Praktisch für die gleichzeitige Analyse mehrerer Währungen

Aufgrund dieser Vorteile wurde die FMZ-Plattform zur Untersuchung der Trendindikatoren für Hoch- und Tiefpreiskontinuität ausgewählt.

Merkmale des Kryptowährungsmarktes

Bevor wir einen Indikator entwerfen, müssen wir die Unterschiede zwischen dem Kryptowährungsmarkt und dem Aktienmarkt berücksichtigen:

  • 24-Stunden-Handel, keine Marktschließungen
  • Die Volatilität ist enorm und es ist nicht ungewöhnlich, dass der Markt an einem Tag um 20 % steigt oder fällt.
  • Es gibt viele Kleinanleger, und emotionales Handeln ist offensichtlich
  • Die historischen Daten reichen nicht lange zurück, die meisten Währungen haben nur wenige Jahre

Basierend auf diesen Merkmalen sieht das Entwurfsschema wie folgt aus:

  • Durch die Verwendung täglicher Daten können Intraday-Störungen herausgefiltert werden, ohne hinterherzuhinken
  • Legen Sie 3 Tage als Mindestbestätigungszeitraum fest, um Genauigkeit und Aktualität in Einklang zu bringen
  • Überwachen Sie mehrere gängige Währungen gleichzeitig zur Überprüfung

Implementiert auf der FMZ-Plattform

Kernalgorithmusdesign

Nach eingehender Überlegung haben wir eine Analysemethode basierend auf den „vollständigen Daten von gestern“ gewählt, um Fehleinschätzungen aufgrund unvollständiger Daten des Tages zu vermeiden. Die Kerndatenstruktur sieht wie folgt aus:

# 每个币种的数据都单独存储
data = defaultdict(lambda: {
    "daily_records": [],  # 存储每日的昨天数据
    "trend_buffer": [],   # 当前趋势缓冲区
    "patterns": [],       # 完整的趋势模式
    "current_trend": None, # 当前趋势状态
    "last_processed_time": 0
})

Die Kernlogik der Trenderkennung

Wichtige Funktionen zur Trendermittlung:

def is_trend_continuing(self, buffer, trend_type):
    """检查趋势是否持续"""
    if len(buffer) < 2:
        return False
    
    curr = buffer[-1]
    prev = buffer[-2]
    
    if trend_type == "BULL":
        # 牛市:High和Low都上升
        return curr["High"] > prev["High"] and curr["Low"] > prev["Low"]
    elif trend_type == "BEAR":
        # 熊市:High和Low都下降
        return curr["High"] < prev["High"] and curr["Low"] < prev["Low"]
    
    return False

Trendstatusverwaltung:

def analyze_trend_state(self, symbol):
    """分析趋势状态"""
    storage = data[symbol]
    buffer = storage["trend_buffer"]
    current_trend = storage["current_trend"]
    
    if current_trend is None:
        # 尝试检测新趋势
        new_trend = self.detect_new_trend(buffer)
        if new_trend:
            storage["current_trend"] = {
                "type": new_trend,
                "start_time": buffer[-2]["Time"],
                "start_price": buffer[-2]["Close"],
                "consecutive_days": 1
            }
    else:
        # 检查现有趋势是否继续
        if self.is_trend_continuing(buffer, current_trend["type"]):
            current_trend["consecutive_days"] += 1
        else:
            # 趋势中断,记录完整模式
            if current_trend["consecutive_days"] >= MIN_CONSECUTIVE:
                # 保存趋势记录
                self.save_pattern(symbol, current_trend, buffer)

Die zentrale Designidee besteht darin, hohe und niedrige Punkte zu forderngleichzeitigErfüllen Sie kontinuierliche Änderungen und erreichen Sie eine Mindestbestätigungsfrist von 3 Tagen, was Fehleinschätzungen erheblich reduzieren kann.Die Renditestatistik ist die Zunahme oder Abnahme vom Eröffnungskurs zu Beginn des Trends bis zum Schlusskurs am Ende des Trends.

Tatsächliche Betriebsergebnisse und Datenanalyse

Basierend auf dem historischen Daten-Backtest der FMZ-Plattform von 2020 bis Juni 2025 ist die tatsächliche Performance der drei Mainstream-Währungen in den letzten 10 vollständigen Trendzyklen wie folgt:

Analyse der ETH-Testergebnisse

Typ Startdatum Enddatum Dauer Ertrag
Baisse 2025-05-29 2025-06-01 3 -5.38%
Hausse 2025-05-19 2025-05-22 3 6.73%
Hausse 2025-05-06 2025-05-09 3 26.94%
Hausse 2025-04-24 2025-04-27 3 -0.17%
Baisse 2025-03-25 2025-03-30 5 -13.13%
Hausse 2025-03-21 2025-03-24 3 5.04%
Baisse 2025-01-06 2025-01-10 4 -10.86%
Hausse 2025-01-01 2025-01-06 5 11.2%
Baisse 2024-12-17 2024-12-20 3 -15.5%
Baisse 2024-12-07 2024-12-10 3 -9.96%

ETH-Leistungsmerkmale

  • Die herausragendste Entwicklung war der Bullenmarkt vom 6. bis 9. Mai, der in nur drei Tagen einen deutlichen Anstieg von 26,94 % verzeichnete.
  • Der durchschnittliche Bullenmarkt dauert 3,4 Tage und erzielt eine durchschnittliche Rendite von 9,97 %.
  • Der durchschnittliche Bärenmarkt dauert 3,6 Tage und weist einen durchschnittlichen Rückgang von -10,97 % auf.
  • Extrem volatil, die instabilste der drei Währungen

Analyse der BTC-Testergebnisse

Typ Startdatum Enddatum Dauer Ertrag
Hausse 2025-06-06 2025-06-11 5 7.78%
Baisse 2025-06-03 2025-06-06 3 -0.78%
Baisse 2025-05-27 2025-05-31 4 -4.37%
Baisse 2025-05-22 2025-05-25 3 -2.63%
Hausse 2025-05-06 2025-05-09 3 8.4%
Baisse 2025-05-02 2025-05-05 3 -2.37%
Hausse 2025-04-20 2025-04-23 3 10.07%
Hausse 2025-04-09 2025-04-13 4 10.25%
Baisse 2025-03-26 2025-03-29 3 -5.53%
Baisse 2025-03-08 2025-03-11 3 -5.81%

BTC-Leistungsmerkmale

  • Bärenmärkte dominieren, wobei 6 von 10 Zyklen Bärenmärkte sind
  • Der durchschnittliche Bullenmarkt dauert 3,75 Tage und erzielt eine durchschnittliche Rendite von 9,13 %.
  • Der durchschnittliche Bärenmarkt dauerte 3,17 Tage und der durchschnittliche Rückgang betrug -3,58 %.
  • Die Gesamtperformance ist relativ ausgewogen, mit moderater Volatilität

Analyse der BNB-Testergebnisse

Typ Startdatum Enddatum Dauer Ertrag
Hausse 2025-06-06 2025-06-11 5 5.46%
Baisse 2025-06-03 2025-06-06 3 -2.73%
Hausse 2025-05-19 2025-05-22 3 4.63%
Hausse 2025-05-05 2025-05-10 5 11.95%
Hausse 2025-04-20 2025-04-23 3 2.44%
Hausse 2025-04-09 2025-04-12 3 7.63%
Hausse 2025-03-14 2025-03-17 3 8.18%
Baisse 2025-03-08 2025-03-11 3 -7.49%
Hausse 2025-02-10 2025-02-13 3 9.66%
Baisse 2025-01-31 2025-02-03 3 -12.2%

BNB-Leistungsmerkmale

  • Bullenmärkte dominieren, 7 von 10 Zyklen sind Bullenmärkte
  • Der Bullenmarkt dauerte im Durchschnitt 3,43 Tage und erzielte eine durchschnittliche Rendite von 7,14 %.
  • Der durchschnittliche Bärenmarkt dauert 3 Tage, mit einem durchschnittlichen Rückgang von -7,47 %
  • Die Performance ist am stabilsten, mit relativ wenigen extremen Marktbedingungen

Einige interessante Erkenntnisse hinter den Daten

Bei der Analyse der Daten der letzten zehn Trendzyklen dieser drei Währungen wurden einige interessante Phänomene entdeckt.

Über die Dauer des Trends

Die meisten Trends enden nach etwa 3–5 Tagen, was eigentlich dem allgemeinen Eindruck vom Kryptowährungsmarkt entspricht – er ändert sich sehr schnell. Die ursprüngliche Mindestbestätigungsfrist von 3 Tagen ist auch heute noch durchaus sinnvoll, da sie zufällige Schwankungen innerhalb des Tages herausfiltert und keine Chancen durch zu langes Warten verpasst. BTC ist in dieser Hinsicht am stabilsten, und die Dauer des Trends ist relativ regelmäßig.

Die Unterschiede im “Charakter” verschiedener Währungen

Diese drei Währungen haben jeweils ihre eigenen Besonderheiten. Die jüngste Performance von ETH ist tatsächlich bemerkenswerter, und möglicherweise liegt es daran, dass ETH zu lange stagnierte, sodass die Volatilität bei der Erholung sehr hoch ist. Vom 6. bis 9. Mai konnte ETH innerhalb von drei Tagen um 26,94 % steigen, was überraschend ist. Gleichzeitig gibt es aber auch einen Bullenmarkt von -0,17 %, der die Leute zum Nachdenken bringt. BTC ist zweifellos stabiler. Obwohl es in letzter Zeit häufiger Bärenmärkte gab, ist die Volatilität noch akzeptabel. BNB hat mit einem Bullenmarktanteil von 70 % für viele Überraschungen gesorgt, und das Risiko-Rendite-Verhältnis scheint das beste zu sein.

Einige Beobachtungen zur Trendbeurteilung

Den Ergebnissen zufolge erfasste dieser einfache Indikator dennoch einige Schlüsselmomente. Beispielsweise den Anstieg von ETH um 26,94 %, die zahlreichen Bullenmarktzyklen von BTC und BNB sowie mehrere rechtzeitige Erinnerungen an Bärenmärkte. Natürlich gibt es auch einige verwirrende Punkte, wie beispielsweise den „Bullenmarkt“ von -0,17 %, der zeigt, dass der Algorithmus noch Verbesserungspotenzial hat.

Wozu dient dieses Tool?

Was es für Sie tun kann

Ehrlich gesagt hilft Ihnen dieses Tool hauptsächlichFinden Sie heraus, wie der Markt jetzt ist

  • Sagen Sie, ob der aktuelle Trend steigt, fällt oder seitwärts schwankt
  • Behalten Sie im Auge, wie lange dieser Trend bereits anhält und wie er sich entwickelt.
  • Bieten Sie eine relativ objektive Grundlage für Ihr Urteil, die nicht ausschließlich auf Gefühlen beruht
  • Den tatsächlichen Daten zufolge ist es recht effektiv bei der Erkennung kurzfristiger Trends von 3–5 Tagen.

Was es nicht kann

Es muss klargestellt werden, dass dieses InstrumentEs dient definitiv nicht dazu, die Zukunft vorherzusagen.

  • Es wird Ihnen nicht sagen, ob es morgen steigen oder fallen wird.
  • Ich kann nicht vorhersagen, wie stark es steigen oder fallen wird.
  • Es kann Ihre eigene Risikokontrolle und Ihr Fondsmanagement nicht ersetzen
  • Wenn sich der Markt seitwärts bewegt, kann es zu verwirrenden Signalen kommen

Einige Probleme, die während der Verwendung aufgetreten sind

Im tatsächlichen Betrieb wurden auch einige Einschränkungen festgestellt:

  1. Reagiert etwas langsam: Da die Bestätigung 3 Tage dauert, ist es grundsätzlich unmöglich, den Trend in den ersten Tagen zu erfassen

  2. Manchmal sehe ich die falsche Person:Wie der „Bullenmarkt“ von ETH um 0,17 % zeigt, kann das Urteil des Algorithmus in einigen Sonderfällen falsch sein.

  3. Der Seitwärtsmarkt bereitet Kopfschmerzen:Wenn der Markt innerhalb eines Bereichs schwankt, kann das Signal häufig wechseln, was ärgerlich ist

  4. Allein der Blick auf den Preis ist etwas eintönig: Nichtberücksichtigung ebenso wichtiger Faktoren wie Handelsvolumen und Nachrichten

Wie können wir es als nächstes verbessern?

Aufgrund der Beobachtungen in diesem Zeitraum denke ich, dass es mehrere Möglichkeiten gibt, es zu versuchen:

Passen Sie die Parameter für verschiedene Währungen an: Für eine volatile Währung wie ETH können strengere Bestätigungsbedingungen erforderlich sein, während eine relativ stabile Währung wie BNB die Bestätigungszeit möglicherweise verkürzen kann. Sie können auch eine Mindestrenditeschwelle festlegen, um Signale mit zu niedriger Rendite herauszufiltern.

Fügen Sie einige Hilfsurteile hinzu: Beispielsweise können Änderungen des Handelsvolumens kombiniert werden, um zu überprüfen, ob der Trend zuverlässig ist, oder die Preisschwankungsbreite berücksichtigt werden, um nicht durch geringfügige Änderungen in die Irre geführt zu werden.

Optimierung des Algorithmus selbst: Verbessern Sie die Beurteilungslogik bei Trendunterbrechungen, um Fehleinschätzungen zu reduzieren. Fügen Sie dem Trend eine Stärkebewertung hinzu, um zwischen starken und schwachen Trends zu unterscheiden. Richten Sie einen speziellen Handhabungsmechanismus für einige abnormale Situationen ein.

Rückblick auf diese Erkundung

Dieses einfache Marktüberwachungstool verwandelt einige traditionelle Konzepte der technischen Analyse in ein automatisiertes System. Mit dem Komfort der FMZ-Plattform haben wir erfolgreich ein Tool entwickelt, das den Status des Kryptowährungsmarktes in Echtzeit überwachen kann.

Sein Hauptwert liegt darin, dass er eine relativ objektive Aufzeichnung der Marktbedingungen liefert, die uns helfen kann:

  • Verfügen Sie über ein Makroverständnis der gesamten Marktsituation
  • Filtern Sie einige beliebte Währungen anhand historischer Daten
  • Bereitstellung von Datenunterstützung für tiefergehende Analysen

Da immer mehr Daten gesammelt werden, wird dieses Tool immer wertvoller. Natürlich ist es nur eines von vielen Analysetools und kann nicht alle Probleme lösen, aber als Ausgangspunkt halte ich es dennoch für sehr interessant.

'''backtest
start: 2020-01-01 00:00:00
end: 2025-06-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
'''

import json
from datetime import datetime
from collections import defaultdict

# 配置参数
SYMBOLS = ["ETH_USDT", "BTC_USDT", "BNB_USDT"]
MIN_CONSECUTIVE = 3  # 最少连续天数
MAX_HISTORY = 1000  # 最大历史记录数

# 全局数据存储
data = defaultdict(lambda: {
    "daily_records": [],  # 存储每日的昨天数据
    "trend_buffer": [],   # 当前趋势缓冲区
    "patterns": [],       # 完整的趋势模式
    "current_trend": None, # 当前趋势状态
    "last_processed_time": 0
})

class TrendAnalyzer:
    def get_yesterday_data(self, records):
        """获取昨天的完整数据(records[-2])"""
        if len(records) < 2:
            return None
        return records[-2]  # 昨天的完整K线数据
    
    def is_trend_continuing(self, buffer, trend_type):
        """检查趋势是否持续"""
        if len(buffer) < 2:
            return False
        
        curr = buffer[-1]
        prev = buffer[-2]
        
        if trend_type == "BULL":
            # 牛市:High和Low都上升
            return curr["High"] > prev["High"] and curr["Low"] > prev["Low"]
        elif trend_type == "BEAR":
            # 熊市:High和Low都下降
            return curr["High"] < prev["High"] and curr["Low"] < prev["Low"]
        
        return False
    
    def detect_new_trend(self, buffer):
        """从缓冲区检测新趋势"""
        if len(buffer) < 2:
            return None
        
        curr = buffer[-1]
        prev = buffer[-2]
        
        # 检查是否开始牛市趋势
        if curr["High"] > prev["High"] and curr["Low"] > prev["Low"]:
            return "BULL"
        # 检查是否开始熊市趋势
        elif curr["High"] < prev["High"] and curr["Low"] < prev["Low"]:
            return "BEAR"
        
        return None
    
    def process_daily_data(self, symbol, records):
        """处理每日数据"""
        if not records or len(records) < 2:
            return
        
        storage = data[symbol]
        yesterday_data = self.get_yesterday_data(records)
        
        if not yesterday_data or yesterday_data["Time"] <= storage["last_processed_time"]:
            return  # 没有新的昨天数据
        
        # 更新处理时间
        storage["last_processed_time"] = yesterday_data["Time"]
        
        # 添加到每日记录
        storage["daily_records"].append(yesterday_data)
        if len(storage["daily_records"]) > MAX_HISTORY:
            storage["daily_records"] = storage["daily_records"][-MAX_HISTORY:]
        
        # 添加到趋势缓冲区
        storage["trend_buffer"].append(yesterday_data)
        
        # 分析趋势
        self.analyze_trend_state(symbol)
    
    def analyze_trend_state(self, symbol):
        """分析趋势状态"""
        storage = data[symbol]
        buffer = storage["trend_buffer"]
        current_trend = storage["current_trend"]
        
        if len(buffer) < 2:
            return
        
        if current_trend is None:
            # 尝试检测新趋势
            new_trend = self.detect_new_trend(buffer)
            if new_trend:
                storage["current_trend"] = {
                    "type": new_trend,
                    "start_time": buffer[-2]["Time"],  # 趋势从前一天开始
                    "start_price": buffer[-2]["Close"],
                    "start_open": buffer[-2]["Open"],
                    "consecutive_days": 1
                }
                Log(f"{symbol} 检测到{new_trend}趋势开始")
            else:
                # 没有趋势,只保留最近的数据
                storage["trend_buffer"] = buffer[-1:]
        else:
            # 检查现有趋势是否继续
            if self.is_trend_continuing(buffer, current_trend["type"]):
                # 趋势继续
                current_trend["consecutive_days"] += 1
                
                # 检查是否达到最小天数要求
                if current_trend["consecutive_days"] == MIN_CONSECUTIVE:
                    trend_name = "牛市" if current_trend["type"] == "BULL" else "熊市"
                    Log(f"{symbol} {trend_name}趋势确认! 连续{MIN_CONSECUTIVE}天")
                
            else:
                # 趋势中断
                if current_trend["consecutive_days"] >= MIN_CONSECUTIVE:
                    # 记录完整的趋势
                    end_data = buffer[-2]  # 趋势在前一天结束
                    duration = current_trend["consecutive_days"]
                    start_price = current_trend["start_open"]
                    end_price = end_data["Close"]
                    return_pct = round((end_price - start_price) / start_price * 100, 2)
                    
                    storage["patterns"].append({
                        "trend": current_trend["type"],
                        "start_time": current_trend["start_time"],
                        "end_time": end_data["Time"],
                        "duration": duration,
                        "return": return_pct
                    })
                    
                    trend_name = "牛市" if current_trend["type"] == "BULL" else "熊市"
                    Log(f"{symbol} {trend_name}趋势结束,持续{duration}天,收益{return_pct}%")
                
                # 重置趋势状态,重新开始检测
                storage["current_trend"] = None
                storage["trend_buffer"] = buffer[-2:]  # 保留最近两天数据重新开始
                
                # 立即检测新趋势
                self.analyze_trend_state(symbol)

def generate_tables():
    """生成所有统计表格"""
    tables = []
    
    # 概览表
    overview_rows = []
    for symbol in SYMBOLS:
        storage = data[symbol]
        if not storage["daily_records"]:
            continue
        
        patterns = storage["patterns"]
        current_trend = storage["current_trend"]
        
        # 计算统计数据
        bull_patterns = [p for p in patterns if p["trend"] == "BULL"]
        bear_patterns = [p for p in patterns if p["trend"] == "BEAR"]
        
        stats = {
            "bull_avg_return": round(sum(p["return"] for p in bull_patterns) / len(bull_patterns), 2) if bull_patterns else 0,
            "bear_avg_return": round(sum(p["return"] for p in bear_patterns) / len(bear_patterns), 2) if bear_patterns else 0,
            "bull_avg_days": round(sum(p["duration"] for p in bull_patterns) / len(bull_patterns), 1) if bull_patterns else 0,
            "bear_avg_days": round(sum(p["duration"] for p in bear_patterns) / len(bear_patterns), 1) if bear_patterns else 0
        }
        
        # 当前状态
        current_status = "震荡"
        current_return = 0
        current_days = 0
        consecutive = 0
        
        if current_trend and storage["daily_records"]:
            latest_price = storage["daily_records"][-1]["Close"]
            start_price = current_trend["start_open"]
            current_return = round((latest_price - start_price) / start_price * 100, 2)
            current_days = current_trend["consecutive_days"]
            current_status = "牛市" if current_trend["type"] == "BULL" else "熊市"
            consecutive = current_trend["consecutive_days"]
        
        overview_rows.append([
            symbol.replace("_USDT", ""),
            current_status,
            str(current_days),
            f"{current_return}%",
            str(consecutive),
            str(len(bull_patterns)),
            str(len(bear_patterns)),
            f"{stats['bull_avg_return']}%",
            f"{stats['bear_avg_return']}%",
            f"{stats['bull_avg_days']}天",
            f"{stats['bear_avg_days']}天"
        ])
    
    tables.append({
        "type": "table",
        "title": "每日高低价趋势监控(基于昨日完整数据)",
        "cols": ["币种", "状态", "持续", "收益", "强度", "牛市次数", "熊市次数", "牛市均收益", "熊市均收益", "牛市均天数", "熊市均天数"],
        "rows": overview_rows
    })
    
    # 趋势缓冲区分析表
    buffer_rows = []
    for symbol in SYMBOLS:
        storage = data[symbol]
        buffer = storage["trend_buffer"]
        current_trend = storage["current_trend"]
        
        if not buffer:
            continue
        
        latest_price = buffer[-1]["Close"]
        buffer_size = len(buffer)
        
        # 显示最近几天的High/Low变化
        if len(buffer) >= 2:
            recent_highs = [f"{r['High']:.0f}" for r in buffer[-min(5, len(buffer)):]]
            recent_lows = [f"{r['Low']:.0f}" for r in buffer[-min(5, len(buffer)):]]
            high_trend = " → ".join(recent_highs)
            low_trend = " → ".join(recent_lows)
        else:
            high_trend = f"{buffer[-1]['High']:.0f}"
            low_trend = f"{buffer[-1]['Low']:.0f}"
        
        trend_status = "无趋势"
        if current_trend:
            trend_status = f"{'牛市' if current_trend['type'] == 'BULL' else '熊市'}{current_trend['consecutive_days']}天"
        
        buffer_rows.append([
            symbol.replace("_USDT", ""),
            f"{latest_price:.2f}",
            trend_status,
            str(buffer_size),
            high_trend,
            low_trend
        ])
    
    tables.append({
        "type": "table",
        "title": "趋势缓冲区状态",
        "cols": ["币种", "价格", "当前趋势", "缓冲区", "High变化", "Low变化"],
        "rows": buffer_rows
    })
    
    # 历史记录表
    for symbol in SYMBOLS:
        patterns = [p for p in data[symbol]["patterns"] if p["duration"] >= MIN_CONSECUTIVE]
        coin_name = symbol.replace("_USDT", "")
        
        if not patterns:
            tables.append({
                "type": "table",
                "title": f"{coin_name} 历史趋势",
                "cols": ["类型", "开始", "结束", "天数", "收益"],
                "rows": [["无数据", "-", "-", "-", "-"]]
            })
            continue
        
        rows = []
        for p in sorted(patterns, key=lambda x: x["end_time"], reverse=True)[:10]:  # 只显示最近10条
            rows.append([
                "牛市" if p["trend"] == "BULL" else "熊市",
                datetime.fromtimestamp(p["start_time"] / 1000).strftime('%Y-%m-%d'),
                datetime.fromtimestamp(p["end_time"] / 1000).strftime('%Y-%m-%d'),
                str(p["duration"]),
                f"{p['return']}%"
            ])
        
        tables.append({
            "type": "table",
            "title": f"{coin_name} 历史趋势",
            "cols": ["类型", "开始", "结束", "天数", "收益"],
            "rows": rows
        })
    
    return tables

def main():
    analyzer = TrendAnalyzer()
    
    Log("趋势分析系统启动 - 基于昨日完整数据的逐日分析")
    Log("牛市定义: High和Low连续上升≥3天")
    Log("熊市定义: High和Low连续下降≥3天")
    
    while True:
        try:
            # 处理每个币种的数据
            for symbol in SYMBOLS:
                records = exchange.GetRecords(symbol)
                analyzer.process_daily_data(symbol, records)
            
            # 生成并显示表格
            tables = generate_tables()
            LogStatus('`' + json.dumps(tables) + '`')
            
        except Exception as e:
            Log(f"错误: {str(e)}")
        
        Sleep(1000 * 60 * 60)  # 24小时

def onexit():
    total = sum(len(data[s]["patterns"]) for s in SYMBOLS)
    Log(f"系统停止, 共识别 {total} 个趋势模式")