新版仿ok交易所-后端
zyy3
2026-03-03 1256f9068913160f9893b4382cb408835a54349a
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.yami.trading.huobi.data.internal;
 
 
 
import com.yami.trading.bean.data.domain.*;
import com.yami.trading.common.util.DateUtils;
import com.yami.trading.service.data.DataService;
import com.yami.trading.service.syspara.SysparaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
 
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
 
@Service("dataService")
public class DataServiceImpl  implements DataService {
    private volatile static Map<String, TimeObject> cache = new ConcurrentHashMap<String, TimeObject>();
    @Autowired
    @Qualifier("remoteDataService")
    private DataService remoteDataService;
    @Autowired
    private SysparaService sysparaService;
 
    /**
     * 行情实时价格
     */
    @Override
    public List<Realtime> realtime(String symbols) {
        List<Realtime> list = remoteDataService.realtime(symbols);
        return list;
    }
 
    /**
     * Kline
     */
    @Override
    public List<Kline> kline(String symbol, String line) {
        String key = "kline_" + symbol + "_" + line;
        List<Kline> list = new ArrayList<Kline>();
        TimeObject timeObject = cache.get(key);
        if (isRemote(timeObject)) {
            list = remoteDataService.kline(symbol, line);
            Collections.sort(list); // 按时间升序
            KlineTimeObject klineTimeObject = new KlineTimeObject();
            klineTimeObject.setLastTime(new Date());
            klineTimeObject.setKline(list);
            cache.put(key, klineTimeObject);
        } else {
            list = ((KlineTimeObject) timeObject).getKline();
        }
 
        return list;
 
    }
 
    private boolean isRemote(TimeObject timeObject) {
        if (timeObject == null) {
            return true;
        }
 
        /**
         * 判断是否远程 读取数据,先完成3秒过期。后期补上非开盘时间不调用。
         */
        Date timestamps = timeObject.getLastTime();
 
        /**
         * 数据超时时间
         */
        // 15秒
        //默认3秒
        double huobi_data_timeout = Double.valueOf(sysparaService.find("symbol_data_timeout").getSvalue());
 
        //int timeout = 3;
        
        int timeout = (int) huobi_data_timeout;
        if (DateUtils.addSecond(timestamps, timeout).before(new Date())) {
            return true;
        }
 
        return false;
    }
 
    public void setRemoteDataService(DataService remoteDataService) {
        this.remoteDataService = remoteDataService;
    }
 
    public void setSysparaService(SysparaService sysparaService) {
        this.sysparaService = sysparaService;
    }
 
    /**
     * 分时图
     */
    @Override
    public List<Trend> trend(String symbol) {
        String key = "trend_" + symbol;
        List<Trend> list = new ArrayList<Trend>();
        TimeObject timeObject = cache.get(key);
        if (isRemote(timeObject)) {
            list = remoteDataService.trend(symbol);
            TrendTimeObject trendTimeObject = new TrendTimeObject();
            trendTimeObject.setLastTime(new Date());
            trendTimeObject.setTrend(list);
            cache.put(key, trendTimeObject);
        } else {
            list = ((TrendTimeObject) timeObject).getTrend();
        }
 
        return list;
    }
    /**
     * 深度数据
     */
    @Override
    public Depth depth(String symbol) {
        String key = "depth_" + symbol;
        Depth depth = new Depth();
 
        TimeObject timeObject = cache.get(key);
        if (isRemote(timeObject)) {
            depth = remoteDataService.depth(symbol);
            DepthTimeObject depthTimeObject = new DepthTimeObject();
            depthTimeObject.setLastTime(new Date());
            depthTimeObject.setDepth(depth);
            cache.put(key, depthTimeObject);
        } else {
            depth = ((DepthTimeObject) timeObject).getDepth();
        }
        depth.setSymbol(symbol);
        return depth;
 
    }
 
    /**
     * 近期交易记录
     */
    @Override
    public Trade trade(String symbol) {
 
        String key = "trade_" + symbol;
        Trade trade = new Trade();
        TimeObject timeObject = cache.get(key);
        if (isRemote(timeObject)) {
            trade = remoteDataService.trade(symbol);
            if(trade!=null) {
                TradeTimeObject tradeTimeObject = new TradeTimeObject();
                tradeTimeObject.setLastTime(new Date());
                tradeTimeObject.put(symbol, trade.getData());
                cache.put(key, tradeTimeObject);
            }
 
        } else {
            trade = ((TradeTimeObject) timeObject).getTrade();
        }
 
        return trade;
    }
}