使用PHP对接马来西亚股票市场API 实时数据、IPO和K线(Kline)的PHP对接方案

4 阅读4分钟

一、基础配置

在对接任何接口前,您需要从 StockTV 获取 API Key,并设置基础请求函数。

<?php
// StockTV API 配置
define('STOCKTV_API_KEY', '您从StockTV获取的Key'); // 务必替换
define('STOCKTV_BASE_URL', 'https://api.stocktv.top');

/**
 * 发起 HTTP GET 请求
 * @param string $endpoint API路径
 * @param array $params 查询参数
 * @return array
 */
function stocktvApiRequest($endpoint, $params = []) {
    $params['key'] = STOCKTV_API_KEY; // 必须包含 key
    $url = STOCKTV_BASE_URL . $endpoint . '?' . http_build_query($params);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    
    $response = curl_exec($ch);
    if ($response === false) {
        curl_close($ch);
        return ['error' => 'CURL Error: ' . curl_error($ch)];
    }
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    $decoded = json_decode($response, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        return ['error' => 'JSON Decode Error'];
    }
    return $decoded;
}
?>

二、马来西亚股票核心数据对接

文档显示,股票相关的接口主要集中在 /stock/ 路径下。马来西亚的关键参数是 countryId=42

1. 获取马来西亚市场股票列表

这是最基础的接口,用于分页获取马来西亚交易所的股票列表,包含实时行情、基本面和技术指标。

<?php
/**
 * 获取马来西亚股票市场列表
 * @param int $page 页码
 * @param int $pageSize 每页数量
 * @param int|null $exchangeId 交易所ID (非必需)
 * @return array
 */
