扩展API接口详解
-
优宽量化交易平台扩展API接口
在https://www.youquant.com/api/v1?中,?符号后面跟随请求参数。使用Python语言描述请求参数:python{ 'version' : '1.0', 'access_key': 'xxx', # AccessKey,在账户管理页面申请 'method' : 'GetNodeList', # 具体调用的方法 'args' : [], # 具体调用的method方法的参数列表 'nonce' : 1516292399361, # 时间戳,单位为毫秒,允许与标准时间戳前后误差1小时,nonce必须大于上一次访问时的nonce值 'sign' : '085b63456c93hfb243a757366600f9c2' # 签名 }各参数以字符
&分隔,参数名和参数值用符号=连接,完整的请求URL(以method=GetNodeList为例):texthttps://www.youquant.com/api/v1? access_key=xxx& nonce=1516292399361& args=%5B%5D& sign=085b63456c93hfb243a757366600f9c2& version=1.0& method=GetNodeList注意:请求参数中不包含
secret_key参数。 -
签名方式
请求参数中sign参数的加密方式如下,按照以下格式:textversion + "|" + method + "|" + args + "|" + nonce + "|" + secretKey拼接字符串后,使用
MD5加密算法对字符串进行加密,并转换为十六进制字符串,该值作为参数sign的值。签名部分参考Python代码,扩展API接口「验证方式」:python# 参数 d = { 'version': '1.0', 'access_key': accessKey, 'method': method, 'args': json.dumps(list(args)), 'nonce': int(time.time() * 1000), } # 计算sign签名 d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest() -
接口业务错误:
- 参数不足:json{ "code":0, "data":{ "result":null, "error":"Params length incorrect" } }
- 参数不足:
GetNodeList
GetNodeList方法用于获取请求中API KEY对应的优宽量化交易平台账号下的托管者列表。
返回值
json
{
"code": 0,
"data": {
"result": {
"all": 1,
"nodes": [{
"build": "3.7",
"city": "...",
"created": "2024-10-10 22:58:30",
"date": "2024-11-25 13:30:50",
"forward": "...",
"guid": "...",
"host": "node.youquant.com:9902",
"id": 123,
"ip": "...",
"is_owner": true,
"loaded": 1,
"name": "linux",
"online": true,
"os": "linux/amd64",
"peer": "...",
"public": 0,
"region": "...",
"tunnel": false,
"version": "...",
"wd": 0
}]
},
"error": null
}
}
返回值字段说明(含义明显的字段不再赘述):
- all: 当前账户关联的托管者总数。
- nodes: 托管者节点的详细信息列表。
- build: 版本号。
- city: 所在城市。
- is_owner: true表示私有托管者,false表示公共托管者。
- loaded: 负载数量,即当前运行的策略实例数。
- public: 0表示私有托管者,1表示公共托管者。
- region: 地理位置。
- version: 托管者的详细版本信息。
- wd: 离线报警开关,0表示未开启。
一键部署的托管者包含额外信息,相关字段以ecs_、unit_为前缀,记录了一键部署托管者服务器的相关信息(运营商名称、配置、状态等)以及计费周期、价格等信息,此处不再详述。
参数
无参数
GetRobotGroupList
GetRobotGroupList方法用于获取请求中API KEY对应的优宽量化交易平台账号下的实盘分组列表。
返回值
json
{
"code":0,
"data":{
"result":{
"items":[{
"id":2426,
"name":"C++实盘"
}]
},
"error":null
}
}
- items: 实盘分组信息。
- id: 实盘分组ID。
- name: 实盘分组名称。
items字段仅记录创建的新分组,「默认」分组不包含在items中。
参数
无参数
GetPlatformList
GetPlatformList方法用于获取请求中API KEY对应的优宽量化交易平台账号下已添加的交易所列表。
返回值
json
{
"code": 0,
"data": {
"result": {
"all": 1,
"platforms": [{
"category": "商品期货",
"date": "2024-04-23 13:38:24",
"eid": "Futures_CTP",
"id": 123,
"label": "期货主席(看穿式监管)",
"logo": "...",
"name": "CTP协议",
"profiles": "...",
"stocks": ["FUTURES"],
"website": "http://www.sfit.com.cn/"
}]
},
"error": null
}
}
- all: 已添加或配置的交易所对象总数。
- platforms: 交易所相关信息。
- eid: 优宽量化交易平台上的交易所标识符,在某些配置和参数中会使用
eid。 - profiles: 前置机配置信息。
- eid: 优宽量化交易平台上的交易所标识符,在某些配置和参数中会使用
参数
无参数
GetRobotList
GetRobotList方法用于获取请求中API KEY对应的优宽量化交易平台账号下的实盘列表。
返回值
json
{
"code": 0,
"data": {
"result": {
"all": 1,
"concurrent": 0,
"robots": [{
"charge_time": 1729561129,
"date": "2024-09-26 21:34:28",
"end_time": "2024-10-22 09:12:47",
"fixed_id": 1666928,
"id": 473200,
"is_sandbox": 0,
"name": "测试",
"node_guid": "0a77f717c15843910863a4c1b2867ca2",
"node_id": 1666928,
"node_public": 0,
"profit": 123,
"public": 0,
"refresh": 1729559554000,
"start_time": "2024-10-11 13:38:49",
"status": 4,
"strategy_id": 399872,
"strategy_isowner": true,
"strategy_language": 0,
"strategy_name": "测试",
"strategy_public": 0,
"uid": "0a77f717c15843910863a4c1b2867ca2",
"wd": 0
}]
},
"error": null
}
}
- robots: 实盘信息
- group_id: 实盘分组ID;如果实盘位于默认分组中,则不包含
group_id字段。
- group_id: 实盘分组ID;如果实盘位于默认分组中,则不包含
参数
| 名称 | 类型 | 必填 | 描述 |
offset | number | 否 | 分页查询的偏移量设置。 |
length | number | 否 | 分页查询的数据长度设置。 |
robotStatus | number | 否 | 指定要查询的实盘状态,参考扩展API接口「实盘状态码」,传入 |
label | string | 否 | 指定要查询的实盘自定义标签,可筛选出包含该标签的所有实盘。 |
keyWord | string | 否 | 查询关键字。 |
备注
以Python语言的扩展API接口「验证方式」为例:
print(api('GetRobotList')):获取全部实盘信息。
print(api('GetRobotList', 'member2')):打印所有自定义标签为member2的实盘信息。
print(api('GetRobotList', 0, 5, -1, 'member2')):分页查询,从偏移量0开始,最多返回5个标签为member2的实盘。
CommandRobot
CommandRobot方法用于向请求中API KEY对应的优宽量化交易平台账号下的实盘发送交互命令。接收交互命令的实盘ID由robotId参数指定,交互命令由策略中调用的GetCommand()函数捕获并返回。
返回值
json
{
"code":0,
"data":{
"result":false,
"error":null
}
}
- result: 交互指令是否发送成功。向未运行的实盘发送指令时,返回数据中的result为false。
参数
| 名称 | 类型 | 必填 | 描述 |
robotId | number | 是 |
|
cmd | string | 是 |
|
备注
实盘策略示例(假设该策略实盘正在运行,实盘ID为123):
javascript
function main() {
while (true) {
var cmd = GetCommand()
if (cmd) {
Log(cmd)
}
Sleep(2000)
}
}
如果使用本章节的Python测试脚本访问优宽量化交易平台的扩展API:api("CommandRobot", 123, "test command"),ID为123的实盘将收到交互指令test command,并通过Log函数输出打印。
StopRobot
StopRobot方法用于停止请求中API KEY对应的优宽量化交易平台账户下的实盘。停止运行的实盘ID由robotId参数指定。
返回值
json
{
"code":0,
"data":{
"result":4,
"error":null
}
}
- result: 实盘状态码,4表示已停止。
参数
| 名称 | 类型 | 必填 | 描述 |
robotId | number | 是 |
|
RestartRobot
RestartRobot方法用于重启请求中API KEY对应的优宽量化交易平台账号下的实盘。重启的实盘ID由robotId参数指定。
返回值
json
{
"code":0,
"data":{
"result":1,
"error":null
}
}
- result: 实盘状态码,1表示运行中。
参数
| 名称 | 类型 | 必填 | 描述 |
robotId | number | 是 |
|
settings | JSON对象 | 否 | 实盘配置参数。
|
备注
如果实盘是使用扩展API接口创建的,重启时必须使用扩展API接口RestartRobot进行重启,并且必须传入settings参数。在平台页面上创建的实盘,可以通过扩展API接口重启或者点击实盘页面上的按钮重启。可以传入settings参数或不传入。如果只传入robotId参数,则按照实盘的当前设置启动运行。
GetRobotDetail
GetRobotDetail方法用于获取请求中API KEY对应的优宽量化交易平台账号下指定实盘的详细信息。所要查询的实盘通过robotId参数指定。
返回值
json
{
"code": 0,
"data": {
"result": {
"robot": {
"charge_time": 1732520672,
"charged": 1184400,
"consumed": 87500000,
"date": "2021-10-29 16:14:56",
"debug": "{\"Nano\":1732518261405924960,\"Stderr\":\"\",\"Stdout\":\"\"}",
"end_time": "2024-11-25 15:04:21",
"favorite": {
"added": false,
"type": "R"
},
"fixed_id": 123,
"hits": 0,
"id": 123,
"is_deleted": 0,
"is_manager": true,
"is_sandbox": 0,
"name": "测试",
"node_id": 123,
"pexchanges": {
"-100": "Futures_CTP"
},
"phash": {},
"plabels": {
"-100": "Futures_CTP"
},
"priority": 0,
"profit": 0,
"public": 0,
"refresh": 1732518244000,
"robot_args": "[]",
"start_time": "2024-11-25 15:03:38",
"status": 4,
"strategy_args": "...",
"strategy_exchange_pairs": "[60,[-100],[\"FUTURES_CTP\"]]",
"strategy_id": 123,
"strategy_last_modified": "2024-10-10 18:09:05",
"strategy_name": "测试",
"strategy_public": "0",
"summary": "...",
"uid": "03dd49e1de9c29f7a02ae015c65ef136",
"username": "...",
"wd": 0
}
},
"error": null
}
}
- charge_time: 下次扣费时间,即当前扣费后的有效截止时间。
- charged: 已消耗的时间。
- consumed: 已消耗的金额(0.125 CNY = 12500000 / 1e8)。
- date: 创建日期。
- fixed_id: 实盘运行时分配的托管者ID,如果是自动分配,该值为-1。
- is_manager: 是否拥有管理该实盘的权限。
- is_sandbox: 是否为模拟盘。
- name: 实盘名称。
- node_id: 托管者ID。
- pexchanges: 实盘配置的交易所对象,-100为pid,"Futures_CTP"为交易所类型。该实盘的交易所配置通过eid方式创建(通过meta字段配置),因此显示pid的内容为-100;通过eid方式创建的交易所对象pid依次递减,例如:
{"-100":"Futures_CTP","-101":"Futures_CTP"}。 - plabels: 实盘配置的交易所对象的标签信息。
- profit: 实盘收益数据。
- public: 实盘是否公开。
- refresh: 最近活跃时间。
- strategy_exchange_pairs: 配置的交易所对象及设置的交易对信息。
- wd: 是否开启离线报警。
参数
| 名称 | 类型 | 必填 | 描述 |
robotId | number | 是 |
|
备注
strategy_exchange_pairs属性说明,以下列数据为例:
plaintext
[86400,[123456],["FUTURES"]]
其中第一个元素86400表示实盘配置的默认K线周期为1天(86400秒)。
[123456]为实盘配置的交易所对象eid列表(按添加顺序排列)。
["FUTURES"]为实盘配置的交易所对象设置的交易对(按添加顺序与eid一一对应)。因此[86400,[123456],["FUTURES"]]的数据结构为:[K线周期,交易所对象ID列表,交易对列表]。
GetAccount
GetAccount方法用于获取请求中API KEY对应的优宽量化交易平台账户信息。
返回值
json
{
"code":0,
"data":{
"result":{
"balance":52437600,
"concurrent":0,
"consumed":200647562400,
"currency":"CNY",
"email":"...",
"openai":false,
"settings":null,
"sns":{},
"uid":"...",
"username":"..."
},
"error":null
}
}
- balance: 账户余额
该数值采用整数表示以确保精度,实际金额需除以1e8(即10的8次方)进行换算。示例中的实际余额为:0.52437600
GetExchangeList
GetExchangeList方法用于获取优宽量化交易平台支持的交易所列表及其配置信息。
返回值
当isSummary参数为false时,返回的数据:
json
{
"code": 0,
"data": {
"result": {
"exchanges": [{
"category": "商品期货",
"eid": "Futures_CTP",
"id": 123,
"logo": "/upload/asset/236192b0caaca5fadf948.svg",
"meta": "...",
"name": "CTP协议",
"priority": 10,
"profiles": "...",
"stocks": "FUTURES",
"website": "http://www.sfit.com.cn/"
}]
},
"error": null
}
}
当isSummary参数为true时,返回的数据:
json
{
"code": 0,
"data": {
"result": {
"exchanges": [{
"category": "商品期货",
"eid": "Futures_CTP",
"id": 123,
"logo": "/upload/asset/236192b0caaca5fadf948.svg",
"name": "CTP协议",
"priority": 10,
"website": "http://www.sfit.com.cn/"
}]
},
"error": null
}
}
- meta: 交易所配置元数据。
- profiles: 前置机配置信息。
参数
| 名称 | 类型 | 必填 | 描述 |
isSummary | bool | 是 |
|
DeleteNode
DeleteNode方法用于删除请求中API KEY对应的优宽量化交易平台账号的托管者节点,删除的托管者节点ID为nid参数指定的托管者ID。
返回值
json
{
"code":0,
"data":{
"result":true,
"error":null
}
}
- result: 是否成功删除关联的托管者程序。
参数
| 名称 | 类型 | 必填 | 描述 |
nid | number | 是 |
|
DeleteRobot
DeleteRobot方法用于删除请求中API KEY对应的优宽量化交易平台账户下的实盘。删除的实盘ID为robotId参数指定的实盘ID。
返回值
json
{
"code":0,
"data":{
"result":0,
"error":null
}
}
- result: 实盘删除操作的反馈结果。
- 0: 正常删除。
- -2: 删除成功,但无法与实盘关联的托管器联系,请手动删除文件 123.db3!
参数
| 名称 | 类型 | 必填 | 描述 |
robotId | number | 是 |
|
deleteLogs | bool | 是 |
|
GetStrategyList
GetStrategyList方法用于获取平台策略信息。
返回值
json
{
"code": 0,
"data": {
"result": {
"all": 1784,
"strategies": [{
"category": 1,
"date": "2024-11-24 00:36:01",
"description": "...",
"forked": 0,
"hits": 0,
"id": 401124,
"is_buy": false,
"is_owner": false,
"language": 2,
"last_modified": "2024-11-24 00:36:01",
"name": "C++商品期货高频交易策略Penny Jump|C++ CTP Penny Jump (Copy)",
"profile": {
"avatar": "...",
"nickname": "eway",
"uid": "cc381d795af0912b4fbe4a1bfe00583e"
},
"public": 0,
"tags": "",
"uid": "cc381d795af0912b4fbe4a1bfe00583e",
"username": "eway"
}]
},
"error": null
}
}
- all: 符合筛选条件的策略总数。
- strategies: 查询返回的策略详细信息。
参数
| 名称 | 类型 | 必填 | 描述 |
offset | number | 是 |
|
length | number | 是 |
|
strategyType | number | 是 |
|
category | number | 是 |
|
needArgs | number | 是 |
|
language | number | 是 |
|
kw | string | 是 |
|
NewRobot
NewRobot方法用于创建请求中API KEY对应的优宽量化交易平台账号下的实盘。
返回值
json
{
"code":0,
"data":{
"result":473823,
"error":null
}
}
- result: 创建成功,返回实盘Id。
参数
| 名称 | 类型 | 必填 | 描述 |
settings | JSON对象 | 是 | 实盘配置参数,
|
备注
使用eid配置时,{"eid":"Futures_CTP","meta":{},"pair":"FUTURES_CTP"};配置的敏感信息优宽量化交易平台不会存储。这些数据将直接转发给托管者程序,因此每次创建或重启实盘时必须配置该信息。meta具体格式请参考:GetExchangeList接口返回数据中的meta字段内容。
以CTP协议为例,配置华安期货的信息,meta字段结构如下:
json
"meta":{
"AppID":"xxx",
"AuthCode":"xxx",
"BrokerId":"6020",
"ClientVer":"BT_T_V001",
"MDFront":"...",
"Name":"华安期货(看穿式监管)",
"Password":"xxx",
"TDFront":"...",
"Username":"xxx",
"V2":true
}
GetExchangeList接口返回数据中required为真的配置项,在配置meta时不可为空。required为假的配置项在配置meta时可为空。例如上例中的AuthCode、Name。
PluginRun
PluginRun方法用于调用优宽量化交易平台的调试工具功能;仅支持JavaScript语言。
返回值
json
{
"code":0,
"data":{
"result":"{\"logs\":[{\"PlatformId\":\"\",\"OrderId\":\"0\",\"LogType\":6,\"Price\":0,\"Amount\":0,\"Extra\":\"\",\"Currency\":\"\",\"Instrument\":\"\",\"Direction\":\"\",\"Time\":1732525620326},{\"PlatformId\":\"\",\"OrderId\":\"0\",\"LogType\":5,\"Price\":0,\"Amount\":0,\"Extra\":\"Hello YouQuant\",\"Currency\":\"\",\"Instrument\":\"\",\"Direction\":\"\",\"Time\":1732525620330}],\"result\":\"\"}",
"error":null
}
}
- result: 调试工具成功执行传入的JavaScript代码后返回的测试结果数据。
参数
| 名称 | 类型 | 必填 | 描述 |
settings | JSON对象 | 是 | 调试工具中的设置参数,
|
备注
{"pid": 1234, "pair": "FUTURES"}
{"pid": 1223, "pair": "FUTURES"}
对于settings中的exchanges属性,调用PluginRun方法时只需设置一个(在调试工具页面使用时也仅支持一个交易所对象)。在settings中设置2个交易所对象不会引发报错,但在代码中访问第二个交易所对象时将会报错。
GetRobotLogs
GetRobotLogs方法用于获取请求中API KEY对应的优宽量化交易平台账号下的实盘日志信息,所要获取的日志信息对应的实盘Id由robotId参数指定。
返回值
json
{
"code": 0,
"data": {
"result": {
"chart": "",
"chartTime": 0,
"logs": [{
"Total": 8,
"Max": 94,
"Min": 87,
"Arr": []
}, {
"Total": 0,
"Max": 0,
"Min": 0,
"Arr": []
}, {
"Total": 0,
"Max": 0,
"Min": 0,
"Arr": []
}],
"node_id": 123,
"online": true,
"refresh": 1732520711000,
"status": 4,
"summary": "...",
"updateTime": 1732520715044,
"wd": 0
},
"error": null
}
}
- logs: 日志信息;查询出的若干条日志数据存储在Arr字段中。
logs中第一个数据结构为实盘数据库中策略日志表的日志记录。
logs中第二个数据结构为实盘数据库中收益日志表的日志记录。
logs中第三个数据结构为实盘数据库中图表日志表的日志记录。 - summary: 实盘状态栏数据。
参数
| 名称 | 类型 | 必填 | 描述 |
robotId | number | 是 |
|
logMinId | number | 是 |
|
logMaxId | number | 是 |
|
logOffset | number | 是 |
|
logLimit | number | 是 |
|
profitMinId | number | 是 |
|
profitMaxId | number | 是 |
|
profitOffset | number | 是 |
|
profitLimit | number | 是 |
|
chartMinId | number | 是 |
|
chartMaxId | number | 是 |
|
chartOffset | number | 是 |
|
chartLimit | number | 是 |
|
chartUpdateBaseId | number | 是 |
|
chartUpdateDate | number | 是 |
|
summaryLimit | number | 是 |
|
备注
-
数据库中的策略日志表
返回数据中logs的属性值(数组结构)的第一个元素中(日志数据)Arr属性值描述如下:plaintext'Arr': [ [12, 5, '', '', 0, 0, '[]', 1635495362912, '', ''], [11, 3, 'Futures_Futu', '', 0, 0, 'Buy(1826.08, 1000): TrdMarket_CN: 缺少必要的参数: secMarket', 1635495362904, '', ''] ]id logType eid orderId price amount extra date contractType direction 12 5 '' '' 0 0 '[]' 1635495362912 '' '' 11 3 'Futures_Futu' '' 0 0 'Buy(1826.08, 1000): TrdMarket_CN: 缺少必要的参数: secMarket' 1635495362904 '' '' extra为打印日志的附加信息。logType值对应的日志类型描述如下:logType: 0 1 2 3 4 5 6 logType意义: BUY SALE RETRACT ERROR PROFIT MESSAGE RESTART 中文意义 买入订单日志 卖出订单日志 撤单 错误 收益 日志 重启 -
数据库中的收益图表日志表
该图表日志表数据与策略日志表中的收益日志保持一致。plaintext"Arr": [ [202, 2515.44, 1575896700315], [201, 1415.44, 1575896341568] ]以其中一条日志数据为例:
plaintext[202, 2515.44, 1575896700315]202为日志ID,2515.44为收益数值,1575896700315为时间戳。 -
数据库中的图表日志表
plaintext"Arr": [ [23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"], [23636, 5, "{\"x\":1575960300000,\"y\":3.0735}"] ]以其中一条日志数据为例:
plaintext[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],23637为日志ID,0为图表数据系列索引,最后的数据"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"为日志数据,该条数据为图表上的K线数据。