新加坡股票API 实时行情、K 线及指数数据

一、核心配置

参数 Key 固定值 说明
countryId 36 你指定的国家 ID
key 你的密钥 必填,需联系 StockTV 获取

API 基础信息:

  • Base URL : https://api.stocktv.top
  • 格式: JSON

二、PHP 对接代码

php 复制代码
<?php
// StockTV API 配置
define('STOCKTV_API_KEY', 'YOUR_API_KEY'); // 请替换为你的实际 Key
define('STOCKTV_BASE_URL', 'https://api.stocktv.top');

/**
 * 通用 API 请求函数(严格锁定 countryId=36)
 */
function stocktvApiRequest($endpoint, $params = []) {
    // 1. 强制使用 countryId=36
    $defaultParams = [
        'key' => STOCKTV_API_KEY,
        'countryId' => 36, // 按你要求固定为 36
    ];
    $queryParams = array_merge($defaultParams, $params);
    $url = STOCKTV_BASE_URL . $endpoint . '?' . http_build_query($queryParams);

    // 2. 发起请求
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_TIMEOUT => 10,
    ]);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    // 3. 解析响应
    if ($httpCode === 200) {
        $data = json_decode($response, true);
        if (isset($data['code']) && $data['code'] == 200) {
            return $data;
        }
        return ['error' => 'API Error: ' . ($data['message'] ?? 'Unknown error')];
    }
    return ['error' => 'HTTP Error: ' . $httpCode];
}

/**
 * 1. 获取股票列表(countryId=36)
 */
function getStockList($page = 1, $pageSize = 20) {
    $endpoint = '/stock/stocks';
    $params = [
        'page' => $page,
        'pageSize' => $pageSize,
    ];
    return stocktvApiRequest($endpoint, $params);
}

/**
 * 2. 查询个股实时行情
 * @param int|string $identifier 股票的 PID(推荐)或代码
 */
function getStockQuote($identifier) {
    $endpoint = '/stock/queryStocks';
    $params = [];
    if (is_numeric($identifier)) {
        $params['id'] = $identifier;
    } else {
        $params['symbol'] = $identifier;
    }
    return stocktvApiRequest($endpoint, $params);
}

/**
 * 3. 获取指数数据(countryId=36)
 */
function getIndices() {
    $endpoint = '/stock/indices';
    return stocktvApiRequest($endpoint);
}

/**
 * 4. 获取历史 K 线数据
 * @param int $pid 股票 PID(必须)
 * @param string $interval 周期: PT1M, PT5M, PT1H, P1D 等
 */
function getKline($pid, $interval = 'P1D') {
    $endpoint = '/stock/kline';
    $params = [
        'pid' => $pid,
        'interval' => $interval,
    ];
    return stocktvApiRequest($endpoint, $params);
}

// ==================== 使用示例 ====================

// 示例1:获取股票列表
$result = getStockList(1, 5);
if (!isset($result['error'])) {
    $stocks = $result['data']['records'] ?? [];
    foreach ($stocks as $stock) {
        echo "代码: {$stock['symbol']}, 名称: {$stock['name']}, 最新价: {$stock['last']}\n";
    }
} else {
    echo $result['error'];
}

// 示例2:查询指定股票(先用 PID 或 Symbol)
$quote = getStockQuote('EXAMPLE'); // 替换为实际代码
if (!isset($quote['error'])) {
    $stockData = $quote['data'] ?? [];
    echo "股票: {$stockData['last']}, 涨跌幅: {$stockData['chgPct']}%\n";
}
?>

三、关键说明与风险提示

  1. 调试建议 :
    • 第一步:替换 YOUR_API_KEY 为真实值。
    • 第二步:先运行 getStockList(1, 5) 测试。如果返回空,请直接联系 StockTV 官方确认 countryId=36 在你账户下的有效性和对应市场。

四、接口返回结构(参考)

成功响应格式(code=200):

json 复制代码
{
  "code": 200,
  "data": {
    "records": [
      {
        "id": 12345,
        "symbol": "STOCK1",
        "name": "Example Stock",
        "last": 100.50,
        "chgPct": 1.5,
        "volume": 1000000,
        "exchangeId": 1
      }
    ]
  }
}
相关推荐
smallyoung8 分钟前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
程序猿DD23 分钟前
OctaFuse Gateway 2.16.0:新增 ElevenLabs 的支持、厂商原生端点重构、后台管理优化
后端
掘金者阿豪24 分钟前
列存储适不适合订单报表?从一条慢 SQL 聊聊金仓 KES 的使用边界
后端
武子康1 小时前
150毫秒和2400毫秒:同一 Agent 任务的两种延迟
人工智能·后端·agent
hai_android1 小时前
把 Android App 打包成系统应用(System App)
android·kotlin·android jetpack
海边捡石子1 小时前
FreeSWITCH 入门:把电话系统接入语音客服机器人
人工智能·后端
JMchen1 小时前
【Jetpack 内核实战 01】开篇:Jetpack 组件全家桶核心逻辑与专栏完整规划
android·kotlin·android jetpack
武子康2 小时前
Agent 偏好记忆怎样确认写入:范围、版本与撤销的一个最小例
人工智能·后端·agent
Bazingga2 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
对象存储与RustFS2 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker