<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">from flask import Flask, jsonify, render_template, request
import yfinance as yf
import pandas as pd

app = Flask(__name__)

def get_signals(ticker):
    try:
        print(f"Fetching data for ticker: {ticker}")
        data = yf.download(ticker, period="2y", interval="1d", progress=False, auto_adjust=False)

        if data.empty:
            raise ValueError("Data is empty for ticker.")

        # Flatten MultiIndex columns if needed
        if isinstance(data.columns, pd.MultiIndex):
            print(f"MultiIndex detected for {ticker}, flattening columns...")
            data.columns = data.columns.get_level_values(0)

        print(f"Flattened Columns for {ticker}: {list(data.columns)}")

        if 'Close' not in data.columns:
            raise ValueError("Missing 'Close' column")
        
        # Calculate indicators
        data['RSI'] = calculate_rsi(data)
        data['MA50'] = data['Close'].rolling(window=50).mean()
        data['MA200'] = data['Close'].rolling(window=200).mean()
      
        print(f"{ticker} â€” Data length before drop: {len(data)}")
        print(f"{ticker} â€” Valid RSI/MA rows: {len(data.dropna(subset=['RSI', 'MA50', 'MA200']))}")


        # Keep the most recent valid data point
        latest_valid = data.dropna(subset=['RSI', 'MA50', 'MA200']).tail(1)
        if latest_valid.empty:
            raise ValueError("No valid data row for indicators.")

        last_row = latest_valid.iloc[-1]

        # Prepare last 60 close prices (for charts, not indicators)
        history = data.tail(60).reset_index()
        history_list = [
            {'date': row['Date'].strftime('%Y-%m-%d'), 'close': round(row['Close'], 2)}
            for _, row in history.iterrows() if not pd.isna(row['Close'])
        ]

        return {
            'ticker': ticker,
            'last_close': round(last_row['Close'], 2),
            'last_rsi': round(last_row['RSI'], 2),
            'last_ma50': round(last_row['MA50'], 2),
            'last_ma200': round(last_row['MA200'], 2),
            'history': history_list
        }

    except Exception as e:
        print(f"Error processing {ticker}: {e}")
        return None



def calculate_rsi(data, window=14):
    if 'Close' not in data or data['Close'].isnull().all():
        return pd.Series([None] * len(data), index=data.index)
    
    delta = data['Close'].diff()
    gain = delta.where(delta &gt; 0, 0)
    loss = -delta.where(delta &lt; 0, 0)
    avg_gain = gain.rolling(window=window, min_periods=window).mean()
    avg_loss = loss.rolling(window=window, min_periods=window).mean()
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi



@app.route("/marketdash")
def index():
    return render_template("index.html")

@app.route("/marketdash/api/revcies")
def revcies():
    ticker_param = request.args.get("ticker", "")
    tickers = [t.strip().upper() for t in ticker_param.split(",") if t.strip()]
    all_data = [get_signals(t) for t in tickers]
    return jsonify(all_data)

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=5001)
</pre></body></html>