在构建金融类网站或量化交易系统时,实时行情数据是不可或缺的核心组件之一。尤其是对港股市场感兴趣的开发者,更需要一个可靠且实时的行情源。本文将介绍如何使用 PHP 接入Infoway API的港股行情接口,并实现实时接收 1 分钟 K 线数据。
准备工作
首先,确保你的开发环境中安装了Composer。我们将使用 PHP 的 WebSocket 客户端库textalk/websocket。
composer require textalk/websocket
代码实现
下面是完整的 PHP 示例代码,连接 WebSocket 接口并订阅港股 00285.HK
的 1 分钟 K 线数据
<?php
require 'vendor/autoload.php';
use WebSocket\Client;
// 替换为你的 Infoway API Key
$apiKey = 'yourApiKey';
$wsUrl = "wss://data.infoway.io/ws?business=stock&apikey=$apiKey";
// 初始化 WebSocket 客户端
$client = new Client($wsUrl, [
'timeout' => 60,
]);
// 构造订阅消息(订阅 00285.HK 的 1分钟K线)
$initMessage = [
"code" => 10004,
"trace" => uniqid(),
"data" => [
"arr" => [
[
"type" => 1, // 1分钟K线
"codes" => "00285.HK" // 港股代码
]
]
]
];
// 发送订阅消息
$client->send(json_encode($initMessage));
// 设置 ping 发送间隔
$lastPingTime = time();
while (true) {
try {
// 每30秒发送一次 ping 保持连接
if (time() - $lastPingTime >= 30) {
$pingMessage = [
"code" => 10010,
"trace" => uniqid()
];
$client->send(json_encode($pingMessage));
$lastPingTime = time();
}
// 接收并处理消息
$message = $client->receive();
echo " Message received: $message\n";
} catch (Exception $e) {
echo "❌ Connection error: " . $e->getMessage() . "\n";
break;
}
}
返回示例
{
"c": "4.58", // 当前价格
"h": "4.59", // 最高价
"l": "4.54", // 最低价
"o": "4.55", // 开盘价
"pca": "0.03", // 价格变化(现价 - 昨收)
"pfr": "0.66%", // 价格变化百分比
"s": "00285.HK", // 股票代码(港股)
"t": 1747550648097, // 时间戳(毫秒)
"ty": 1, // K线类型:1 表示1分钟K线
"v": "120000", // 交易量(股数)
"vw": "4.56" // 加权平均价格
}
港股盘口查询
<?php
require 'vendor/autoload.php';
use WebSocket\Client;
// 请在官网www.infoway.io申请秘钥
$apiKey = 'yourApiKey';
$wsUrl = "wss://data.infoway.io/ws?business=stock&apikey=$apiKey";
// 初始化 WebSocket 客户端
$client = new Client($wsUrl, [
'timeout' => 60,
]);
// 构造初始化消息:订阅港股 00285.HK 的盘口数据
$initMessage = [
"code" => 10002, // 盘口订阅的协议号
"trace" => uniqid(), // 随机可追踪ID
"data" => [
"codes" => "00285.HK" // 港股代码
]
];
// 发送初始化订阅请求
$client->send(json_encode($initMessage));
// 设置 ping 时间戳
$lastPing = time();
while (true) {
try {
// 每30秒发送一次 ping 保持连接
if (time() - $lastPing >= 30) {
$pingMessage = [
"code" => 10010,
"trace" => uniqid()
];
$client->send(json_encode($pingMessage));
$lastPing = time();
}
// 接收消息
$message = $client->receive();
echo " Market Depth Message: $message\n";
} catch (Exception $e) {
echo "❌ WebSocket error: " . $e->getMessage() . "\n";
break;
}
}