01
Getting Started(新人必读)
1.1 这是什么?
AllTick 是一个实时金融市场数据服务,你只需调用 API 就能拿到以下数据:
| 数据类型 | 通俗理解 | 支持的品种 |
|---|---|---|
| 最新成交价 (Tick) | 当前这一笔的成交价格 | 全部品种 |
| 盘口深度 (Order Book) | 买1~买N、卖1~卖N 的排队挂单 | 部分产品(部分CFD指数、大盘指数不支持) |
| K线 (K-Line) | 1分钟/日/周/月等周期的OHLCV | 全部品种 |
| 批量K线 (Batch-klien) | 一次查多个产品的最新2根K线 | 全部品种 |
| 股票基础信息 | 每股盈利、股息、市值等 | 仅股票 |
| 停复牌信息 | 哪些股票停牌了、何时复牌 | SSE/NYSE/NASDAQ |
1.2 三步接入流程
第1步:注册拿 Token(5分钟)
第2步:理解产品 Code(2分钟)
第3步:跑第一个 Hello World 请求(3分钟)
第1步:获取 Token
- 填写邮箱 + 密码 → 点击"注册"(注意大小写、特殊字符、数字)
- 注册成功后自动跳转 Dashboard → 在 “API Keys” 中找到你的 Token
- 免费套餐即可开始测试,无需付费
第2步:理解产品 Code(代码)
每一个交易品种都有一个唯一的 code,规则如下:
| 市场 | Code 格式 | 示例 | 补充说明 |
|---|---|---|---|
| A股(深交所) | 000000.SZ | 000627.SZ (天茂集团) | .SZ = 深圳 |
| A股(上交所) | 000000.SH | 600416.SH (湘电股份) | .SH = 上海 |
| 港股 | 0000.HK | 700.HK (腾讯控股) | .HK = 香港 |
| 美股 | AAAA.US | AAPL.US (苹果) | .US = 美国 |
| 外汇 | XXXYYY | EURUSD, USDJPY | 6位字母,基准币+标价币 |
| 加密货币 | XXXUSDT | BTCUSDT, ETHUSDT | 币种+USDT |
| 商品/贵金属 | 英文名 | GOLD, SILVER, USOIL | — |
| CFD指数 | 英文代码 | 详见列表 | 非大盘指数,价格可能略有不同 |
| 大盘指数 | 英文代码 | 详见列表 | — |
第3步:跑第一个请求!
Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
import java.io.*;
import java.net.*;
public class HelloAllTick {
public static void main(String[] args) throws Exception {
String token = "YOUR_TOKEN_HERE";
String queryJson = "{\"trace\":\"hello123\",\"data\":{"
+ "\"code\":\"700.HK\","
+ "\"kline_type\":1," // 1 = 1分钟K线
+ "\"kline_timestamp_end\":0,"
+ "\"query_kline_num\":2,"
+ "\"adjust_type\":0}}";
String urlStr = "https://quote.alltick.co/quote-stock-b-api/kline"
+ "?token=" + URLEncoder.encode(token, "UTF-8")
+ "&query=" + URLEncoder.encode(queryJson, "UTF-8");
HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
conn.setRequestMethod("GET");
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()))) {
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) response.append(line);
System.out.println("响应:" + response);
}
}
}Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
import requests
import json
TOKEN = "YOUR_TOKEN_HERE"
query_data = {
"trace": "hello123",
"data": {
"code": "700.HK",
"kline_type": 1, # 1 = 1分钟K线
"kline_timestamp_end": 0, # 0 = 从最新开始
"query_kline_num": 2, # 要2根K线
"adjust_type": 0
}
}
url = "https://quote.alltick.co/quote-stock-b-api/kline"
params = {
"token": TOKEN,
"query": json.dumps(query_data, separators=(',', ':'))
}
resp = requests.get(url, params=params, headers={"Content-Type": "application/json"})
print("响应:", resp.text)Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
token := "YOUR_TOKEN_HERE"
queryJSON := `{"trace":"hello123","data":{"code":"700.HK","kline_type":1,"kline_timestamp_end":0,"query_kline_num":2,"adjust_type":0}}`
fullURL := fmt.Sprintf("https://quote.alltick.co/quote-stock-b-api/kline?token=%s&query=%s",
token, url.QueryEscape(queryJSON))
resp, err := http.Get(fullURL)
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println("响应:", string(body))
}C++ (需要安装 libcurl)
CPPcpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
#include <iostream>
#include <string>
#include <curl/curl.h>
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* out) {
size_t total = size * nmemb;
out->append((char*)contents, total);
return total;
}
int main() {
CURL* curl = curl_easy_init();
std::string token = "YOUR_TOKEN_HERE";
std::string queryJson = R"({"trace":"hello123","data":{"code":"700.HK","kline_type":1,"kline_timestamp_end":0,"query_kline_num":2,"adjust_type":0}})";
char* encoded = curl_easy_escape(curl, queryJson.c_str(), queryJson.length());
std::string url = "https://quote.alltick.co/quote-stock-b-api/kline?token="
+ token + "&query=" + std::string(encoded);
curl_free(encoded);
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK)
std::cout << "响应:" << response << std::endl;
else
std::cerr << "请求失败: " << curl_easy_strerror(res) << std::endl;
curl_easy_cleanup(curl);
return 0;
}
// 编译:g++ -std=c++17 hello.cpp -lcurl -o hello1.3 通用概念速览
请求格式(所有 HTTP 接口通用)
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
// GET请求:此JSON需 URL-Encode 后放入 ?query= 参数
{
"trace": "每次请求的唯一ID(自己生成,如UUID,最长64字符)",
"data": { /* 具体参数见各接口 */ }
}响应格式(所有接口通用)
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"ret": 200, // 200=成功,其他=错误码(见Part 5)
"msg": "ok", // 文字描述
"trace": "你发过来的trace原样返回",
"data": { /* 具体数据 */ }
}HTTP vs WebSocket:怎么选?
| 场景 | 用什么 | 原因 |
|---|---|---|
| 定时拉K线、偶尔查价格 | HTTP REST | 简单,随用随取 |
| 需要实时推送价格、盘口变化 | WebSocket | 推送模式,低延迟 |
| 历史数据初始化(首次大量拉取) | HTTP /kline | 一次最多500根K线 |
| 持续更新最新数据 | HTTP /batch-kline | 批量高效 |
| 高频实时行情 | WebSocket 订阅 | 订阅后自动推送 |
URL 端点速查
| 数据类型 | 股票 / 大盘 | 外汇 / 加密 / 商品 / CFD指数 |
|---|---|---|
| HTTP 基础路径 | https://quote.alltick.co/quote-stock-b-api | https://quote.alltick.co/quote-b-api |
| WebSocket 路径 | wss://quote.alltick.co/quote-stock-b-ws-api | wss://quote.alltick.co/quote-b-ws-api |
02
产品 Code 速查表
股票类
| 市场 | Code 格式 | 示例 |
|---|---|---|
| A股(深交所) | 数字.SZ | 000627.SZ (天茂集团) |
| A股(上交所) | 数字.SH | 600416.SH (湘电股份) |
| 港股 | 数字.HK | 700.HK (腾讯控股) |
| 美股 | 字母.US | AAPL.US (苹果) |
外汇 & 加密货币 & 商品 & 指数
| 类别 | Code 格式 | 示例 |
|---|---|---|
| 外汇 | XXXYYY | EURUSD, AUDJPY, GBPUSD |
| 加密货币 | XXXUSDT | BTCUSDT, ETHUSDT, ADAUSDT |
| 商品/贵金属 | 英文名 | GOLD, SILVER, USOIL, COPPER, NGAS |
| CFD指数 | 英文代码 | 详见产品列表(非大盘指数,价格可能略有差异) |
| 大盘指数 | 英文代码 | 详见产品列表 |
03
HTTP REST API 详解
3.1 单产品K线查询 → GET /kline
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| code | string | 是 | 产品代码 |
| kline_type | int | 是 | K线类型:1=1分钟, 2=5分钟, 3=15分钟, 4=30分钟, 5=小时K, 6=2小时(股票不支持), 7=4小时(股票不支持), 8=日K, 9=周K, 10=月K |
| kline_timestamp_end | int | 是 | 起点时间戳,0=从最新开始;只有外汇贵金属加密支持传时间戳 |
| query_kline_num | int | 是 | 要几根K线,最大500 |
| adjust_type | int | 是 | 复权类型:0=除权(仅股票有效,目前仅支持0) |
响应数据
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"ret": 200, "msg": "ok",
"data": {
"code": "700.HK",
"kline_type": 1,
"kline_list": [
{
"timestamp": "1677829200",
"open_price": "136.421",
"close_price": "136.412",
"high_price": "136.422",
"low_price": "136.407",
"volume": "0",
"turnover": "0"
}
]
}
}示例:查苹果(AAPL.US)最近10根日K线
Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String token = "YOUR_TOKEN_HERE";
String queryJson = "{\"trace\":\"java_kline\",\"data\":{"
+ "\"code\":\"AAPL.US\",\"kline_type\":8," // 8 = 日K
+ "\"kline_timestamp_end\":0,\"query_kline_num\":10,\"adjust_type\":0}}";
String urlStr = "https://quote.alltick.co/quote-stock-b-api/kline"
+ "?token=" + URLEncoder.encode(token, "UTF-8")
+ "&query=" + URLEncoder.encode(queryJson, "UTF-8");
HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
conn.setRequestMethod("GET");
try (BufferedReader r = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
StringBuilder sb = new StringBuilder(); String l;
while ((l = r.readLine()) != null) sb.append(l);
System.out.println(sb);
}Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
import requests, json
TOKEN = "YOUR_TOKEN_HERE"
query = json.dumps({
"trace": "py_kline", "data": {
"code": "AAPL.US", "kline_type": 8,
"kline_timestamp_end": 0, "query_kline_num": 10, "adjust_type": 0
}
}, separators=(',', ':'))
resp = requests.get("https://quote.alltick.co/quote-stock-b-api/kline",
params={"token": TOKEN, "query": query})
print(resp.json())Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
q := map[string]interface{}{
"trace": "go_kline",
"data": map[string]interface{}{
"code": "AAPL.US", "kline_type": 8,
"kline_timestamp_end": 0, "query_kline_num": 10, "adjust_type": 0,
},
}
j, _ := json.Marshal(q)
full := fmt.Sprintf("https://quote.alltick.co/quote-stock-b-api/kline?token=%s&query=%s",
"YOUR_TOKEN_HERE", url.QueryEscape(string(j)))
resp, _ := http.Get(full)
defer resp.Body.Close()
b, _ := io.ReadAll(resp.Body)
fmt.Println(string(b))
}C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
#include <iostream>
#include <string>
#include <curl/curl.h>
static size_t wcb(void* c, size_t s, size_t n, std::string* o) { o->append((char*)c, s*n); return s*n; }
int main() {
CURL* curl = curl_easy_init();
std::string q = R"({"trace":"cpp_kline","data":{"code":"AAPL.US","kline_type":8,"kline_timestamp_end":0,"query_kline_num":10,"adjust_type":0}})";
char* enc = curl_easy_escape(curl, q.c_str(), q.length());
std::string url = "https://quote.alltick.co/quote-stock-b-api/kline?token=YOUR_TOKEN_HERE&query=" + std::string(enc);
curl_free(enc);
std::string resp;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wcb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp);
curl_easy_perform(curl);
std::cout << resp << std::endl;
curl_easy_cleanup(curl);
}3.2 批量K线查询 → POST /batch-kline
/kline vs /batch-kline
/kline (GET) | /batch-kline (POST) | |
|---|---|---|
| 每次产品数 | 1个 | 多个(套餐不同限制不同) |
| 每次K线数 | 最多500根 | 最多2根 |
| 参数位置 | URL ?query= | Body(JSON) |
| 用途 | 首次拉历史数据 | 持续更新最新数据 |
各套餐 /batch-kline 单次最大数据组数
| 套餐 | 最大组数 (产品数 × K线类型数) |
|---|---|
| 免费 | 5组 |
| 基础 | 100组 |
| 高级 | 200组 |
| 专业 / 全部港股 / 全部A股 / 全部美股 | 500组 |
请求示例
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
// POST Body
{
"trace": "batch123",
"data": {
"data_list": [
{ "code": "700.HK", "kline_type": 1, "kline_timestamp_end": 0, "query_kline_num": 1, "adjust_type": 0 },
{ "code": "AAPL.US", "kline_type": 1, "kline_timestamp_end": 0, "query_kline_num": 1, "adjust_type": 0 }
]
}
}Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String token = "YOUR_TOKEN_HERE";
String jsonBody = "{"
+ "\"trace\":\"java_batch\",\"data\":{\"data_list\":["
+ "{\"code\":\"700.HK\",\"kline_type\":1,\"kline_timestamp_end\":0,\"query_kline_num\":1,\"adjust_type\":0},"
+ "{\"code\":\"AAPL.US\",\"kline_type\":1,\"kline_timestamp_end\":0,\"query_kline_num\":1,\"adjust_type\":0}"
+ "]}}";
URL url = new URL("https://quote.alltick.co/quote-stock-b-api/batch-kline?token=" + token);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
try (OutputStream os = conn.getOutputStream()) {
os.write(jsonBody.getBytes()); os.flush();
}
try (BufferedReader r = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
StringBuilder sb = new StringBuilder(); String l;
while ((l = r.readLine()) != null) sb.append(l);
System.out.println(sb);
}Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
import requests, json
TOKEN = "YOUR_TOKEN_HERE"
body = {
"trace": "py_batch",
"data": {
"data_list": [
{"code": "700.HK", "kline_type": 1, "kline_timestamp_end": 0, "query_kline_num": 1, "adjust_type": 0},
{"code": "AAPL.US", "kline_type": 1, "kline_timestamp_end": 0, "query_kline_num": 1, "adjust_type": 0}
]
}
}
resp = requests.post(
f"https://quote.alltick.co/quote-stock-b-api/batch-kline?token={TOKEN}",
json=body
)
print(resp.json())Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
body := []byte(`{"trace":"go_batch","data":{"data_list":[{"code":"700.HK","kline_type":1,"kline_timestamp_end":0,"query_kline_num":1,"adjust_type":0},{"code":"AAPL.US","kline_type":1,"kline_timestamp_end":0,"query_kline_num":1,"adjust_type":0}]}}`)
resp, _ := http.Post(
"https://quote.alltick.co/quote-stock-b-api/batch-kline?token=YOUR_TOKEN_HERE",
"application/json", bytes.NewReader(body))
defer resp.Body.Close()
b, _ := io.ReadAll(resp.Body)
fmt.Println(string(b))
}C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
#include <iostream>
#include <string>
#include <curl/curl.h>
static size_t wcb(void* c, size_t s, size_t n, std::string* o) { o->append((char*)c, s*n); return s*n; }
int main() {
CURL* curl = curl_easy_init();
std::string body = R"({"trace":"cpp_batch","data":{"data_list":[{"code":"700.HK","kline_type":1,"kline_timestamp_end":0,"query_kline_num":1,"adjust_type":0},{"code":"AAPL.US","kline_type":1,"kline_timestamp_end":0,"query_kline_num":1,"adjust_type":0}]}})";
struct curl_slist* headers = curl_slist_append(nullptr, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://quote.alltick.co/quote-stock-b-api/batch-kline?token=YOUR_TOKEN_HERE");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wcb);
std::string resp;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp);
curl_easy_perform(curl);
std::cout << resp << std::endl;
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}3.3 最新成交价查询 → GET /trade-tick
请求参数(query JSON)
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"trace": "tick123",
"data": {
"symbol_list": [
{"code": "700.HK"},
{"code": "AAPL.US"}
]
}
}响应数据
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"ret": 200, "msg": "ok",
"data": {
"tick_list": [{
"code": "700.HK",
"seq": "30841439",
"tick_time": "1677831545217", // 毫秒时间戳
"price": "136.302", // ← 最新价
"volume": "0",
"turnover": "0",
"trade_direction": 0 // 0=默认, 1=BUY买入, 2=SELL卖出
}]
}
}Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String query = "{\"trace\":\"j_tick\",\"data\":{\"symbol_list\":[{\"code\":\"700.HK\"},{\"code\":\"AAPL.US\"}]}}";
String urlStr = "https://quote.alltick.co/quote-stock-b-api/trade-tick?token="
+ URLEncoder.encode(token, "UTF-8") + "&query=" + URLEncoder.encode(query, "UTF-8");
// GET 请求...Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
import requests, json
TOKEN = "YOUR_TOKEN_HERE"
query = json.dumps({
"trace": "py_tick", "data": {
"symbol_list": [{"code": "700.HK"}, {"code": "AAPL.US"}]
}
}, separators=(',', ':'))
resp = requests.get("https://quote.alltick.co/quote-stock-b-api/trade-tick",
params={"token": TOKEN, "query": query})
print(resp.json())Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
q, _ := json.Marshal(map[string]interface{}{
"trace": "go_tick", "data": map[string]interface{}{
"symbol_list": []map[string]string{{"code": "700.HK"}, {"code": "AAPL.US"}},
}})
full := fmt.Sprintf("https://quote.alltick.co/quote-stock-b-api/trade-tick?token=%s&query=%s",
"YOUR_TOKEN_HERE", url.QueryEscape(string(q)))
resp, _ := http.Get(full)
// ...C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
std::string q = R"({"trace":"cpp_tick","data":{"symbol_list":[{"code":"700.HK"},{"code":"AAPL.US"}]}})";
char* enc = curl_easy_escape(curl, q.c_str(), q.length());
std::string url = "https://quote.alltick.co/quote-stock-b-api/trade-tick?token=YOUR_TOKEN_HERE&query=" + std::string(enc);
// curl_easy_perform ...3.4 盘口深度查询 → GET /depth-tick
各市场盘口深度
| 市场 | 最大档数 | 特别说明 |
|---|---|---|
| 外汇 / 贵金属 / 原油 / CFD指数 | 1档 | 有量 |
| 加密货币 | 5档 | 有量 |
| 港股 | 10档 | 有量 |
| 美股 | 1档 | 有量 |
| 沪深A股 | 5档 | 有量 |
响应示例
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"ret": 200,
"data": {
"tick_list": [{
"code": "700.HK",
"bids": [{"price": "136.42", "volume": "100000"}],
"asks": [{"price": "136.43", "volume": "400000"}]
}]
}
}Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String query = "{\"trace\":\"j_depth\",\"data\":{\"symbol_list\":[{\"code\":\"700.HK\"}]}}";
String urlStr = "https://quote.alltick.co/quote-stock-b-api/depth-tick?token="
+ URLEncoder.encode(token, "UTF-8") + "&query=" + URLEncoder.encode(query, "UTF-8");
// GET 请求...Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
query = json.dumps({"trace": "py_depth", "data": {"symbol_list": [{"code": "700.HK"}]}}, separators=(',', ':'))
resp = requests.get("https://quote.alltick.co/quote-stock-b-api/depth-tick",
params={"token": TOKEN, "query": query})
print(resp.json())Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
q, _ := json.Marshal(map[string]interface{}{
"trace": "go_depth", "data": map[string]interface{}{
"symbol_list": []map[string]string{{"code": "700.HK"}},
}})
full := fmt.Sprintf("https://quote.alltick.co/quote-stock-b-api/depth-tick?token=%s&query=%s",
"YOUR_TOKEN_HERE", url.QueryEscape(string(q)))
// ...C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
std::string q = R"({"trace":"cpp_depth","data":{"symbol_list":[{"code":"700.HK"}]}})";
char* enc = curl_easy_escape(curl, q.c_str(), q.length());
std::string url = "https://quote.alltick.co/quote-stock-b-api/depth-tick?token=YOUR_TOKEN_HERE&query=" + std::string(enc);
// ...3.5 股票基础信息 → GET /static_info
响应关键字段
| 字段 | 含义 |
|---|---|
| name_cn / name_en / name_hk | 中/英/繁名称 |
| currency | 交易币种 |
| eps / eps_ttm | 每股盈利 / 每股盈利(TTM) |
| bps | 每股净资产 |
| dividend_yield | 股息率 |
| lot_size | 每手股数 |
| total_shares / circulating_shares | 总股本 / 流通股本 |
| exchange / board | 交易所 / 所属板块 |
Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String query = "{\"trace\":\"j_info\",\"data\":{\"symbol_list\":[{\"code\":\"700.HK\"}]}}";
String urlStr = "https://quote.alltick.co/quote-stock-b-api/static_info?token="
+ URLEncoder.encode(token, "UTF-8") + "&query=" + URLEncoder.encode(query, "UTF-8");
// GET...Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
query = json.dumps({"trace":"py_info","data":{"symbol_list":[{"code":"700.HK"}]}}, separators=(',',':'))
resp = requests.get("https://quote.alltick.co/quote-stock-b-api/static_info",
params={"token": TOKEN, "query": query})
data = resp.json()
for stock in data["data"]["static_info_list"]:
print(f"{stock['name_cn']}: EPS={stock['eps']}, 股息率={stock['dividend_yield']}")Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
q, _ := json.Marshal(map[string]interface{}{
"trace": "go_info", "data": map[string]interface{}{
"symbol_list": []map[string]string{{"code": "700.HK"}},
}})
full := fmt.Sprintf("https://quote.alltick.co/quote-stock-b-api/static_info?token=%s&query=%s",
"YOUR_TOKEN_HERE", url.QueryEscape(string(q)))
// ...C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
std::string q = R"({"trace":"cpp_info","data":{"symbol_list":[{"code":"700.HK"}]}})";
char* enc = curl_easy_escape(curl, q.c_str(), q.length());
std::string url = "https://quote.alltick.co/quote-stock-b-api/static_info?token=YOUR_TOKEN_HERE&query=" + std::string(enc);
// ...3.6 停复牌查询 → GET /api/suspension
三个端点
| 交易所 | URL | 说明 |
|---|---|---|
| 上交所 SSE | https://quote.alltick.co/api/suspension/sse | 上海证券交易所 |
| 纽交所 NYSE | https://quote.alltick.co/api/suspension/nyse | 纽约证券交易所 |
| 纳斯达克 NASDAQ | https://quote.alltick.co/api/suspension/nasdaq | 纳斯达克交易所 |
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| token | string | 是 | 你的Token |
| page | int | 否 | 页码(可选分页) |
| size | int | 否 | 每页大小(可选分页) |
响应示例(SSE)
JSONjson
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"success": true,
"timestamp": "2024-01-15T10:30:00",
"totalCount": 125,
"data": [
{
"symbol": "600000",
"symbolName": "浦发银行",
"haltReason": "重大事项停牌",
"haltDate": "2024-01-15",
"haltTime": "09:30:00",
"haltPeriod": "全天停牌",
"resumeDate": "2024-01-16",
"resumeTime": "09:30:00",
"publishDate": "2024-01-14 18:00:00"
}
]
}Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String urlStr = "https://quote.alltick.co/api/suspension/sse?token="
+ URLEncoder.encode(token, "UTF-8") + "&page=1&size=10";
// GET...Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
resp = requests.get("https://quote.alltick.co/api/suspension/sse",
params={"token": TOKEN, "page": 1, "size": 10})
print(resp.json())Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
resp, _ := http.Get("https://quote.alltick.co/api/suspension/sse?token=YOUR_TOKEN_HERE&page=1&size=10")
// ...C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
curl_easy_setopt(curl, CURLOPT_URL, "https://quote.alltick.co/api/suspension/sse?token=YOUR_TOKEN_HERE&page=1&size=10");
// ...04
WebSocket API 详解
WebSocket 连接地址
| 数据类型 | 地址 |
|---|---|
| 股票 / 大盘 | wss://quote.alltick.co/quote-stock-b-ws-api?token=YOUR_TOKEN_HERE |
| 外汇 / 加密 / 商品 / CFD指数 | wss://quote.alltick.co/quote-b-ws-api?token=YOUR_TOKEN_HERE |
四个协议号一览
| 你发送(cmd_id) | 服务器应答(cmd_id) | 服务器推送(cmd_id) | 用途 |
|---|---|---|---|
| 22000 | 22001 | — | 心跳 |
| 22002 | 22003 | 22999 | 订阅盘口 |
| 22004 | 22005 | 22998 | 订阅成交价 |
| 22006 | 22007 | — | 取消订阅 |
通用消息格式
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
// 所有请求
{
"cmd_id": 22002, // 协议号
"seq_id": 123, // 序列号(自己定义)
"trace": "uuid-xxxx", // 追踪ID(最长64字符)
"data": { /* ... */ }
}
// 所有响应/推送
{
"ret": 200,
"msg": "ok",
"cmd_id": 22003,
"seq_id": 123,
"trace": "uuid-xxxx",
"data": { /* ... */ }
}核心注意事项
- 订阅覆盖规则:每发一次订阅请求会覆盖上一次。要追加 code 必须重发全部。
- 10秒心跳:订阅成功后每 10 秒发心跳,30 秒无心跳则断开。
- 请求间隔:同一 WebSocket 中两次请求至少间隔 1 秒;多个 WebSocket 之间至少间隔 3 秒。
- 自动重连:强烈建议实现断线自动重连 + 重连后自动重订阅。
- K线不支持推送:WebSocket 不能订阅 K 线,K 线只能通过 HTTP 获取。
4.1 心跳 → cmd_id 22000/22001
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
// 发送(22000)
{"cmd_id":22000, "seq_id":123, "trace":"hb", "data":{}}
// 响应(22001)
{"ret":200, "msg":"ok", "cmd_id":22001, "seq_id":123, "trace":"hb", "data":{}}Java (javax.websocket / Tyrus)
JAVAjava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
if (session != null && session.isOpen()) {
session.getBasicRemote().sendText(
"{\"cmd_id\":22000,\"seq_id\":123,\"trace\":\"hb\",\"data\":{}}");
}
}
}, 0, 10_000);Python (websocket-client)
PYTHONpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
import websocket, json, time, threading
ws = websocket.WebSocketApp("wss://quote.alltick.co/quote-stock-b-ws-api?token=YOUR_TOKEN_HERE")
def on_open(ws):
def heartbeat():
while ws.sock and ws.sock.connected:
time.sleep(10)
ws.send(json.dumps({"cmd_id":22000,"seq_id":123,"trace":"hb","data":{}}))
threading.Thread(target=heartbeat, daemon=True).start()
ws.on_open = on_open
ws.run_forever()Go (gorilla/websocket)
GOgo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
import (
"github.com/gorilla/websocket"
"time"
)
conn, _, _ := websocket.DefaultDialer.Dial("wss://quote.alltick.co/quote-stock-b-ws-api?token=YOUR_TOKEN_HERE", nil)
defer conn.Close()
go func() {
ticker := time.NewTicker(10 * time.Second)
for range ticker.C {
msg := `{"cmd_id":22000,"seq_id":123,"trace":"hb","data":{}}`
conn.WriteMessage(websocket.TextMessage, []byte(msg))
}
}()C++ (IXWebSocket)
CPPcpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
#include <ixwebsocket/IXWebSocket.h>
#include <thread>
ix::WebSocket ws;
ws.setUrl("wss://quote.alltick.co/quote-stock-b-ws-api?token=YOUR_TOKEN_HERE");
ws.setOnMessageCallback([](const ix::WebSocketMessagePtr& msg) {
if (msg->type == ix::WebSocketMessageType::Message)
std::cout << "收到: " << msg->str << std::endl;
});
ws.start();
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(10));
ws.send(R"({"cmd_id":22000,"seq_id":123,"trace":"hb","data":{}})");
}4.2 成交价订阅 → cmd_id 22004/22005 → 推送 22998
订阅消息
JSONjson
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"cmd_id": 22004,
"seq_id": 123,
"trace": "sub_trade",
"data": {
"symbol_list": [
{"code": "700.HK"},
{"code": "AAPL.US"}
]
}
}推送消息 (cmd_id: 22998)
JSONjson
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"cmd_id": 22998,
"data": {
"code": "700.HK",
"seq": 1605509068000001,
"tick_time": 1605509068,
"price": "651.12",
"volume": "300",
"turnover": "12345.6",
"trade_direction": 1
}
}Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String subMsg = "{"
+ "\"cmd_id\":22004,\"seq_id\":123,\"trace\":\"trade_sub\","
+ "\"data\":{\"symbol_list\":[{\"code\":\"700.HK\"},{\"code\":\"AAPL.US\"}]}}";
session.getBasicRemote().sendText(subMsg);Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
def on_open(ws):
sub = {
"cmd_id": 22004, "seq_id": 123, "trace": "trade_sub",
"data": {"symbol_list": [{"code": "700.HK"}, {"code": "AAPL.US"}]}
}
ws.send(json.dumps(sub))Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
sub := `{"cmd_id":22004,"seq_id":123,"trace":"trade_sub","data":{"symbol_list":[{"code":"700.HK"},{"code":"AAPL.US"}]}}`
conn.WriteMessage(websocket.TextMessage, []byte(sub))C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
ws.send(R"({"cmd_id":22004,"seq_id":123,"trace":"trade_sub","data":{"symbol_list":[{"code":"700.HK"},{"code":"AAPL.US"}]}})");4.3 盘口订阅 → cmd_id 22002/22003 → 推送 22999
订阅消息(多了 depth_level 字段)
JSONjson
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"cmd_id": 22002,
"seq_id": 123,
"trace": "sub_depth",
"data": {
"symbol_list": [
{"code": "700.HK", "depth_level": 5},
{"code": "AAPL.US", "depth_level": 1}
]
}
}推送消息 (cmd_id: 22999)
JSONjson
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
{
"cmd_id": 22999,
"data": {
"code": "700.HK",
"seq": 1605509068000001,
"tick_time": 1605509068,
"bids": [{"price": "9.12", "volume": "1000"}],
"asks": [{"price": "9.13", "volume": "500"}]
}
}Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
String subMsg = "{"
+ "\"cmd_id\":22002,\"seq_id\":123,\"trace\":\"depth_sub\","
+ "\"data\":{\"symbol_list\":["
+ "{\"code\":\"700.HK\",\"depth_level\":5},"
+ "{\"code\":\"AAPL.US\",\"depth_level\":1}"
+ "]}}";
session.getBasicRemote().sendText(subMsg);Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
def on_open(ws):
sub = {
"cmd_id": 22002, "seq_id": 123, "trace": "depth_sub",
"data": {"symbol_list": [
{"code": "700.HK", "depth_level": 5},
{"code": "AAPL.US", "depth_level": 1}
]}
}
ws.send(json.dumps(sub))Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
sub := `{"cmd_id":22002,"seq_id":123,"trace":"depth_sub","data":{"symbol_list":[{"code":"700.HK","depth_level":5},{"code":"AAPL.US","depth_level":1}]}}`
conn.WriteMessage(websocket.TextMessage, []byte(sub))C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
ws.send(R"({"cmd_id":22002,"seq_id":123,"trace":"depth_sub","data":{"symbol_list":[{"code":"700.HK","depth_level":5},{"code":"AAPL.US","depth_level":1}]}})");4.4 取消订阅 → cmd_id 22006/22007
协议text
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
// 发送(22006)
{
"cmd_id": 22006, "seq_id": 123, "trace": "cancel",
"data": { "cancel_type": 0 } // 0=全部取消, 1=只取消盘口, 2=只取消成交价
}Javajava
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
session.getBasicRemote().sendText(
"{\"cmd_id\":22006,\"seq_id\":123,\"trace\":\"cancel\",\"data\":{\"cancel_type\":0}}");Pythonpython
# AllTick — Real-time Financial Market Data API
# Real-time Forex, Stocks, Crypto, Commodities and Indices market data
ws.send(json.dumps({"cmd_id":22006,"seq_id":123,"trace":"cancel","data":{"cancel_type":0}}))Gogo
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
conn.WriteMessage(websocket.TextMessage, []byte(`{"cmd_id":22006,"seq_id":123,"trace":"cancel","data":{"cancel_type":0}}`))C++cpp
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
ws.send(R"({"cmd_id":22006,"seq_id":123,"trace":"cancel","data":{"cancel_type":0}})");05
错误码速查
| 错误码 | 错误信息 | 含义 & 排查建议 |
|---|---|---|
| 200 | ok | 成功 |
| 400 | request header param invalid | JSON第一层参数错误 → 检查 trace、data 字段是否存在且结构完整 |
| 400 | request data param invalid | data 字段内容错误 → 对照接口文档检查参数 |
| 401 | token invalid | Token无效 → 检查格式是否正确、是否已过期 |
| 402 | query invalid | GET参数错误 → 检查 URL 编码、特殊字符转义 |
| 429 | rate limit | 请求超频 → 降低频率或升级套餐 |
| 600 | code invalid | 产品代码无效 → 检查 URL 路径是否正确(股票路径 ≠ 外汇路径)、code 大小写是否与列表一致 |
| 601 | body empty | POST请求 body 为空 → 检查 /batch-kline 等接口是否遗漏 body |
| 603 | token level not enough | 超套餐限额 → 减少产品数/K线数,或升级套餐 |
| 604 | code unauthorized | Token 无权访问该 code → 联系客服 |
| 605 | too many requests | HTTP接口频率超限 → 优化频率或升级 |
| 606 | too many requests…connection will be closed | WebSocket频率超限 → 将被断开,检查连接数和请求间隔 |
06
频率 & 限制速查
各套餐 HTTP 接口频率总览
| 接口 | 免费 | 基础 | 高级 | 专业 / 全部港股 / 全部A股 / 全部美股 |
|---|---|---|---|---|
| /kline | 10秒1次 | 1秒1次 | 1秒10次 | 1秒20次 |
| /batch-kline | 10秒1次 | 3秒1次 | 2秒1次 | 1秒1次 |
| /depth-tick | 10秒1次 | 1秒1次 | 1秒10次 | 1秒20次 |
| /trade-tick | 10秒1次 | 1秒1次 | 1秒10次 | 1秒20次 |
| /static_info | 10秒1次 | 1秒1次 | 1秒10次 | 1秒20次 |
| 所有接口合计(每分钟) | 10次 | 60次 | 600次 | 1200次 |
| 每日总请求上限 | 1,000 | 86,400 | 864,000 | 1,728,000 |
各套餐 HTTP 每次最大 code 数
| 接口 | 免费 | 基础+ | 备注 |
|---|---|---|---|
| /trade-tick | 5个 | 建议≤50个 | GET URL 长度限制 |
| /depth-tick | 5个 | 建议≤50个 | 推荐用 WebSocket |
| /static_info | 5个 | 建议≤50个 | — |
| /batch-kline | 5组 | 100~500组 | 1组 = 1产品 + 1K线类型 |
WebSocket 限制
| 限制项 | 免费 | 基础 | 高级 | 专业/全部港股/全部A股/全部美股 |
|---|---|---|---|---|
| 连接数 | 1个 | 1个 | 3个 | 10个 |
| 成交订阅 code 数 | 5个 | 100个 | 200个 | 3000个 |
| 盘口订阅 code 数 | 5个 | 100个 | 200个 | 3000个 |
| 心跳间隔 | 10秒 | 10秒 | 10秒 | 10秒 |
| 请求间隔 | ≥1秒 | ≥1秒 | ≥1秒 | ≥1秒 |
| 多连接间隔 | ≥3秒 | ≥3秒 | ≥3秒 | ≥3秒 |
07
客户 FAQ(高频问题)
通用接入类
Q1: 免费套餐够用吗?
Q2: 怎么知道某产品是否支持?
Q3: 报错 600 “code invalid” 怎么排查?
Q4: Token 怎么获取?
K线相关
Q5: WebSocket 能推送 K 线吗?
Q6: 怎么高效拉取 + 更新 K 线?
Q7: 股票为什么不支持 2 小时和 4 小时 K 线?
价格 & 涨跌幅
Q8: 怎么计算涨跌幅?
- 日涨跌幅:
(当天日K close_price - 前一天日K close_price) / 前一天日K close_price × 100% - 24小时涨跌幅:WebSocket 订阅成交价,存下 24 小时前的价格,用公式
(最新价 - 24小时前价格) / 24小时前价格 × 100%
Q9: close_price 在交易中是什么?
- 交易时段内,最新一根 K 线的
close_price= 最新成交价 - 休市期间,最新一根 K 线的
close_price= 当日收盘价
盘口 & 涨跌停
Q10: 怎么判断涨停和跌停?
- 涨停:bids 有数据,asks 的价格和量全为 0
- 跌停:asks 有数据,bids 的价格和量全为 0
Q11: 怎么判断股票退市?
Q12: 为什么有些产品盘口档数比文档说的少?
WebSocket 相关
Q13: 想新增订阅 code,怎么做?
Q14: 连接总被断开怎么办?
Q15: 股票和外汇/加密能共用一个 WebSocket 连接吗?
交易时间 & 假期
Q16: 怎么知道交易时间和休市?
Q17: CFD 指数和大盘指数有什么区别?
停复牌 & 新股
Q18: 怎么查哪些股票停牌了?
Q19: 怎么知道有新股上市?
技术细节
Q20: trace 字段是干什么的?
Q21: GET 请求的 query 参数要 URL 编码吗?
Q22: 多个接口能同时请求吗?
联系与支持
| 渠道 | 地址 |
|---|---|
| 官网 | https://alltick.co |
| 备用官网 | https://alltick.io |
| support@alltick.co | |
| Telegram中文频道 | https://t.me/alltick_cn |
| Telegram英文频道 | https://t.me/alltick_en |
| GitHub | github.com/AllTick-Official |