印度市场股票实战API:WebSocket实时数据对接指南

印度市场股票实战API:WebSocket实时数据对接指南

概述

随着全球投资者对新兴市场关注度的提升,印度股市已成为国际资本的重要投资目的地。本文将介绍如何通过API接口获取印度股市的实时行情数据,并重点讲解WebSocket实时数据推送技术的实战应用。

API接口概览

该数据接口提供了全面的印度股市数据服务,主要包括以下功能:

  • 印度股票市场列表查询
  • 个股实时行情数据
  • 指数信息(Nifty 50、Sensex等)
  • K线历史数据
  • 涨跌排行榜
  • 公司基本信息
  • 实时新闻资讯
  • WebSocket实时数据推送

核心接口详解

1. 获取印度市场股票列表

GET https://api.stocktv.top/stock/stocks?countryId=14&pageSize=50&page=1&key=您的API_KEY

参数说明:

  • countryId=14:印度市场编号
  • pageSize:每页返回数量
  • page:页码
  • key:API授权密钥

2. 查询特定股票信息

GET https://api.stocktv.top/stock/queryStocks?countryId=14&symbol=RELIANCE&key=您的API_KEY

3. 获取指数信息

GET https://api.stocktv.top/stock/indices?countryId=14&key=您的API_KEY

WebSocket实时数据对接

WebSocket连接配置

// 建立WebSocket连接
const ws = new WebSocket('wss://ws-api.stocktv.top/connect?key=您的API_KEY');

// 连接开启事件
ws.onopen = function(event) {
    console.log('WebSocket连接已建立');
    // 发送订阅请求
    const subscribeMessage = {
        action: "subscribe",
        symbols: ["PID:946725", "PID:977119"] // 要订阅的产品ID列表
    };
    ws.send(JSON.stringify(subscribeMessage));
};

// 接收消息处理
ws.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log('收到实时数据:', data);
    // 处理实时行情数据
    updateStockData(data);
};

// 错误处理
ws.onerror = function(error) {
    console.error('WebSocket错误:', error);
};

// 连接关闭处理
ws.onclose = function(event) {
    console.log('WebSocket连接已关闭');
};

心跳维持机制

为保证WebSocket连接稳定性,需要定期发送心跳包:

// 心跳间隔(毫秒)
const HEARTBEAT_INTERVAL = 30000;
let heartbeatInterval;

// 连接成功后启动心跳
ws.onopen = function(event) {
    console.log('WebSocket连接已建立');
    
    // 启动心跳
    heartbeatInterval = setInterval(() => {
        if (ws.readyState === WebSocket.OPEN) {
            ws.send(JSON.stringify({action: "ping"}));
        }
    }, HEARTBEAT_INTERVAL);
    
    // 订阅股票
    const subscribeMessage = {
        action: "subscribe",
        symbols: ["PID:946725", "PID:977119", "PID:41602"]
    };
    ws.send(JSON.stringify(subscribeMessage));
};

// 连接关闭时清除心跳
ws.onclose = function(event) {
    console.log('WebSocket连接已关闭');
    clearInterval(heartbeatInterval);
};

实时数据处理

WebSocket返回的实时数据格式如下:

{
    "pid": "992844",
    "symbol": "IGSL",
    "last_numeric": "2.46",
    "last_dir": "greenBg",
    "chg": "-0.62",
    "chgPct": "-20.13",
    "bid": "2.45",
    "ask": "2.47",
    "high": "2.77",
    "low": "2.46",
    "volume": "13955963",
    "turnover_numeric": "3672800",
    "time": "02:44:11",
    "timestamp": "1717728251",
    "type": 1
}

实战应用示例

完整的印度股票实时监控系统

