import streamlit as st import subprocess import os import signal import time from threading import Thread import requests # Set page config st.set_page_config( page_title="Scalping Bot Control", page_icon="πŸ€–", layout="wide" ) st.title("πŸ€– Bybit Scalping Bot Control Panel") # Sidebar st.sidebar.header("βš™οΈ Configuration") # Environment variables setup st.sidebar.subheader("πŸ”‘ API Configuration") bybit_key = st.sidebar.text_input("Bybit API Key", type="password") bybit_secret = st.sidebar.text_input("Bybit API Secret", type="password") bybit_testnet = st.sidebar.checkbox("Use Testnet", value=False) telegram_token = st.sidebar.text_input("Telegram Bot Token (optional)") telegram_chat = st.sidebar.text_input("Telegram Chat ID (optional)") if st.sidebar.button("πŸ’Ύ Save Configuration"): # Save to .env file env_content = f"""BYBIT_API_KEY={bybit_key} BYBIT_API_SECRET={bybit_secret} BYBIT_TESTNET={str(bybit_testnet).lower()} TELEGRAM_BOT_TOKEN={telegram_token} TELEGRAM_CHAT_ID={telegram_chat} """ with open('.env', 'w') as f: f.write(env_content) st.sidebar.success("Configuration saved!") # Main content col1, col2, col3 = st.columns(3) with col1: st.subheader("πŸš€ Start Trading") symbol = st.selectbox("Symbol", ["BTCUSDT", "ETHUSDT", "SOLUSDT"]) duration = st.slider("Duration (hours)", 1, 24, 18) max_trades = st.number_input("Max Trades (optional)", min_value=1, value=50) if st.button("▢️ Start Trading", key="start"): try: response = requests.post(f"http://localhost:8000/start/{symbol}", params={"duration_hours": duration, "max_trades": max_trades}) if response.status_code == 200: st.success(f"βœ… Started trading {symbol} for {duration} hours") else: st.error(f"❌ Failed to start: {response.text}") except Exception as e: st.error(f"❌ Error: {e}") with col2: st.subheader("πŸ›‘ Stop Trading") stop_symbol = st.selectbox("Symbol to Stop", ["BTCUSDT", "ETHUSDT", "SOLUSDT"], key="stop_select") if st.button("⏹️ Stop Trading", key="stop"): try: response = requests.post(f"http://localhost:8000/stop/{stop_symbol}") if response.status_code == 200: st.success(f"βœ… Stopped trading {stop_symbol}") else: st.error(f"❌ Failed to stop: {response.text}") except Exception as e: st.error(f"❌ Error: {e}") with col3: st.subheader("🚨 Emergency") if st.button("🚨 EMERGENCY STOP ALL", key="emergency"): try: response = requests.post("http://localhost:8000/emergency_stop") if response.status_code == 200: st.error("🚨 ALL TRADING STOPPED!") else: st.error(f"❌ Failed: {response.text}") except Exception as e: st.error(f"❌ Error: {e}") # Status section st.header("πŸ“Š Bot Status") if st.button("πŸ”„ Refresh Status"): try: response = requests.get("http://localhost:8000/status") if response.status_code == 200: status = response.json() # Overall status if status["is_running"]: st.success("βœ… Bot is RUNNING") else: st.warning("⏸️ Bot is STOPPED") st.metric("Total P&L", f"${status['total_pnl']:.2f}") st.metric("Trades Today", status['trades_today']) # Active sessions if status["active_sessions"]: st.subheader("🎯 Active Sessions") for session in status["active_sessions"]: with st.expander(f"{session['symbol']} - {session['status'].upper()}"): st.write(f"**Session ID:** {session['session_id']}") st.write(f"**Started:** {session['start_time'][:19]}") st.write(f"**P&L:** ${session['pnl']:.2f}") st.write(f"**Trades:** {session['trades']}") else: st.info("No active sessions") else: st.error(f"❌ Failed to get status: {response.status_code}") except Exception as e: st.error(f"❌ Connection error: {e}") # Analysis section st.header("πŸ” Live Analysis") if st.button("πŸ“Š Refresh Analysis"): try: response = requests.get("http://localhost:8000/analysis/status") if response.status_code == 200: analysis = response.json() for symbol, data in analysis["analysis_status"].items(): with st.expander(f"πŸ“ˆ {symbol} Analysis"): col1, col2 = st.columns(2) with col1: st.metric("Current Price", f"${data['current_price']:.2f}" if data['current_price'] else "N/A") indicators = data['indicators'] st.write("**Indicators:**") st.write(f"EMA 9: {indicators['ema_9']:.4f}" if indicators['ema_9'] else "EMA 9: N/A") st.write(f"EMA 21: {indicators['ema_21']:.4f}" if indicators['ema_21'] else "EMA 21: N/A") st.write(f"RSI 14: {indicators['rsi_14']:.1f}" if indicators['rsi_14'] else "RSI 14: N/A") with col2: conditions = data['strategy_conditions'] st.write("**Strategy Conditions:**") st.write(f"πŸ“ˆ Trend Up: {'βœ…' if conditions['trend_up'] else '❌'}") st.write(f"πŸ“Š RSI Valid: {'βœ…' if conditions['rsi_valid'] else '❌'}") st.write(f"πŸ’₯ Volume Spike: {'βœ…' if conditions['volume_spike'] else '❌'}") st.write(f"🎯 Orderbook OK: {'βœ…' if conditions['orderbook_aligned'] else '❌'}") all_conditions = all([conditions['trend_up'], conditions['rsi_valid'], conditions['volume_spike'], conditions['orderbook_aligned']]) if all_conditions: st.success("🎯 TRADE SIGNAL READY!") else: st.info("⏳ Waiting for conditions...") else: st.error(f"❌ Failed to get analysis: {response.status_code}") except Exception as e: st.error(f"❌ Connection error: {e}") # Logs section st.header("πŸ“‹ Recent Logs") log_type = st.selectbox("Log Type", ["Live Logs", "Analysis Logs"]) if st.button("πŸ“– Refresh Logs"): try: if log_type == "Live Logs": response = requests.get("http://localhost:8000/logs/live") else: response = requests.get("http://localhost:8000/logs/analysis") if response.status_code == 200: logs_data = response.json() st.write(f"**Total {log_type}:** {logs_data['count']}") logs_text = "" for log_line in logs_data['logs'][-10:]: # Show last 10 logs_text += log_line st.code(logs_text, language="text") else: st.error(f"❌ Failed to get logs: {response.status_code}") except Exception as e: st.error(f"❌ Connection error: {e}") # Footer st.markdown("---") st.markdown("*πŸ€– Bybit Scalping Bot - FastAPI Control Interface*") st.markdown("*Made with ❀️ for automated crypto trading*")