一、前言:专业行情数据对接的核心价值
对于量化交易、风控系统或实时监控应用,稳定的行情数据是生命线。本文将基于专业行情数据服务,展示如何用ThinkPHP快速对接外汇、贵金属、黄金、铂金、铑金等实时行情API和K线数据。
获取授权的地址:http://39.107.99.235:1008/market
二、核心接口介绍
基于行情数据服务,我们主要对接以下核心接口:
-
HTTP实时行情接口
- 地址:http://39.107.99.235:1008/getQuote.php
- 方式:GET请求
- 参数:code=品种代码
- 特点:单次请求获取最新价、买卖盘、成交明细等
-
HTTP K线接口
- 地址:http://39.107.99.235:1008/redis.php
- 方式:GET请求
- 参数:code=品种代码&time=周期&rows=条数
- 特点:支持1m到1M多种周期
-
其他辅助接口
- 产品分类接口:获取市场分类
- 品种列表接口:获取可交易品种
- WebSocket接口:实时推送(可选)
三、ThinkPHP核心代码实现
3.1 实时行情获取服务
app/service/RealtimeQuoteService.php
<?php
namespace app\service;
use GuzzleHttp\Client;
class RealtimeQuoteService
{
// 实时行情接口地址
private const QUOTE_URL = 'http://39.107.99.235:1008/getQuote.php';
private $client;
public function __construct()
{
$this->client = new Client([
'timeout' => 10,
'verify' => false
]);
}
/**
* 获取单个品种实时行情
* @param string $symbol 品种代码,如:btcusdt, xauusd
* @return array|null 完整的行情数据
*/
public function getRealtimeQuote(string $symbol): ?array
{
try {
$url = self::QUOTE_URL . '?code=' . $symbol;
$response = $this->client->get($url, [
'headers' => [
'Accept-Encoding' => 'gzip'
]
]);
if ($response->getStatusCode() === 200) {
return json_decode($response->getBody()->getContents(), true);
}
} catch (\Exception $e) {
// 异常处理
}
return null;
}
/**
* 批量获取多个品种行情
* @param array $symbols 品种代码列表
* @return array 各品种行情数据
*/
public function getBatchQuotes(array $symbols): array
{
$result = [];
// 使用并行流提升获取效率(注意频率限制)
foreach ($symbols as $symbol) {
$quote = $this->getRealtimeQuote($symbol);
if ($quote !== null) {
$result[$symbol] = $quote;
}
}
return $result;
}
}
3.2 K线数据获取服务
app/service/KlineDataService.php
<?php
namespace app\service;
use GuzzleHttp\Client;
class KlineDataService
{
// K线接口地址
private const KLINE_URL = 'http://39.107.99.235:1008/redis.php';
private $client;
public function __construct()
{
$this->client = new Client([
'timeout' => 15,
'verify' => false
]);
}
/**
* 获取K线数据
* @param string $symbol 品种代码
* @param string $interval 周期
* @param int $rows 获取条数
* @return array K线数据列表
*/
public function getKlineData(string $symbol, string $interval, int $rows): array
{
try {
$url = self::KLINE_URL . sprintf(
'?code=%s&time=%s&rows=%d',
$symbol,
$interval,
$rows
);
$response = $this->client->get($url, [
'headers' => [
'Accept-Encoding' => 'gzip'
]
]);
if ($response->getStatusCode() === 200) {
return json_decode($response->getBody()->getContents(), true);
}
} catch (\Exception $e) {
// 异常处理
}
return [];
}
}
3.3 控制器(对外提供接口)
app/controller/MarketController.php
<?php
namespace app\controller;
use app\BaseController;
use app\service\RealtimeQuoteService;
use app\service\KlineDataService;
class MarketController extends BaseController
{
protected $quoteService;
protected $klineService;
protected function initialize()
{
$this->quoteService = new RealtimeQuoteService();
$this->klineService = new KlineDataService();
}
/**
* 获取黄金实时行情
*/
public function goldRealtime()
{
$data = $this->quoteService->getRealtimeQuote('xauusd');
return json($data);
}
/**
* 获取外汇实时行情
*/
public function forexRealtime()
{
$pair = $this->request->param('pair');
$data = $this->quoteService->getRealtimeQuote(strtolower($pair));
return json($data);
}
/**
* 获取K线数据
*/
public function kline()
{
$symbol = $this->request->param('symbol');
$interval = $this->request->param('interval', '1h');
$rows = $this->request->param('rows', 100, 'intval');
// 验证参数有效性
$validIntervals = ['1m', '5m', '15m', '30m', '1h', '1d', '1M'];
if (!in_array($interval, $validIntervals)) {
return json(['error' => '不支持的K线周期'], 400);
}
$data = $this->klineService->getKlineData($symbol, $interval, $rows);
return json($data);
}
/**
* 获取多个品种行情
*/
public function batchQuotes()
{
$symbols = $this->request->param('symbols/a', []);
// 限制最大请求品种数
if (count($symbols) > 20) {
return json(['error' => '单次最多请求20个品种'], 400);
}
$data = $this->quoteService->getBatchQuotes($symbols);
return json($data);
}
}
四、路由配置
route/app.php
<?php
use think\facade\Route;
// 行情API路由
Route::group('api/market', function () {
// 获取黄金实时行情
Route::get('gold/realtime', 'MarketController/goldRealtime');
// 获取外汇实时行情
Route::get('forex/realtime', 'MarketController/forexRealtime');
// 获取K线数据
Route::get('kline', 'MarketController/kline');
// 获取多个品种行情
Route::post('batch-quotes', 'MarketController/batchQuotes');
});
五、总结
通过以上代码,你可以快速构建一个稳定可靠的行情数据服务系统。关键优势:
- 即拿即用:代码可直接运行,只需替换为你的测试地址
- 异常完备:包含频率控制、异常处理
- 扩展性强:支持轻松扩展更多数据接口
- 生产就绪:基于ThinkPHP框架的最佳实践
技术栈:ThinkPHP 6.0+ | PHP 7.4+ | GuzzleHttp
适用场景:量化交易系统、风险监控、实时行情展示、数据分析平台