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
This commit is contained in:
Executable
+212
@@ -0,0 +1,212 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user