84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
from __future__ import annotations
|
|
import logging
|
|
from flask import Flask, jsonify, render_template, request
|
|
from trader import TraderWorker
|
|
|
|
logging.basicConfig(
|
|
level=logging.DEBUG,
|
|
format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s"
|
|
)
|
|
log = logging.getLogger("server")
|
|
|
|
app = Flask(__name__, template_folder="templates", static_folder="static")
|
|
worker = TraderWorker()
|
|
|
|
@app.before_request
|
|
def _log_request():
|
|
log.debug("REQ %s %s args=%s json=%s",
|
|
request.method, request.path, dict(request.args), request.get_json(silent=True))
|
|
|
|
@app.after_request
|
|
def _after(resp):
|
|
resp.headers["Cache-Control"] = "no-store, max-age=0"
|
|
resp.headers["Pragma"] = "no-cache"
|
|
resp.headers["Expires"] = "0"
|
|
log.debug("RESP %s %s %s", request.method, request.path, resp.status)
|
|
return resp
|
|
|
|
@app.get("/")
|
|
def index():
|
|
return render_template("index.html")
|
|
|
|
@app.get("/api/status")
|
|
def api_status():
|
|
return jsonify(worker.status())
|
|
|
|
@app.get("/api/positions")
|
|
def api_positions():
|
|
return jsonify({"positions": worker.list_positions()})
|
|
|
|
@app.get("/api/trades")
|
|
def api_trades():
|
|
return jsonify({"trades": worker.list_trades()})
|
|
|
|
@app.get("/api/equity")
|
|
def api_equity():
|
|
return jsonify({"equity": worker.list_equity()})
|
|
|
|
@app.post("/api/start")
|
|
def api_start():
|
|
ok = worker.start()
|
|
return jsonify({"started": ok, "running": worker.is_running()})
|
|
|
|
@app.post("/api/stop")
|
|
def api_stop():
|
|
ok = worker.stop()
|
|
return jsonify({"stopped": ok, "running": worker.is_running()})
|
|
|
|
@app.post("/api/run-once")
|
|
def api_run_once():
|
|
took = worker.tick_once()
|
|
return jsonify({"ok": True, "took_s": took})
|
|
|
|
# testowe (opcjonalne)
|
|
@app.post("/api/test/long")
|
|
def api_test_long():
|
|
data = request.get_json(silent=True) or {}
|
|
worker.test_open_long(data.get("ticker","AAPL"), data.get("price",123.45), data.get("size",1.0))
|
|
return jsonify({"ok": True})
|
|
|
|
@app.post("/api/test/short")
|
|
def api_test_short():
|
|
data = request.get_json(silent=True) or {}
|
|
worker.test_open_short(data.get("ticker","AAPL"), data.get("price",123.45), data.get("size",1.0))
|
|
return jsonify({"ok": True})
|
|
|
|
@app.post("/api/test/close")
|
|
def api_test_close():
|
|
data = request.get_json(silent=True) or {}
|
|
worker.test_close(data.get("ticker","AAPL"), data.get("price"))
|
|
return jsonify({"ok": True})
|
|
|
|
if __name__ == "__main__":
|
|
app.run(host="0.0.0.0", port=8000, debug=False)
|