芬兰赫尔辛基证券交易所的交易时段是北京时间15:00-23:30。接入初期,我用官方示例代码跑通了连接,以为万事大吉。结果第二天开盘发现,策略没有收到任何数据。
排查日志发现,WebSocket连接在凌晨空闲时被运营商断开了,但客户端没有收到关闭帧,连接状态还是OPEN。这就是典型的静默断连。解决方案是应用层心跳。
python
def start_heartbeat(ws):
while True:
time.sleep(25)
try:
ws.send(json.dumps({"type": "ping"}))
except:
reconnect()
第二个问题是序列号跳跃。芬兰市场推送频率不高,但偶尔会有网络抖动导致丢包。每条消息都带seq字段,客户端需要维护last_seq,发现跳跃时主动补数据。
python
if msg['seq'] != last_seq + 1:
missing = fetch_missing(last_seq + 1, msg['seq'] - 1)
for m in missing:
process(m)
第三个问题是午休。芬兰市场没有午休,但欧洲有些市场有。我的代码统一处理了所有欧洲市场,判断isOpen字段,休市时停止策略,避免无效运行。
芬兰市场的成分股每年调整两次,调整后股票ID会变。我写了一个定时任务,每周同步一次最新的成分股列表。
python
def sync_constituents():
url = f"http://api.jkidata.com/stock/stocks?countryId=芬兰ID&pageSize=100&key={KEY}"
resp = requests.get(url)
stocks = resp.json()['data']['records']
save_to_db(stocks)
docs.jkidata.com上有个WebSocket稳定连接的完整示例,包含了心跳、重连、序列号检测的全部逻辑。
【数据API】jkidata.com | 文档中心 docs.jkidata.com