You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.6 KiB
105 lines
2.6 KiB
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"market-data-service/api"
|
|
"market-data-service/internal/repository"
|
|
)
|
|
|
|
// FuturesServiceImpl 期货服务实现
|
|
type FuturesServiceImpl struct {
|
|
repo *repository.FuturesRepository
|
|
}
|
|
|
|
// NewFuturesService 创建期货服务
|
|
func NewFuturesService(repo *repository.FuturesRepository) FuturesService {
|
|
return &FuturesServiceImpl{
|
|
repo: repo,
|
|
}
|
|
}
|
|
|
|
// QueryKLines 查询K线数据
|
|
func (s *FuturesServiceImpl) QueryKLines(ctx context.Context, req *api.KLineQueryRequest) (*api.KLineData, error) {
|
|
// 解析日期
|
|
start, err := time.Parse("20060102", req.Start)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid start date: %w", err)
|
|
}
|
|
end, err := time.Parse("20060102", req.End)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid end date: %w", err)
|
|
}
|
|
end = end.Add(24 * time.Hour).Add(-time.Second)
|
|
|
|
// 获取K线数据
|
|
items, err := s.repo.GetKLines(ctx, req.Symbol, req.Freq, start, end)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &api.KLineData{
|
|
Symbol: req.Symbol,
|
|
Freq: req.Freq,
|
|
Count: len(items),
|
|
Items: items,
|
|
}, nil
|
|
}
|
|
|
|
// ListSymbols 查询标的列表
|
|
func (s *FuturesServiceImpl) ListSymbols(ctx context.Context, req *api.SymbolListRequest) (*api.SymbolListData, error) {
|
|
symbols, total, err := s.repo.ListSymbols(ctx, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &api.SymbolListData{
|
|
Total: total,
|
|
Page: req.Page,
|
|
Size: req.Size,
|
|
Items: symbols,
|
|
}, nil
|
|
}
|
|
|
|
// BatchQueryKLines 批量查询K线
|
|
func (s *FuturesServiceImpl) BatchQueryKLines(ctx context.Context, req *api.BatchKLineRequest) (*api.BatchKLineData, error) {
|
|
results := make([]api.BatchKLineResult, len(req.Symbols))
|
|
|
|
for i, symbol := range req.Symbols {
|
|
singleReq := &api.KLineQueryRequest{
|
|
Symbol: symbol,
|
|
Start: req.Start,
|
|
End: req.End,
|
|
Freq: req.Freq,
|
|
}
|
|
|
|
data, err := s.QueryKLines(ctx, singleReq)
|
|
results[i] = api.BatchKLineResult{
|
|
Symbol: symbol,
|
|
Success: err == nil,
|
|
}
|
|
|
|
if err != nil {
|
|
results[i].Error = err.Error()
|
|
} else {
|
|
results[i].Data = &api.KLineSubData{
|
|
Count: data.Count,
|
|
Items: data.Items,
|
|
}
|
|
}
|
|
}
|
|
|
|
return &api.BatchKLineData{Results: results}, nil
|
|
}
|
|
|
|
// GetTradingDates 获取交易日历
|
|
func (s *FuturesServiceImpl) GetTradingDates(ctx context.Context, req *api.TradingDatesRequest) (*api.TradingDatesData, error) {
|
|
return s.repo.GetTradingDates(ctx, req.Start, req.End)
|
|
}
|
|
|
|
// GetContractsByUnderlying 根据品种获取合约
|
|
func (s *FuturesServiceImpl) GetContractsByUnderlying(ctx context.Context, req *api.FuturesContractsRequest) (*api.FuturesContractsData, error) {
|
|
return s.repo.GetContractsByUnderlying(ctx, req.Underlying, req.Exchange)
|
|
} |