CFD即所谓的差价合约,是投资者在不拥有实际资产的情况下,交易金融市场的一种方式。最近笔者研究这一块比较多,但查遍整个中文互联网却很少找到关于CFD实时行情的查询教程。因此有了这篇文章。以下我将通过一个简单的Python代码示例,逐步教你如何查询CFD指数的实时行情。
行情接口信息
首先,确保你有一个有效的API接口,我们这里用Infoway API作为演示,该接口能够返回所需的CFD指数实时数据。请求地址如下:
https://data.infoway.io/common/batch_trade/HK50%2CCN50%2CEUSTX50%2CJPN225%2CUS30%2CUS500
这个接口支持批量查询,所以我们一次性查多个市场的。这个URL包含了多个CFD指数的数据:HK50
, CN50
, EUSTX50
, JPN225
, US30
, 和 US500
。这些指数代表了不同的市场,涵盖了香港、中国、欧洲、日本和美国等多个区域。
请求示例
现在,我们已经准备好发送HTTP请求来获取实时行情数据。以下是完整的Python代码示例:
import requests
url = "//data.infoway.io/common/batch_trade/HK50%2CCN50%2CEUSTX50%2CJPN225%2CUS30%2CUS500"
# 申请API KEY: www.infoway.io
headers = {
"accept": "application/json", # 告诉服务器返回的数据格式为JSON
"apiKey": "YOUR_API_KEY" # 你的API Key
}
# 发送GET请求
response = requests.get(url, headers=headers)
# 打印响应内容
print(response.text)
解析API响应
当你发送请求后,API会返回一个包含行情数据的响应。以下是一个示例响应:
{
"ret": 200,
"msg": "success",
"traceId": "9708dde2-67af-4be6-ad08-c2bc51a44aa3",
"data": [
{
"s": "EUSTX50",
"t": 1752762978999,
"p": "5362.84",
"v": "1.0",
"vw": "5362.840",
"td": 0
},
{
"s": "US500",
"t": 1752762980117,
"p": "6277.8",
"v": "1.0",
"vw": "6277.80",
"td": 0
},
{
"s": "CN50",
"t": 1752762978999,
"p": "13730.68",
"v": "1.0",
"vw": "13730.680",
"td": 0
},
{
"s": "US30",
"t": 1752762978661,
"p": "44303.5",
"v": "2.0",
"vw": "88607.00",
"td": 0
},
{
"s": "HK50",
"t": 1752762980117,
"p": "24530.0",
"v": "1.0",
"vw": "24530.00",
"td": 0
},
{
"s": "JPN225",
"t": 1752762976348,
"p": "39894.0",
"v": "1.0",
"vw": "39894.00",
"td": 0
}
]
}
从响应中,我们可以提取出不同CFD指数的实时数据。每个指数都包含以下信息:
s
: 指数代码(如EUSTX50
表示欧洲指数)t
: 时间戳p
: 当前价格v
: 成交量vw
: 加权平均价格td
: 代表交易方向,0为默认值,1为Buy,2为SELL
打印和处理数据
如果你希望进一步处理或格式化数据,可以使用以下代码来提取和打印每个CFD指数的价格信息:
# 获取返回的JSON数据
data = response.json()['data']
# 遍历并打印每个CFD指数的代码和当前价格
for index in data:
print(f"指数: {index['s']}, 当前价格: {index['p']}")
运行此代码,你将会看到类似如下的输出:
指数: EUSTX50, 当前价格: 5362.84
指数: US500, 当前价格: 6277.8
指数: CN50, 当前价格: 13730.68
指数: US30, 当前价格: 44303.5
指数: HK50, 当前价格: 24530.0
指数: JPN225, 当前价格: 39894.0
WebSocket订阅CFD指数
如果你的交易策略对数据的延迟有更高的要求,可以改用WebSocket订阅的方式来获取数据。我们只需要与服务器建立好连接,就能源源不断地从服务器获取数据推送,代码如下:
import asyncio
import json
import websockets
#WebSocket订阅连接
WS_URL = "wss://data.infoway.io/ws?business=common&apikey=YOUR_API_KEY"
#申请API KEY: www.infoway.io
async def connect_and_receive():
async with websockets.connect(WS_URL) as websocket:
# 发送初始消息,订阅多个CFD指数
init_message = {
"code": 10000,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
"data": {"codes": ["HK50", "CN50", "EUSTX50", "JPN225", "US30", "US500"]}
}
await websocket.send(json.dumps(init_message))
# 设置ping任务
async def send_ping():
while True:
await asyncio.sleep(30)
ping_message = {
"code": 10010,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a"
}
await websocket.send(json.dumps(ping_message))
# 启动ping任务协程
ping_task = asyncio.create_task(send_ping())
try:
# 持续接收消息
while True:
message = await websocket.recv()
print(f"Message received: {message}")
except websockets.exceptions.ConnectionClosedOK:
print("Connection closed normally")
finally:
# 取消ping任务
ping_task.cancel()
# 运行主函数
asyncio.run(connect_and_receive())