Spaces:
Running
Running
File size: 3,669 Bytes
954ad0c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | from __future__ import annotations
from aureon_baton_link import link_system as _baton_link; _baton_link(__name__)
from flask import Flask, jsonify, redirect, render_template_string, request, url_for
from .trading_runtime import TradingService
HTML_TEMPLATE = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Aureon Dashboard</title>
<style>
body { font-family: Arial, sans-serif; margin: 2rem; background: #0f172a; color: #e2e8f0; }
.card { background: #1e293b; padding: 1rem 1.5rem; border-radius: 12px; margin-bottom: 1rem; box-shadow: 0 4px 12px rgba(0,0,0,0.35); }
button { padding: 0.6rem 1rem; border-radius: 8px; border: none; cursor: pointer; }
.primary { background: #2563eb; color: white; }
.danger { background: #ef4444; color: white; }
h1 { margin-bottom: 0.5rem; }
pre { background: #0b1220; padding: 1rem; border-radius: 8px; overflow: auto; }
</style>
</head>
<body>
<h1>Aureon Local Dashboard</h1>
<p>Connection Status: <strong>{{ 'Running' if running else 'Stopped' }}</strong></p>
<div class="card">
<h3>Controls</h3>
<form method="post" action="{{ url_for('toggle') }}">
{% if running %}
<button class="danger" name="action" value="stop">Stop Trading</button>
{% else %}
<button class="primary" name="action" value="start">Start Trading</button>
{% endif %}
</form>
</div>
<div class="card">
<h3>Session</h3>
<p>Exchange: <strong>{{ config.exchange }}</strong></p>
<p>Pair: <strong>{{ config.base_asset }}/{{ config.quote_asset }}</strong></p>
<p>Mode: <strong>{{ config.mode }}</strong> | Trade size: <strong>{{ config.trade_size }}</strong></p>
</div>
<div class="card">
<h3>P&L</h3>
<p><strong>{{ pnl }}</strong></p>
</div>
<div class="card">
<h3>Positions</h3>
{% if positions %}
<ul>
{% for pos in positions %}
<li>{{ pos.symbol }} — {{ pos.size }} @ {{ pos.entry_price }}</li>
{% endfor %}
</ul>
{% else %}
<p>No open positions.</p>
{% endif %}
</div>
<div class="card">
<h3>Logs</h3>
<pre>{{ logs }}</pre>
</div>
</body>
</html>
"""
def create_app(service: TradingService) -> Flask:
app = Flask(__name__)
@app.route("/")
def index():
state = service.state
return render_template_string(
HTML_TEMPLATE,
running=state.running,
pnl=round(state.pnl, 2),
positions=state.positions,
logs="\n".join(state.logs[-20:]),
config=service.config,
)
@app.route("/toggle", methods=["POST"])
def toggle():
action = request.form.get("action", "")
if action == "start":
service.start()
elif action == "stop":
service.stop()
return redirect(url_for("index"))
@app.route("/api/status")
def api_status():
state = service.state
return jsonify(
{
"running": state.running,
"pnl": round(state.pnl, 2),
"positions": [pos.__dict__ for pos in state.positions],
"logs": state.logs[-50:],
"config": {
"exchange": service.config.exchange,
"pair": f"{service.config.base_asset}/{service.config.quote_asset}",
"mode": service.config.mode,
"trade_size": service.config.trade_size,
},
}
)
return app
__all__ = ["create_app"]
|