<!DOCTYPE html>
<html>
<head>
    <title>印度股票实时监控</title>
    <style>
        .stock-table { width: 100%; border-collapse: collapse; }
        .stock-table th, .stock-table td { padding: 8px; text-align: left; border-bottom: 1px solid #ddd; }
        .price-up { color: green; }
        .price-down { color: red; }
        .connection-status { padding: 10px; margin: 10px 0; border-radius: 5px; }
        .connected { background-color: #dff0d8; color: #3c763d; }
        .disconnected { background-color: #f2dede; color: #a94442; }
    </style>
</head>
<body>
    <h1>印度股票实时行情</h1>
    
    <div id="connectionStatus" class="connection-status disconnected">
        连接状态: 未连接
    </div>
    
    <button onclick="connectWebSocket()">连接</button>
    <button onclick="disconnectWebSocket()">断开</button>
    
    <table class="stock-table">
        <thead>
            <tr>
                <th>股票代码</th>
                <th>名称</th>
                <th>最新价</th>
                <th涨跌额</th>
                <th>涨跌幅</th>
                <th>成交量</th>
                <th>时间</th>
            </tr>
        </thead>
        <tbody id="stockData">
            <!-- 动态填充数据 -->
        </tbody>
    </table>

    <script>
        let ws = null;
        const apiKey = "您的API_KEY";
        const stockSymbols = ["PID:946725", "PID:977119", "PID:41602"];
        
        // 初始化股票数据表
        const stockData = {};
        stockSymbols.forEach(symbol => {
            stockData[symbol] = {
                symbol: symbol.split(':')[1],
                name: '',
                last: 0,
                chg: 0,
                chgPct: 0,
                volume: 0,
                time: ''
            };
        });
        
        // 更新连接状态显示
        function updateConnectionStatus(connected) {
            const statusElement = document.getElementById('connectionStatus');
            if (connected) {
                statusElement.textContent = '连接状态: 已连接';
                statusElement.className = 'connection-status connected';
            } else {
                statusElement.textContent = '连接状态: 未连接';
                statusElement.className = 'connection-status disconnected';
            }
        }
        
        // 建立WebSocket连接
        function connectWebSocket() {
            if (ws && ws.readyState === WebSocket.OPEN) {
                console.log('WebSocket已连接');
                return;
            }
            
            ws = new WebSocket(`wss://ws-api.stocktv.top/connect?key=${apiKey}`);
            
            ws.onopen = function(event) {
                console.log('WebSocket连接已建立');
                updateConnectionStatus(true);
                
                // 订阅股票
                const subscribeMessage = {
                    action: "subscribe",
                    symbols: stockSymbols
                };
                ws.send(JSON.stringify(subscribeMessage));
            };
            
            ws.onmessage = function(event) {
                const data = JSON.parse(event.data);
                console.log('收到数据:', data);
                
                // 更新股票数据
                if (data.pid) {
                    const pid = `PID:${data.pid}`;
                    if (stockData[pid]) {
                        stockData[pid].last = parseFloat(data.last_numeric);
                        stockData[pid].chg = parseFloat(data.pc);
                        stockData[pid].chgPct = parseFloat(data.pcp);
                        stockData[pid].volume = parseInt(data.turnover_numeric);
                        stockData[pid].time = data.time;
                        
                        // 更新表格
                        updateStockTable();
                    }
                }
            };
            
            ws.onerror = function(error) {
                console.error('WebSocket错误:', error);
                updateConnectionStatus(false);
            };
            
            ws.onclose = function(event) {
                console.log('WebSocket连接已关闭');
                updateConnectionStatus(false);
            };
        }
        
        // 断开WebSocket连接
        function disconnectWebSocket() {
            if (ws) {
                ws.close();
                ws = null;
            }
        }
        
        // 更新股票表格
        function updateStockTable() {
            const tableBody = document.getElementById('stockData');
            tableBody.innerHTML = '';
            
            for (const symbol in stockData) {
                const stock = stockData[symbol];
                const row = document.createElement('tr');
                
                // 确定价格变化样式
                const priceClass = stock.chg >= 0 ? 'price-up' : 'price-down';
                
                row.innerHTML = `
                    <td>${stock.symbol}</td>
                    <td>${stock.name || '加载中...'}</td>
                    <td class="${priceClass}">${stock.last.toFixed(2)}</td>
                    <td class="${priceClass}">${stock.chg >= 0 ? '+' : ''}${stock.chg.toFixed(2)}</td>
                    <td class="${priceClass}">${stock.chgPct >= 0 ? '+' : ''}${stock.chgPct.toFixed(2)}%</td>
                    <td>${stock.volume.toLocaleString()}</td>
                    <td>${stock.time}</td>
                `;
                
                tableBody.appendChild(row);
            }
        }
        
        // 初始化加载股票基本信息
        async function loadStockInfo() {
            try {
                const response = await fetch(`https://api.stocktv.top/stock/stocks?countryId=14&pageSize=50&page=1&key=${apiKey}`);
                const data = await response.json();
                
                if (data.code === 200) {
                    data.data.records.forEach(stock => {
                        const pid = `PID:${stock.id}`;
                        if (stockData[pid]) {
                            stockData[pid].name = stock.name;
                        }
                    });
                    
                    updateStockTable();
                }
            } catch (error) {
                console.error('加载股票信息失败:', error);
            }
        }
        
        // 页面加载时初始化
        window.onload = function() {
            loadStockInfo();
            updateStockTable();
        };
    </script>
</body>
</html>

高级功能扩展

1. 自动重连机制

let reconnectAttempts = 0;
const MAX_RECONNECT_ATTEMPTS = 5;
const RECONNECT_INTERVAL = 3000;

function setupReconnection() {
    ws.onclose = function(event) {
        console.log('WebSocket连接已关闭');
        updateConnectionStatus(false);
        
        if (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {
            setTimeout(() => {
                console.log(`尝试重新连接 (${reconnectAttempts + 1}/${MAX_RECONNECT_ATTEMPTS})`);
                reconnectAttempts++;
                connectWebSocket();
            }, RECONNECT_INTERVAL);
        }
    };
    
    ws.onopen = function(event) {
        console.log('WebSocket连接已建立');
        updateConnectionStatus(true);
        reconnectAttempts = 0; // 重置重连计数器
    };
}

2. 数据持久化与历史分析

// 使用IndexedDB存储实时数据
function initDatabase() {
    const request = indexedDB.open("StockDataDB", 1);
    
    request.onupgradeneeded = function(event) {
        const db = event.target.result;
        if (!db.objectStoreNames.contains('stockPrices')) {
            const store = db.createObjectStore('stockPrices', { keyPath: ['symbol', 'timestamp'] });
            store.createIndex('symbol', 'symbol', { unique: false });
            store.createIndex('timestamp', 'timestamp', { unique: false });
        }
    };
    
    request.onsuccess = function(event) {
        const db = event.target.result;
        window.stockDB = db;
        console.log('数据库初始化成功');
    };
    
    request.onerror = function(event) {
        console.error('数据库初始化失败:', event.target.error);
    };
}

// 存储实时数据
function saveStockData(data) {
    if (!window.stockDB) return;
    
    const transaction = window.stockDB.transaction(['stockPrices'], 'readwrite');
    const store = transaction.objectStore('stockPrices');
    
    const record = {
        symbol: data.symbol,
        price: data.last_numeric,
        volume: data.turnover_numeric,
        timestamp: new Date().getTime(),
        date: new Date().toISOString()
    };
    
    store.add(record);
    
    transaction.oncomplete = function() {
        console.log('数据已保存');
    };
    
    transaction.onerror = function(event) {
        console.error('数据保存失败:', event.target.error);
    };
}

注意事项

  1. API限制:注意查看API的使用频率限制,避免频繁请求导致IP被封
  2. 错误处理:完善的错误处理机制是生产环境应用的关键
  3. 数据准确性:实时数据可能存在延迟,重要交易决策应结合多个数据源
  4. 安全性:API密钥需妥善保管,避免在前端代码中硬编码敏感信息
  5. 网络稳定性:印度市场交易时段确保网络连接稳定,建议使用重连机制

结语

通过本文介绍的API接口和WebSocket技术,开发者可以构建功能强大的印度股市实时监控应用。无论是个人投资者还是金融机构,都可以利用这些工具获取实时市场数据,做出更明智的投资决策。

实际应用中,建议结合后端服务处理敏感操作和数据持久化,前端专注于数据展示和用户交互,从而构建稳定可靠的金融应用系统。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值