Market Data Service is a high-performance financial data API that provides comprehensive Symbol prices of different markets through both RESTful endpoints and real-time WebSocket connections.

candles.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. const express = require('express');
  2. const router = express.Router();
  3. const candleController = require('../controllers/candleController');
  4. const { validate, validateQuery, validateParams } = require('../middleware/validation');
  5. const Joi = require('joi');
  6. // GET /api/candles - Get candles with filtering
  7. router.get('/', validateQuery(Joi.object({
  8. symbolId: Joi.number().integer().positive().required(),
  9. startTime: Joi.date().iso(),
  10. endTime: Joi.date().iso().when('startTime', {
  11. is: Joi.exist(),
  12. then: Joi.date().iso().greater(Joi.ref('startTime'))
  13. }),
  14. limit: Joi.number().integer().min(1).max(1000).default(100),
  15. offset: Joi.number().integer().min(0).default(0)
  16. })), candleController.getCandles);
  17. // GET /api/candles/ohlc - Get OHLC data
  18. router.get('/ohlc', validateQuery(Joi.object({
  19. symbolId: Joi.number().integer().positive().required(),
  20. period: Joi.string().valid('1h').default('1h'),
  21. limit: Joi.number().integer().min(1).max(1000).default(100)
  22. })), candleController.getOHLC);
  23. // GET /api/candles/:symbolId/latest - Get latest candle for a symbol
  24. router.get('/:symbolId/latest', validateParams(Joi.object({
  25. symbolId: Joi.number().integer().positive().required()
  26. })), candleController.getLatestCandle);
  27. // POST /api/candles - Create new candle
  28. router.post('/', validate(Joi.object({
  29. symbolId: Joi.number().integer().positive().required(),
  30. openTime: Joi.date().iso().required(),
  31. closeTime: Joi.date().iso().required(),
  32. open: Joi.number().precision(8).positive().required(),
  33. high: Joi.number().precision(8).positive().required(),
  34. low: Joi.number().precision(8).positive().required(),
  35. close: Joi.number().precision(8).positive().required(),
  36. volume: Joi.number().precision(8).positive(),
  37. tradesCount: Joi.number().integer().min(0),
  38. quoteVolume: Joi.number().precision(8).positive()
  39. })), candleController.createCandle);
  40. // POST /api/candles/bulk - Bulk create candles
  41. router.post('/bulk', validate(Joi.object({
  42. candles: Joi.array().items(Joi.object({
  43. symbolId: Joi.number().integer().positive().required(),
  44. openTime: Joi.date().iso().required(),
  45. closeTime: Joi.date().iso().required(),
  46. open: Joi.number().precision(8).positive().required(),
  47. high: Joi.number().precision(8).positive().required(),
  48. low: Joi.number().precision(8).positive().required(),
  49. close: Joi.number().precision(8).positive().required(),
  50. volume: Joi.number().precision(8).positive(),
  51. tradesCount: Joi.number().integer().min(0),
  52. quoteVolume: Joi.number().precision(8).positive()
  53. })).min(1).required()
  54. })), candleController.bulkCreateCandles);
  55. // DELETE /api/candles/cleanup/:symbolId - Clean up old candles, keep latest N
  56. router.delete('/cleanup/:symbolId', validateParams(Joi.object({
  57. symbolId: Joi.number().integer().positive().required()
  58. })), validateQuery(Joi.object({
  59. keep: Joi.number().integer().min(1).default(1000)
  60. })), candleController.cleanupCandles);
  61. module.exports = router;