01
はじめに(初心者必読)
1.1 これは何ですか?
AllTick は、リアルタイムの金融市場データ サービスです。次のデータを取得するには、API を呼び出すだけです。
| データ型 | わかりやすい説明 | 対応品種 |
|---|---|---|
| 最新約定価格 (Tick) | この取引の現在の約定価格 | 全品種 |
| 板情報の深度 (Order Book) | 買い1〜買いN、売り1〜売りNの注文 | 一部商品(一部のCFD指数および市場指数は非対応) |
| Kライン(K-Line) | 1分/日/週/月などの期間のOHLCV | 全品種 |
| バッチ K ライン (Batch-klien) | 複数商品の最新2Kラインを一度に確認 | 全品種 |
| 株式基本情報 | 一株利益、配当金、時価総額など | 株式のみ |
| 取引停止・再開情報 | 取引が停止されている銘柄はどれですか?いつ取引を再開しますか? | SSE/NYSE/NASDAQ |
1.2 3ステップの導入手順
ステップ 1: 登録して Token を取得する (5 分)
ステップ2:商品コードを理解する(2分)
ステップ 3: 最初の Hello World リクエストを実行します (3 分)
ステップ 1: Token を取得する
- メールアドレスとパスワードを入力 → 「登録」をクリックします(大文字、特殊文字、数字に注意してください)
- 登録が成功すると自動的に Dashboard にジャンプします → 「API キー」で Token を見つけます
- 料金不要の無料枠でテストを開始
ステップ2:商品コードを理解する
各取引品種には固有の 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分足
+ "\"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分足
"kline_timestamp_end": 0, # 0 = 最新から開始
"query_kline_num": 2, # K ラインを2本取得
"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 API 共通)
プロトコルtext
// AllTick — Real-time Financial Market Data API
// Real-time Forex, Stocks, Crypto, Commodities and Indices market data
// GET リクエスト:この JSON を URL エンコードして ?query= パラメータ
{
"trace": "リクエストごとの一意な ID(UUID などを生成、最大64文字)",
"data": { /* 具体的なパラメータは各 API を参照 */ }
}レスポンス形式(すべての API 共通)
プロトコル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 と WebSocket の使い分け
| シーン | 何を使うか | 理由 |
|---|---|---|
| K ラインを定期取得する、または価格を随時照会する | HTTP REST | シンプルですぐに使える |
| 価格と板情報の変更をリアルタイムでプッシュする必要がある | WebSocket | プッシュモード、低遅延 |
| 履歴データの初期取得 | HTTP /kline | 1リクエスト最大500本 |
| 最新のデータで継続的に更新されます | 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形式 | 例 |
|---|---|---|
| A株(深セン証券取引所) | 番号.SZ | 000627.SZ (天茂グループ) |
| A株(上海証券取引所) | 番号.SH | 600416.SH (翔電電気株式会社) |
| 香港株 | 番号.HK | 700.HK (テンセントホールディングス) |
| 米国株 | 手紙.米国 | 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"
}
]
}
}例:Apple(AAPL.US)の直近10本の日足を照会
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 = 日足
+ "\"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回あたりの商品数 | 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
リクエストパラメータ (クエリ 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 | 1株当たり利益 / 1株当たり利益(TTM) |
| bps | 一株当たり純資産 |
| dividend_yield | 配当利回り |
| lot_size | 1ロットあたりの株数 |
| 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
3つのエンドポイント
| 交換 | URL | 説明する |
|---|---|---|
| 上海証券取引所 SSE | https://quote.alltick.co/api/suspension/sse | 上海証券取引所 |
| ニューヨーク証券取引所 | https://quote.alltick.co/api/suspension/nyse | ニューヨーク証券取引所 |
| ナスダック ナスダック | 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 |
4つのプロトコル ID
| (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, // プロトコル ID
"seq_id": 123, // シーケンス ID(クライアント側で定義)
"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 内の 2 つのリクエスト間の間隔は少なくとも 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 第 1 層パラメータ エラー → トレース フィールドとデータ フィールドが存在し、完全な構造になっているかどうかを確認してください。 |
| 400 | request data param invalid | データフィールドの内容が間違っている → パラメータをインターフェースのドキュメントと照合して確認してください |
| 401 | token invalid | Token が無効 → 形式が正しいかどうか、有効期限が切れていないか確認してください |
| 402 | query invalid | GET パラメータ エラー → URL エンコードと特殊文字エスケープを確認してください |
| 429 | rate limit | オーバークロックをリクエスト → 頻度を下げるか、プランをアップグレードしてください |
| 600 | code invalid | 商品コードが無効です → URLパスが正しいか(株式パス≠外国為替パス)、codeの大文字と小文字がリストと一致しているか確認してください。 |
| 601 | body empty | POST リクエストボディが空 → /batch-kline などのインターフェースからボディが欠落していないか確認 |
| 603 | token level not enough | プラン制限を超えている → 商品数を/Kに減らすか、行数を減らすか、プランをアップグレードしてください |
| 604 | code unauthorized | Token にはこの code にアクセスする権限がありません → サポートに連絡してください |
| 605 | too many requests | HTTP APIの頻度が制限を超えている → 頻度を最適化するかアップグレードしてください |
| 606 | too many requests…connection will be closed | WebSocket 頻度が制限を超えている → 切断されるため、接続数とリクエスト間隔を確認してください |
06
レートと制限の早見表
プラン別 HTTP API 頻度一覧
| インタフェース | 無料 | ベース | 高度な | プロフェッショナル / すべての香港株 / すべての 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回 |
| すべてのインターフェースの合計 (1 分あたり) | 10回 | 60回 | 600回 | 1200回 |
| 1 日あたりの合計リクエストの上限 | 1,000 | 86,400 | 864,000 | 1,728,000 |
プラン別 HTTP リクエストの最大コード数
| インタフェース | 無料 | ベーシック+ | 述べる |
|---|---|---|---|
| /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 |
| 約定価格の購読コード数 | 5 | 100 | 200 | 3000 |
| 板情報の購読コード数 | 5 | 100 | 200 | 3000 |
| ハートビート間隔 | 10秒 | 10秒 | 10秒 | 10秒 |
| リクエスト間隔 | 1秒以上 | 1秒以上 | 1秒以上 | 1秒以上 |
| 複数の接続間隔 | 3秒以上 | 3秒以上 | 3秒以上 | 3秒以上 |
07
よくある質問
一般的な導入
Q1: 無料プランで十分ですか?
Q2: 商品がサポートされているかどうかはどのように確認しますか?
Q3: エラー 600「code が無効です」のトラブルシューティング方法を教えてください。
Q4: Token を入手するにはどうすればよいですか?
K ライン関連
Q5: WebSocket は K ラインをプッシュできますか?
Q6: K ラインを効率的に取得・更新するにはどうすればよいですか?
Q7: 株式が 2 時間足と 4 時間足の K ラインをサポートしていないのはなぜですか?
価格と騰落率
Q8:騰落率はどのように計算しますか?
- 日次騰落率:
(当日の日足 close_price - 前日の日足 close_price) / 前日の日足 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:購読コードを追加するにはどうすればよいですか?
Q14:接続が繰り返し切断される場合はどうすればよいですか?
Q15:株式と外国為替・暗号資産は同じ WebSocket 接続を共有できますか?
取引時間と休日
Q16:取引時間と休場日はどこで確認できますか?
- 中国語チャンネル: https://t.me/alltick_cn
- 英語チャンネル: https://t.me/alltick_en
Q17: CFD 指数と市場指数の違いは何ですか?
取引停止と新規上場
Q18:取引停止中の銘柄はどのように確認しますか?
Q19: 新しい株式が上場されたかどうかはどのように確認しますか?
技術詳細
Q20: trace フィールドは何に使用しますか?
Q21:GET リクエストの query パラメータは URL エンコードが必要ですか?
Q22:複数の API を同時にリクエストできますか?
お問い合わせとサポート
| チャネル | 住所 |
|---|---|
| 公式サイト | 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 |