原生JS WebSocket 完整实现 DAX德指 实时行情监听
一、前言
德国DAX指数(德指)是欧洲核心股指,也是跨境多资产配置、欧美盘联动策略的重要参考标的。在开发前端行情看板、网页盯盘工具、实时指数监控页面时,通过原生JS WebSocket可直接直连行情服务,无需后端中转,实现毫秒级行情推送,彻底解决HTTP轮询延迟高、资源占用大的问题。
本文提供完整可直接嵌入HTML的原生JS代码,包含连接初始化、10秒心跳保活、订阅下发、异常捕获、断线自动重连、页面后台休眠优化全逻辑,同时完整拆解返回JSON结构、股指专属字段特性与前端工程优化方案。
二、通信规范与品种编码对照
1、市场通用简称:DAX 德指(德国法兰克福指数)
2、接口订阅编码:ZY_DAX
3、WebSocket统一长连接地址:ws://39.107.99.235/ws
4、强制心跳规则:客户端每10秒发送一次秒级时间戳心跳包 {"ping": 时间戳},无心跳会被服务端主动断开连接
5、订阅规则:连接成功后单次下发订阅报文 {"Key":"ZY_DAX"},无需重复订阅
6、推送机制:仅指数点位、日内涨跌数据变动时推送数据包,无变动静默待机,节省浏览器资源
三、完整原生JS可运行代码(适配所有浏览器)
代码全局封装连接实例与定时器,防止重复创建连接,内置页面后台休眠释放资源、断线自动重连、数据解析异常捕获,可直接嵌入任意HTML页面使用。
// 全局行情连接实例与心跳定时器,防止重复创建
let daxWsInstance = null;
let daxHeartbeatTimer = null;
/**
* 初始化DAX德指WebSocket实时行情连接
*/
function initDaxQuoteWebSocket() {
// 销毁已有连接和定时器,避免多重连接冲突
if (daxWsInstance) {
daxWsInstance.close();
}
if (daxHeartbeatTimer) {
clearInterval(daxHeartbeatTimer);
}
// 初始化长连接
daxWsInstance = new WebSocket("ws://39.107.99.235/ws");
// 连接成功回调
daxWsInstance.onopen = function () {
console.log("DAX德指行情长连接建立成功,下发订阅指令");
// 组装订阅报文
const subscribeMsg = JSON.stringify({
Key: "ZY_DAX"
});
daxWsInstance.send(subscribeMsg);
// 开启10秒定时心跳保活
daxHeartbeatTimer = setInterval(() => {
const timestamp = Math.floor(new Date().getTime() / 1000);
const pingMsg = JSON.stringify({ ping: timestamp });
daxWsInstance.send(pingMsg);
}, 10000);
};
// 接收实时行情推送
daxWsInstance.onmessage = function (event) {
try {
const resData = JSON.parse(event.data);
// 过滤有效行情数据
if (!resData.body) return;
const daxQuote = resData.body;
console.log("======== DAX德指 实时行情更新 ========");
console.log("品种编码:", daxQuote.StockCode);
console.log("实时指数点位:", daxQuote.Price);
console.log("当日开盘点位:", daxQuote.Open);
console.log("昨日收盘点位:", daxQuote.LastClose);
console.log("日内最高/最低:", daxQuote.High, "/", daxQuote.Low);
console.log("涨跌点数:", daxQuote.Diff);
console.log("涨跌幅:", daxQuote.DiffRate, "%");
console.log("更新时间:", daxQuote.Time);
console.log("=======================================\n");
} catch (error) {
console.error("德指行情数据解析失败:", error);
}
};
// 连接断开自动重连
daxWsInstance.onclose = function () {
console.log("DAX德指行情连接断开,3秒后自动重连");
clearInterval(daxHeartbeatTimer);
setTimeout(initDaxQuoteWebSocket, 3000);
};
// 捕获通信异常
daxWsInstance.onerror = function (err) {
console.error("WebSocket通信异常:", err);
};
}
// 页面加载完成自动启动行情监听
window.onload = function () {
initDaxQuoteWebSocket();
};
// 页面切后台自动释放资源,前台激活自动重连,优化浏览器性能
document.addEventListener("visibilitychange", function () {
if (document.hidden) {
// 页面隐藏:关闭连接、清空定时器
if (daxWsInstance) daxWsInstance.close();
if (daxHeartbeatTimer) clearInterval(daxHeartbeatTimer);
} else {
// 页面显示:重新初始化连接
initDaxQuoteWebSocket();
}
});
四、服务端返回完整JSON数据结构
股指类品种无五档盘口、无成交量数据,仅返回核心点位与涨跌数据,为行业通用标准结构。
{
"body": {
"StockCode": "ZY_DAX",
"Price": 18268.35,
"Open": 18210.60,
"LastClose": 18195.22,
"High": 18296.41,
"Low": 18182.75,
"Time": "2026-07-14 16:02:35",
"LastTime": 1784092955,
"BP1": "",
"BV1": "",
"SP1": "",
"SV1": "",
"TotalVol": "",
"Diff": 73.13,
"DiffRate": 0.40
}
}
五、字段详细释义
-
StockCode:接口内部品种编码ZY_DAX,对应市场通用DAX德指
-
Price:德指实时最新点位,为盘面核心参考数据
-
Open/LastClose:当日开盘点位、上一交易日收盘基准点位
-
High/Low:日内价格波动最高、最低点位,用于判断震荡区间
-
Time/LastTime:格式化时间、秒级时间戳,用于前端时间展示与时序校准
-
BP1/BV1/SP1/SV1/TotalVol:股指品类无盘口、成交量数据,字段默认置空
-
Diff/DiffRate:当日涨跌绝对点数、百分比涨跌幅,用于行情涨跌展示
六、前端工程优化与落地场景
1、资源优化:通过页面可见性监听,页面后台休眠时自动断开连接,避免长期占用浏览器线程与带宽。
2、容错优化:多重异常捕获,畸形数据包不会导致整个监听逻辑崩溃,稳定性极强。
3、防重复连接:全局唯一连接实例,避免页面多次刷新、重复调用导致多连接堆叠。
4、适用场景:跨境指数盯盘网页、多品种行情看板、欧美盘联动监控系统、前端可视化行情组件开发。
5、拓展方案:如需同时监控恒指、纳指、A50等股指,仅替换订阅Key对应编码即可,整体监听逻辑无需修改。
更多推荐




所有评论(0)