Files

94 lines
3.1 KiB
Python
Raw Permalink Normal View History

2025-12-29 03:06:49 +08:00
"""
K-line data API routing
2025-12-29 03:06:49 +08:00
"""
2025-12-29 03:06:49 +08:00
import traceback
from flask import Blueprint, jsonify, request
2025-12-29 03:06:49 +08:00
from app.services.kline import KlineService
from app.utils.logger import get_logger
logger = get_logger(__name__)
kline_bp = Blueprint("kline", __name__)
2025-12-29 03:06:49 +08:00
kline_service = KlineService()
@kline_bp.route("/kline", methods=["GET"])
2025-12-29 03:06:49 +08:00
def get_kline():
"""
Get K-line data
parameter:
market: market type (Crypto, USStock, Forex, Futures)
symbol: trading pair/stock code
timeframe: time period (1m, 5m, 15m, 30m, 1H, 4H, 1D, 1W)
limit: number of data items (default 300)
before_time: Get data before this time (optional, Unix timestamp)
2025-12-29 03:06:49 +08:00
"""
try:
# To force GET, use request.args
market = request.args.get("market", "USStock")
symbol = request.args.get("symbol", "")
timeframe = request.args.get("timeframe", "1D")
limit = int(request.args.get("limit", 300))
before_time = request.args.get("before_time") or request.args.get("beforeTime")
2025-12-29 03:06:49 +08:00
if before_time:
before_time = int(before_time)
2025-12-29 03:06:49 +08:00
if not symbol:
return jsonify({"code": 0, "msg": "Missing symbol parameter", "data": None}), 400
2025-12-29 03:06:49 +08:00
logger.info(f"Requesting K-lines: {market}:{symbol}, timeframe={timeframe}, limit={limit}")
2025-12-29 03:06:49 +08:00
klines = kline_service.get_kline(
market=market, symbol=symbol, timeframe=timeframe, limit=limit, before_time=before_time
2025-12-29 03:06:49 +08:00
)
2025-12-29 03:06:49 +08:00
if not klines:
# Give more detailed tips for specific situations
msg = "No data found"
if market == "Forex" and timeframe == "1m":
msg = "Forex 1-minute data requires Tiingo paid subscription"
elif market == "Forex" and timeframe in ("1W", "1M"):
msg = "No weekly/monthly data available for this period"
return jsonify(
{
"code": 0,
"msg": msg,
"data": [],
"hint": "tiingo_subscription" if (market == "Forex" and timeframe == "1m") else None,
}
)
return jsonify({"code": 1, "msg": "success", "data": klines})
2025-12-29 03:06:49 +08:00
except Exception as e:
logger.error(f"Failed to fetch K-lines: {str(e)}")
logger.error(traceback.format_exc())
return jsonify({"code": 0, "msg": f"Failed to fetch kline data: {str(e)}", "data": None}), 500
2025-12-29 03:06:49 +08:00
@kline_bp.route("/price", methods=["GET"])
2025-12-29 03:06:49 +08:00
def get_price():
"""Get the latest price"""
2025-12-29 03:06:49 +08:00
try:
market = request.args.get("market", "USStock")
symbol = request.args.get("symbol", "")
2025-12-29 03:06:49 +08:00
if not symbol:
return jsonify({"code": 0, "msg": "Missing symbol parameter", "data": None}), 400
2025-12-29 03:06:49 +08:00
price_data = kline_service.get_latest_price(market, symbol)
2025-12-29 03:06:49 +08:00
if not price_data:
return jsonify({"code": 0, "msg": "No price data found", "data": None})
return jsonify({"code": 1, "msg": "success", "data": price_data})
2025-12-29 03:06:49 +08:00
except Exception as e:
logger.error(f"Failed to fetch price: {str(e)}")
return jsonify({"code": 0, "msg": f"Failed to fetch price: {str(e)}", "data": None}), 500