当前位置: 首页 > news >正文

使用WebSocket实时获取印度股票数据源(无调用次数限制)实战


使用WebSocket实时获取印度股票数据源(无调用次数限制)实战


一、前置准备

1. 获取API密钥

登录 StockTV开发者平台 → 联系客服获取测试Key(格式MY4b781f618e3f43c4b055f25fa61941ad),该密钥无调用次数限制且支持实时数据持续订阅。

2. 安装Python依赖

pip install websocket-client json pandas

二、核心代码实现

1. 建立WebSocket连接

import websocket
import json
import timeAPI_KEY = "YOUR_API_KEY"
WS_URL = f"wss://ws-api.stocktv.top/connect?key={API_KEY}"def on_message(ws, message):"""处理实时行情推送"""data = json.loads(message)if data.get('type') == 'stock':print(f"[{data['symbol']}] 价格: {data['last']} 涨跌幅: {data['pcp']}%")def on_error(ws, error):print(f"连接异常: {error}")def on_close(ws, close_status_code, close_msg):print(f"连接关闭: {close_msg}")def on_open(ws):"""连接成功后订阅股票"""subscribe_msg = json.dumps({"action": "subscribe","symbols": ["RELIANCE", "NSEI"]  # 印度信实工业/Nifty50指数})ws.send(subscribe_msg)print("订阅成功,开始接收实时数据...")

2. 启动实时监听(含自动重连)

def start_websocket():while True:try:ws = websocket.WebSocketApp(WS_URL,on_message=on_message,on_error=on_error,on_close=on_close)ws.on_open = on_openws.run_forever()except Exception as e:print(f"连接异常,5秒后重连: {str(e)}")time.sleep(5)# 启动线程持续运行
import threading
threading.Thread(target=start_websocket, daemon=True).start()

3. 添加心跳机制(保持长连接)

def send_heartbeat(ws):"""每30秒发送心跳包"""while True:try:ws.send(json.dumps({"action": "ping"}))time.sleep(30)except Exception as e:break# 在on_open函数中启动心跳线程
def on_open(ws):# ...原有订阅代码...threading.Thread(target=send_heartbeat, args=(ws,), daemon=True).start()

三、实时数据示例输出

订阅成功,开始接收实时数据...
[RELIANCE] 价格: 2856.15 涨跌幅: +1.23%
[NSEI] 价格: 22985.40 涨跌幅: +0.75%
[RELIANCE] 价格: 2857.80 涨跌幅: +1.35% 

四、关键参数说明

字段说明示例值
symbol股票/指数代码RELIANCE, NSEI
last最新成交价2856.15
pcp涨跌幅百分比(自动带±号)+1.23%
volume成交量(股)1254875
timestamp数据时间戳(Unix毫秒级)1725002394123

五、注意事项

  1. 连接稳定性
    通过自动重连机制+心跳包保障7×24小时持续运行

  2. 数据时效性
    印度市场交易时段为IST 9:15-15:30(北京时间11:45-18:00),非交易时段无实时数据推送

  3. 性能优化
    建议使用异步处理框架(如asyncio)避免数据堆积,实测单连接可承载100+标的实时推送


http://www.lqws.cn/news/185941.html

相关文章:

  • QuaggaJS用法详解
  • vue生成二维码图片+文字说明
  • Vue 组件库发布实战(含 TypeScript 支持)
  • 课消管理软件,教培机构进入系统管理时代
  • 高温IC设计带来的挑战和问题
  • 深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步
  • Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
  • JavaScript 原型与原型链:深入理解 __proto__ 和 prototype 的由来与关系
  • 区块链技术相关
  • 李沐《动手学深度学习》d2l安装教程
  • JS面试常见问题——数据类型篇
  • Java并发编程面试题
  • 【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)
  • MySQL体系架构解析(二):MySQL目录与启动配置全解析
  • 模板方法模式:优雅封装不变,灵活扩展可变
  • API标准的本质与演进:从 REST 架构到 AI 服务集成
  • “一代更比一代强”:现代 RAG 架构的演进之路
  • 动力电池点焊机:驱动电池焊接高效与可靠的核心力量|比斯特自动化
  • Significant Location Change
  • 【Kotlin】协程
  • 【Kotlin】注解反射扩展
  • Android 之 kotlin 语言学习笔记四(Android KTX)
  • 深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
  • C++.OpenGL (1/64) 创建窗口(Hello Window)
  • 办公提效的AI免费工具使用感悟
  • 如何让AI自己检查全文?使用OCR和LLM实现自动“全文校订”(可DIY校订规则)
  • 什么是质量管理系统?质量管理系统都有哪些功能?
  • vue-21 (使用 Vuex 模块和异步操作构建复杂应用)
  • 单例模式与锁(死锁)
  • 硅基计划2.0 学习总结 陆 抽象类与接口