Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import yfinance as yf
|
| 3 |
+
import pandas as pd
|
| 4 |
+
import plotly.graph_objects as go
|
| 5 |
+
from datetime import datetime
|
| 6 |
+
|
| 7 |
+
# --- ALGORITHM STATE ---
|
| 8 |
+
portfolio = {"balance": 100.0, "trades": []}
|
| 9 |
+
|
| 10 |
+
def get_market_data():
|
| 11 |
+
df = yf.download("EURUSD=X", period="5d", interval="1h")
|
| 12 |
+
# Flatten multi-index if necessary
|
| 13 |
+
if isinstance(df.columns, pd.MultiIndex):
|
| 14 |
+
df.columns = df.columns.get_level_values(0)
|
| 15 |
+
return df.dropna()
|
| 16 |
+
|
| 17 |
+
def run_trading_logic():
|
| 18 |
+
df = get_market_data()
|
| 19 |
+
|
| 20 |
+
# 1. CALCULATE INDICATORS (The "Brain")
|
| 21 |
+
df['SMA_Fast'] = df['Close'].rolling(window=10).mean()
|
| 22 |
+
df['SMA_Slow'] = df['Close'].rolling(window=30).mean()
|
| 23 |
+
|
| 24 |
+
current_price = df['Close'].iloc[-1]
|
| 25 |
+
fast_ma = df['SMA_Fast'].iloc[-1]
|
| 26 |
+
slow_ma = df['SMA_Slow'].iloc[-1]
|
| 27 |
+
|
| 28 |
+
# 2. DECISION LOGIC (The "Algorithm")
|
| 29 |
+
signal = "HOLD"
|
| 30 |
+
|
| 31 |
+
# Check if we already traded today
|
| 32 |
+
today = datetime.now().strftime("%Y-%m-%d")
|
| 33 |
+
already_traded = any(t['Date'] == today for t in portfolio['trades'])
|
| 34 |
+
|
| 35 |
+
if not already_traded:
|
| 36 |
+
if fast_ma > slow_ma:
|
| 37 |
+
signal = "BUY"
|
| 38 |
+
elif fast_ma < slow_ma:
|
| 39 |
+
signal = "SELL"
|
| 40 |
+
|
| 41 |
+
# 3. EXECUTE TRADE (1:3 Risk Management)
|
| 42 |
+
if signal != "HOLD":
|
| 43 |
+
risk = 0.0020 # 20 Pips Stop Loss
|
| 44 |
+
reward = 0.0060 # 60 Pips Take Profit
|
| 45 |
+
|
| 46 |
+
trade = {
|
| 47 |
+
"Date": today,
|
| 48 |
+
"Action": signal,
|
| 49 |
+
"Entry": round(current_price, 5),
|
| 50 |
+
"SL": round(current_price - risk if signal == "BUY" else current_price + risk, 5),
|
| 51 |
+
"TP": round(current_price + reward if signal == "BUY" else current_price - reward, 5),
|
| 52 |
+
"Result": "PENDING"
|
| 53 |
+
}
|
| 54 |
+
portfolio['trades'].append(trade)
|
| 55 |
+
|
| 56 |
+
# 4. VISUALS
|
| 57 |
+
fig = go.Figure(data=[go.Candlestick(x=df.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
|
| 58 |
+
fig.add_trace(go.Scatter(x=df.index, y=df['SMA_Fast'], name='Fast MA', line=dict(color='orange')))
|
| 59 |
+
fig.add_trace(go.Scatter(x=df.index, y=df['SMA_Slow'], name='Slow MA', line=dict(color='blue')))
|
| 60 |
+
fig.update_layout(template="plotly_dark", title="EUR/USD Algorithm Analysis")
|
| 61 |
+
|
| 62 |
+
return fig, pd.DataFrame(portfolio['trades']), f"Current Balance: ${portfolio['balance']:.2f}"
|
| 63 |
+
|
| 64 |
+
# --- GRADIO INTERFACE ---
|
| 65 |
+
with gr.Blocks() as demo:
|
| 66 |
+
gr.Markdown("# 📉 EUR/USD Pure Algorithm (No-ML)")
|
| 67 |
+
status = gr.Label(value="Analyzing Market...")
|
| 68 |
+
|
| 69 |
+
with gr.Row():
|
| 70 |
+
chart = gr.Plot()
|
| 71 |
+
history = gr.Dataframe(headers=["Date", "Action", "Entry", "SL", "TP", "Result"])
|
| 72 |
+
|
| 73 |
+
btn = gr.Button("Manual Refresh / Scan Market")
|
| 74 |
+
btn.click(run_trading_logic, outputs=[chart, history, status])
|
| 75 |
+
|
| 76 |
+
# Optional Auto-refresh
|
| 77 |
+
timer = gr.Timer(60)
|
| 78 |
+
timer.tick(run_trading_logic, outputs=[chart, history, status])
|
| 79 |
+
|
| 80 |
+
demo.launch()
|