Files
ai_playgroud/bitcoin_trading/bitcoin_trader.py
T
Claude ef7ea500a9 Add Bitcoin Trading Signal System with MACD and News Sentiment Analysis
- Implement comprehensive Bitcoin trading signal system
- Add MACD (Moving Average Convergence Divergence) indicator
- Integrate news sentiment analysis from CryptoCompare
- Combine technical analysis with market sentiment
- Generate trading recommendations (Strong Buy, Buy, Hold, Sell, Strong Sell)

Features:
- Real-time Bitcoin price data from Binance and CoinGecko APIs
- Historical data analysis with MACD indicator
- News sentiment analysis with keyword-based scoring
- Weighted signal combination (60% MACD, 40% Sentiment)
- Confidence scoring for each recommendation
- Detailed reasoning for trading signals
- CLI interface with verbose and quick modes

Components:
- data_fetcher.py: Bitcoin price and market data retrieval
- macd_indicator.py: MACD calculation and signal generation
- news_sentiment.py: News analysis and sentiment scoring
- signal_generator.py: Combined signal generation
- bitcoin_trader.py: Main CLI application

Usage:
  python bitcoin_trading/bitcoin_trader.py [--verbose] [--days N] [--quick]

Documentation in bitcoin_trading/README.md
2025-12-02 22:45:17 +00:00

213 lines
7.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Bitcoin Trading Signal System
Hauptprogramm für Bitcoin Trading-Empfehlungen basierend auf MACD und News-Sentiment
"""
import sys
import argparse
from datetime import datetime
from typing import Optional
from data_fetcher import BitcoinDataFetcher
from signal_generator import SignalGenerator
class BitcoinTrader:
"""
Haupt-Klasse für das Bitcoin Trading Signal System
"""
def __init__(self, newsapi_key: Optional[str] = None, verbose: bool = False):
"""
Args:
newsapi_key: Optional NewsAPI-Schlüssel
verbose: Ausführliche Ausgabe
"""
self.data_fetcher = BitcoinDataFetcher()
self.signal_generator = SignalGenerator(newsapi_key=newsapi_key)
self.verbose = verbose
def run_analysis(self, days: int = 30) -> None:
"""
Führt komplette Trading-Analyse durch
Args:
days: Anzahl Tage für historische Daten
"""
print("╔══════════════════════════════════════════════════════════════════╗")
print("║ BITCOIN TRADING SIGNAL SYSTEM v1.0 ║")
print("╚══════════════════════════════════════════════════════════════════╝")
print()
# 1. Lade aktuelle Preisdaten
if self.verbose:
print("📊 Lade aktuelle Bitcoin-Preisdaten...")
current_price = self.data_fetcher.get_current_price()
if not current_price:
print("❌ Fehler: Konnte aktuellen Bitcoin-Preis nicht abrufen!")
sys.exit(1)
if self.verbose:
print(f"✓ Aktueller BTC-Preis: ${current_price:,.2f}")
# 2. Lade historische Daten
if self.verbose:
print(f"📈 Lade historische Daten ({days} Tage)...")
price_df = self.data_fetcher.get_historical_data(days=days)
if price_df.empty:
print("❌ Fehler: Konnte historische Daten nicht abrufen!")
sys.exit(1)
if self.verbose:
print(f"✓ {len(price_df)} Datenpunkte geladen")
# 3. Lade Marktdaten (optional)
if self.verbose:
print("💹 Lade erweiterte Marktdaten...")
market_data = self.data_fetcher.get_market_data()
if market_data and self.verbose:
print(f"✓ Marktdaten geladen")
if market_data.get('price_change_24h'):
change_24h = market_data['price_change_24h']
emoji = "📈" if change_24h > 0 else "📉"
print(f" {emoji} 24h Veränderung: {change_24h:+.2f}%")
# 4. Generiere Trading-Signal
if self.verbose:
print("\n🔍 Analysiere MACD-Indikatoren...")
print("📰 Analysiere News-Sentiment...")
print("🎯 Generiere Trading-Signal...\n")
signal = self.signal_generator.generate_signal(price_df, current_price)
# 5. Zeige Empfehlung
recommendation = self.signal_generator.get_recommendation_text(signal)
print(recommendation)
# 6. Zusätzliche Marktinformationen
if market_data and self.verbose:
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print("📊 ZUSÄTZLICHE MARKTINFORMATIONEN")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n")
if market_data.get('market_cap'):
print(f" Marktkapitalisierung: ${market_data['market_cap']:,.0f}")
if market_data.get('total_volume'):
print(f" 24h Handelsvolumen: ${market_data['total_volume']:,.0f}")
if market_data.get('high_24h') and market_data.get('low_24h'):
print(f" 24h Hoch: ${market_data['high_24h']:,.2f}")
print(f" 24h Tief: ${market_data['low_24h']:,.2f}")
if market_data.get('price_change_7d'):
print(f" 7-Tage Veränderung: {market_data['price_change_7d']:+.2f}%")
if market_data.get('price_change_30d'):
print(f" 30-Tage Veränderung: {market_data['price_change_30d']:+.2f}%")
print()
def get_quick_signal(self) -> str:
"""
Gibt schnelles Trading-Signal zurück (nur Empfehlung)
Returns:
Signal-String
"""
current_price = self.data_fetcher.get_current_price()
if not current_price:
return "❌ Fehler beim Abrufen der Daten"
price_df = self.data_fetcher.get_historical_data(days=30)
if price_df.empty:
return "❌ Fehler beim Abrufen der Daten"
signal = self.signal_generator.generate_signal(price_df, current_price)
return f"{signal.action.value} (Konfidenz: {signal.confidence}%) @ ${signal.price:,.2f}"
def main():
"""Hauptfunktion"""
parser = argparse.ArgumentParser(
description='Bitcoin Trading Signal System - MACD + News Sentiment Analyse',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Beispiele:
%(prog)s # Standard-Analyse
%(prog)s --verbose # Ausführliche Ausgabe
%(prog)s --days 60 # 60 Tage historische Daten
%(prog)s --quick # Schnelles Signal
%(prog)s --newsapi-key YOUR_KEY # Mit NewsAPI-Schlüssel
Hinweis:
- NewsAPI-Schlüssel optional (erhöht News-Quellen)
- Kostenlos bei https://newsapi.org
"""
)
parser.add_argument(
'-v', '--verbose',
action='store_true',
help='Ausführliche Ausgabe mit Ladestatus'
)
parser.add_argument(
'-d', '--days',
type=int,
default=30,
help='Anzahl Tage für historische Daten (Standard: 30)'
)
parser.add_argument(
'-q', '--quick',
action='store_true',
help='Schnelles Signal ohne Details'
)
parser.add_argument(
'--newsapi-key',
type=str,
default=None,
help='NewsAPI-Schlüssel für erweiterte News-Analyse'
)
args = parser.parse_args()
# Initialisiere Trader
trader = BitcoinTrader(
newsapi_key=args.newsapi_key,
verbose=args.verbose
)
try:
if args.quick:
# Schnelles Signal
signal = trader.get_quick_signal()
print(signal)
else:
# Vollständige Analyse
trader.run_analysis(days=args.days)
except KeyboardInterrupt:
print("\n\n⚠️ Analyse abgebrochen durch Benutzer")
sys.exit(0)
except Exception as e:
print(f"\n❌ Fehler: {e}")
if args.verbose:
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()