Forex API
为 50+ 个主要、次要及异国货币对提供 Tick 级报价。
通过一个 WebSocket 和 REST API 传输 Tick 级 Forex、Crypto、Stock、Commodity 和 Index 数据。几秒钟即可获取免费密钥——无需销售沟通。
| 代码 | 资产类别 | 价格 | 实时变动 |
|---|---|---|---|
| EUR/USD 外汇欧元 / 美元 | 外汇 | - | - |
| BTC/USDT 加密货币比特币 | 加密货币 | - | - |
| ETH/USDT 加密货币以太坊 | 加密货币 | - | - |
| AAPL 股票苹果公司 | 股票 | - | - |
| XAU/USD 大宗商品现货黄金 | 大宗商品 | - | - |
| USD/JPY 外汇美元 / 日元 | 外汇 | - | - |
| NVDA 股票英伟达公司 | 股票 | - | - |
| SPX 指数标普 500 指数 | 指数 | - | - |
AllTick 覆盖的每个市场都可通过同一个统一的 REST 和 WebSocket 接口访问。
为 50+ 个主要、次要及异国货币对提供 Tick 级报价。
实时现货和衍生品数据,标准化为一个数据流。
覆盖美股、港股和 A 股市场的股票,提供成交和报价。
贵金属和能源的实时定价。
主要全球指数的基准指数值和成分股。
比较 AllTick 各个市场的覆盖范围、延迟和数据类型。
浏览产品AllTick 与典型传统行情数据供应商的对比。
| 能力 | AllTick | 典型传统供应商 |
|---|---|---|
| WebSocket 中位延迟 | 约 150ms | 400–800ms |
| 一个 API 中的资产类别 | 5(FX、Crypto、Stock、Commodities、Indices) | 1–2 |
| 可用性 SLA | 99.95% | 99.5% 或无 |
| 免费等级 | 有——即时 API 密钥 | 需要销售沟通 |
| WebSocket 流 | 原生支持 | 轮询 / 有限支持 |
通过 WebSocket 连接并订阅任何市场中的任意交易品种。
# AllTick realtime financial data API
# forex crypto stock commodities indices
import asyncio, json, uuid
import websockets
subscribe = {
"cmd_id": 22004,
"seq_id": 1,
"trace": str(uuid.uuid4()),
"data": {"symbol_list": [{"code": "EURUSD"}]},
}
heartbeat = {"cmd_id": 22000, "seq_id": 1, "trace": "heartbeat", "data": {}}
async def stream():
uri = "wss://quote.alltick.co/quote-b-ws-api?token=YOUR_API_KEY"
async with websockets.connect(uri) as socket:
await socket.send(json.dumps(subscribe))
async def keep_alive():
while True:
await asyncio.sleep(10)
await socket.send(json.dumps(heartbeat))
asyncio.create_task(keep_alive())
async for message in socket:
print(json.loads(message))
asyncio.run(stream())分享市场数据工程、流式 API 与低延迟金融应用开发的实用内容。
K线图是股票市场和金融交易中常用的图表类型,用于展示一段时间内的开盘价、最高价、最低价和收盘价等信息。本文将介绍如何将实时Tick数据转换为不同周期的K线数据,并提供必要的公式和计算方法,帮助您更好地分析和理解市场走势。
K线图由一系列连续的矩形框组成,每个矩形框代表一段时间内的价格走势。每个矩形框通常包含四个关键价格点:开盘价(Open)、最高价(High)、最低价(Low)和收盘价(Close)。K线图的形态和组合可以帮助分析师和交易者识别市场趋势和价格模式。
实时Tick数据是指市场中每次交易的价格和成交量信息。它提供了关于市场流动性和价格变动的即时反馈。实时Tick数据通常包含时间戳、成交价、成交量等字段。
下面是一个示例,展示如何将实时Tick数据转换为1分钟K线数据的计算公式:
1. 初始化K线数据:
2. 更新K线数据:
以上是一个简单示例,实际应用中可能需要考虑更多的细节和数据处理方法,以满足特定的需求。
import java.util.ArrayList;
import java.util.List;
public class KLineGenerator {
public static List<KLineData> generateKLineData(List<TickData> tickDataList, int interval) {
List<KLineData> kLineDataList = new ArrayList<>();
long startTime = tickDataList.get(0).getTime(); // 获取第一个Tick的时间作为起始时间
// 初始化K线数据
long currentKLineStartTime = startTime - (startTime % interval);
double openPrice = tickDataList.get(0).getPrice();
double highPrice = openPrice;
double lowPrice = openPrice;
double closePrice = 0;
long volume = 0;
// 遍历Tick数据
for (TickData tickData : tickDataList) {
long currentTime = tickData.getTime();
double currentPrice = tickData.getPrice();
long currentVolume = tickData.getVolume();
// 如果超过当前K线的时间周期,生成新的K线数据
if (currentTime >= currentKLineStartTime + interval) {
closePrice = tickDataList.get(tickDataList.indexOf(tickData) - 1).getPrice(); // 上一个Tick的价格作为收盘价
KLineData kLineData = new KLineData(currentKLineStartTime, openPrice, highPrice, lowPrice, closePrice, volume);
kLineDataList.add(kLineData);
// 重置K线数据为新的时间周期
currentKLineStartTime += interval;
openPrice = currentPrice;
highPrice = currentPrice;
lowPrice = currentPrice;
volume = currentVolume;
} else {
// 更新K线数据
highPrice = Math.max(highPrice, currentPrice);
lowPrice = Math.min(lowPrice, currentPrice);
volume += currentVolume;
}
}
// 最后一个Tick作为K线数据的收盘价
closePrice = tickDataList.get(tickDataList.size() - 1).getPrice();
// 生成最后一个K线数据
KLineData lastKLineData = new KLineData(currentKLineStartTime, openPrice, highPrice, lowPrice, closePrice, volume);
kLineDataList.add(lastKLineData);
return kLineDataList;
}
}
// Tick数据类
class TickData {
private long time;
private double price;
private long volume;
public TickData(long time, double price, long volume) {
this.time = time;
this.price = price;
this.volume = volume;
}
public long getTime() {
return time;
}
public double getPrice() {
return price;
}
public long getVolume() {
return volume;
}
}
// K线数据类
class KLineData {
private long time;
private double open;
private double high;
private double low;
private double close;
private long volume;
public KLineData(long time, double open, double high, double low, double close, long volume) {
this.time = time;
this.open = open;
this.high = high;
this.low = low;
this.close = close;
this.volume = volume;
}
// 省略了getter和setter方法
}
from datetime import datetime, timedelta
class TickData:
def __init__(self, time, price, volume):
self.time = time
self.price = price
self.volume = volume
class KLineData:
def __init__(self, time, open_price, high_price, low_price, close_price, volume):
self.time = time
self.open_price = open_price
self.high_price = high_price
self.low_price = low_price
self.close_price = close_price
self.volume = volume
def generate_kline_data(tick_data_list, interval):
kline_data_list = []
start_time = tick_data_list[0].time
current_kline_start_time = start_time - (start_time % interval)
open_price = tick_data_list[0].price
high_price = open_price
low_price = open_price
close_price = 0
volume = 0
for tick_data in tick_data_list:
current_time = tick_data.time
current_price = tick_data.price
current_volume = tick_data.volume
if current_time >= current_kline_start_time + interval:
close_price = tick_data_list[tick_data_list.index(tick_data) - 1].price
kline_data = KLineData(current_kline_start_time, open_price, high_price, low_price, close_price, volume)
kline_data_list.append(kline_data)
current_kline_start_time += interval
open_price = current_price
high_price = current_price
low_price = current_price
volume = current_volume
else:
high_price = max(high_price, current_price)
low_price = min(low_price, current_price)
volume += current_volume
close_price = tick_data_list[-1].price
last_kline_data = KLineData(current_kline_start_time, open_price, high_price, low_price, close_price, volume)
kline_data_list.append(last_kline_data)
return kline_data_list