function getMalaysiaStockList($page = 1, $pageSize = 50, $exchangeId = null) {
    $endpoint = '/stock/stocks';
    $params = [
        'countryId' => 42, // 马来西亚
        'page' => $page,
        'pageSize' => $pageSize,
    ];
    if ($exchangeId !== null) {
        $params['exchangeId'] = $exchangeId; // 可用于筛选特定交易所
    }
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例
$result = getMalaysiaStockList(1, 10);
if (isset($result['code']) && $result['code'] == 200) {
    $stocks = $result['data']['records'];
    echo "马来西亚股票列表 (第1页,共" . $result['data']['total'] . "只):\n";
    foreach ($stocks as $stock) {
        $trend = $stock['chgPct'] >= 0 ? '↑' : '↓';
        echo sprintf("  %s (%s): %.3f %s%.2f%%\n", 
            $stock['name'], 
            $stock['symbol'], 
            $stock['last'],
            $trend,
            abs($stock['chgPct'])
        );
    }
} else {
    echo "请求失败: " . ($result['message'] ?? '未知错误');
}
?>

接口返回字段说明(摘录自文档)

  • id: 股票的唯一PID,用于后续查询(如K线)。
  • name / symbol: 股票名称和代码。
  • last / chg / chgPct: 最新价、涨跌额、涨跌幅。
  • high / low: 当日最高/最低价。
  • volume: 成交量。
  • open: 是否开市。
  • technicalDay / technicalHour 等: 日线/小时线技术指标信号(如 strong_buy)。

2. 查询特定马来西亚股票

可以通过股票PID、名称或代码进行精确查询。

<?php
/**
 * 查询马来西亚股票
 * @param int|null $pid 股票PID
 * @param string|null $symbol 股票代码
 * @param string|null $name 股票名称
 * @return array
 */
function queryMalaysiaStock($pid = null, $symbol = null, $name = null) {
    $endpoint = '/stock/queryStocks';
    $params = [];
    if ($pid) $params['id'] = $pid;
    if ($symbol) $params['symbol'] = $symbol;
    if ($name) $params['name'] = $name;
    // 注意:此接口本身不包含countryId参数,结果中会包含所有匹配项,需自行筛选flag为'MY'的
    $result = stocktvApiRequest($endpoint, $params);
    // 筛选马来西亚股票
    if (isset($result['code']) && $result['code'] == 200 && is_array($result['data'])) {
        $result['data'] = array_filter($result['data'], function($stock) {
            return isset($stock['flag']) && $stock['flag'] === 'MY';
        });
    }
    return $result;
}
?>

3. 获取马来西亚市场指数

获取马来西亚的主要市场指数,如富时大马综合指数 (FTSE Bursa Malaysia KLCI)。

<?php
/**
 * 获取马来西亚市场指数
 * @return array
 */
function getMalaysiaIndices() {
    $endpoint = '/stock/indices';
    $params = [
        'countryId' => 42, // 马来西亚
        // 'flag' => 'MY' // 非必要参数
    ];
    return stocktvApiRequest($endpoint, $params);
}
?>

4. 获取马来西亚股票K线数据

这是进行技术分析的核心接口,支持多种时间周期。

<?php
/**
 * 获取马来西亚股票K线数据
 * @param int $pid 股票PID
 * @param string $interval K线周期: PT5M, PT15M, PT1H, PT5H, P1D, P1W, P1M
 * @return array
 */
function getMalaysiaStockKline($pid, $interval = 'P1D') {
    $endpoint = '/stock/kline';
    $params = [
        'pid' => $pid,
        'interval' => $interval,
    ];
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例:获取某股票(PID=41602)的日K线
$klineData = getMalaysiaStockKline(41602, 'P1D');
if (isset($klineData['code']) && $klineData['code'] == 200) {
    $klines = $klineData['data'];
    echo "K线数据(日线)最新3条:\n";
    $recent = array_slice($klines, -3); // 取最后3条
    foreach ($recent as $bar) {
        $date = date('Y-m-d', $bar['time'] / 1000);
        echo "日期: {$date}, 开:{$bar['open']}, 高:{$bar['high']}, 低:{$bar['low']}, 收:{$bar['close']}, 量:{$bar['volume']}\n";
    }
}
?>

5. 获取马来西亚IPO新股日历

了解马来西亚市场的新股发行和上市计划。

<?php
/**
 * 获取马来西亚IPO信息
 * @param int|null $type 1=未上市, 2=已上市
 * @return array
 */
function getMalaysiaIpo($type = null) {
    $endpoint = '/stock/getIpo';
    $params = ['countryId' => 42];
    if (in_array($type, [1, 2])) {
        $params['type'] = $type;
    }
    return stocktvApiRequest($endpoint, $params);
}
?>

6. 获取马来西亚股票涨跌排行榜

实时了解市场热点。

<?php
/**
 * 获取马来西亚股票排行榜
 * @param int $type 1涨幅榜 2跌幅榜 3涨停榜 4跌停榜
 * @return array
 */
function getMalaysiaStockRank($type = 1) {
    $endpoint = '/stock/updownList';
    $params = [
        'countryId' => 42,
        'type' => $type,
    ];
    return stocktvApiRequest($endpoint, $params);
}
?>

三、高级功能:WebSocket 实时数据

对于实时行情推送,文档推荐使用WebSocket,这比HTTP轮询更高效。马来西亚股票的实时数据同样通过此方式获取。

关键步骤

  1. 连接:连接到 wss://ws-api.stocktv.top/connect?key=您的Key
  2. 订阅:连接成功后,发送订阅消息,指定要订阅的马来西亚股票的 pid
  3. 接收:服务器会持续推送订阅股票的实时行情。
  4. 心跳:需要定期发送心跳消息以保持连接。

文档中提供了一个前端Demo,并提到有Java Demo。对于PHP,您可以使用 ratchet/pawl 等WebSocket客户端库来实现。由于实现相对复杂且依赖具体业务逻辑,此处不展开详细代码,但核心流程如上。

四、完整对接流程与注意事项

  1. 获取API Key:这是第一步,也是必须的一步。所有请求都必须携带 key 参数。
  2. 确定数据需求
    • 批量列表/监控:使用 getMalaysiaStockListgetMalaysiaStockRank
    • 特定股票查询:使用 queryMalaysiaStock,或先通过列表接口找到股票的 pid
    • 历史数据分析:使用 getMalaysiaStockKline
    • 实时推送必须使用WebSocket接口
    • 市场概况:使用 getMalaysiaIndices
    • 新股信息:使用 getMalaysiaIpo
  3. 核心参数
    • countryId: 马来西亚固定为 42
    • pid: 股票的唯一标识,用于K线、WebSocket订阅等精细操作。务必从列表或查询接口获取正确的 pid
    • interval: K线周期,根据分析需求选择。
  4. 错误处理与日志:在生产环境中,务必对API返回的 codemessage 字段进行判断,并记录日志。
  5. 性能与频率:虽然文档未明确说明频率限制,但应避免不必要的高频请求。对于大量股票的实时监控,WebSocket是唯一推荐的方式。

通过以上接口,您可以全面对接马来西亚股票的实时行情、历史K线、市场指数、IPO信息等数据。请根据您的实际应用场景组合使用这些接口。