输入/搜索内容
欢迎使用优宽量化交易平台
编程语言
JavaScript
TypeScript
Python
C++
My语言(麦语言)
PINE语言
Blockly可视化
Workflow工作流
支持的协议
密钥安全性
实盘
策略库
托管者
部署托管者
一键租用托管者
手动部署托管者
托管者操作注意事项
全局指定IP地址
命令行版本托管者程序的参数
实盘数据迁移
托管者监控
交易所
策略编辑器
回测系统
策略入口函数
策略框架与API函数
模板类库
策略参数
交互控件
商品期货
期权交易
股票证券
C++策略编写说明
JavaScript策略编写说明
内置库
扩展API接口
MCP 服务
交易终端
数据探索
Alpha因子分析工具
调试工具
远程编辑
完整策略的导入与导出
多语言支持
实盘、策略分组
实盘展示
策略分享与出租
实盘消息推送
实盘报错、异常退出的常见原因
交易所特殊说明、兼容记录

调用扩展API接口时支持两种验证方式:token验证和直接验证。

使用md5加密方式进行验证,以下是PythonGolang语言的调用示例:

python
#!/usr/bin/python # -*- coding: utf-8 -*- import time import json import ssl ssl._create_default_https_context = ssl._create_unverified_context try: import md5 import urllib2 from urllib import urlencode except: import hashlib as md5 import urllib.request as urllib2 from urllib.parse import urlencode accessKey = 'f27bfcXXXXXXXX013c62e98XXXXX817a' secretKey = 'ffeXXXXXXXX085ff7269XXXXXXXX6f82' def api(method, *args): d = { 'version': '1.0', 'access_key': accessKey, 'method': method, 'args': json.dumps(list(args)), 'nonce': int(time.time() * 1000), } d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest() # 注意:urllib2.urlopen 函数可能存在超时问题,可以设置超时时间,例如:urllib2.urlopen('https://www.youquant.com/api/v1', urlencode(d).encode('utf-8'), timeout=10) 设置超时时间为10秒 return json.loads(urllib2.urlopen('https://www.youquant.com/api/v1', urlencode(d).encode('utf-8')).read().decode('utf-8')) # 返回托管者列表 print(api('GetNodeList')) # 返回交易所列表 print(api('GetPlatformList')) # GetRobotList(offset, length, robotStatus, label),传入-1表示获取全部 print(api('GetRobotList', 0, 5, -1, 'member2')) # CommandRobot(robotId, cmd)向实盘发送命令 print(api('CommandRobot', 123, 'ok')) # StopRobot(robotId)返回实盘状态码 print(api('StopRobot', 123)) # RestartRobot(robotId)返回实盘状态码 print(api('RestartRobot', 123)) # GetRobotDetail(robotId)返回实盘详细信息 print(api('GetRobotDetail', 123))
mylang
package main import ( "fmt" "time" "encoding/json" "crypto/md5" "encoding/hex" "net/http" "io/ioutil" "strconv" "net/url" ) // 填写您的优宽量化交易平台账号的API密钥 var apiKey string = "" // 填写您的优宽量化交易平台账号的密钥 var secretKey string = "" var baseApi string = "https://www.youquant.com/api/v1" func api(method string, args ... interface{}) (ret interface{}) { // 处理参数 jsonStr, err := json.Marshal(args) if err != nil { panic(err) } params := map[string]string{ "version" : "1.0", "access_key" : apiKey, "method" : method, "args" : string(jsonStr), "nonce" : strconv.FormatInt(time.Now().UnixNano() / 1e6, 10), } data := fmt.Sprintf("%s|%s|%s|%v|%s", params["version"], params["method"], params["args"], params["nonce"], secretKey) h := md5.New() h.Write([]byte(data)) sign := h.Sum(nil) params["sign"] = hex.EncodeToString(sign) // http request client := &http.Client{} // request urlValue := url.Values{} for k, v := range params { urlValue.Add(k, v) } urlStr := urlValue.Encode() request, err := http.NewRequest("GET", baseApi + "?" + urlStr, nil) if err != nil { panic(err) } resp, err := client.Do(request) if err != nil { panic(err) } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } ret = string(b) return } func main() { settings := map[string]interface{}{ "name": "hedge test", "strategy": 1234, // K线周期参数,60表示60秒 "period": 60, "node" : 1234, "appid": "member2", "exchanges": []interface{}{ map[string]interface{}{ "pid": "1234", "pair": "FUTURES", }, }, } method := "NewRobot" fmt.Println("调用接口:", method) ret := api(method, settings) fmt.Println("main ret:", ret) }

支持不使用token验证(直接传递secret_key验证),可以生成一个用于直接访问的URL。例如直接向实盘发送交互指令的URL,可用于Trading View或其他场景的WebHook回调。对于扩展API接口CommandRobot()函数,不进行nonce校验,不限制该接口的访问频率和访问次数。

例如,创建的扩展API KEY中的AccessKey为:xxxSecretKey为:yyy,访问以下链接即可向ID为186515的实盘发送交互指令消息,消息内容为字符串:"ok12345"

plaintext
https://www.youquant.com/api/v1?access_key=xxx&secret_key=yyy&method=CommandRobot&args=%5B186515%2C%22ok12345%22%5D

在支持直接验证方式下,可获取请求中的Body数据,仅支持CommandRobot接口。例如在Trading ViewWebHook URL中设置:

plaintext
https://www.youquant.com/api/v1?access_key=xxx&secret_key=yyy&method=CommandRobot&args=%5B186515%2C+%22%22%5D

注意需要按照此格式设置:%5B186515%2C+%22%22%5D(编码前为:[186515, ""]),其中186515是优宽量化交易平台的实盘ID。

模拟Trading View发送WebHook URL警报:

javascript
function main() { var options = { method: "POST", body: `{"test": 123}`, headers: {"Content-Type": "application/json"} } // WebHook URL 警报会自动发送POST请求,包含需要的 headers 设置 return HttpQuery("https://www.youquant.com/api/v1?access_key=xxx&secret_key=xxx&method=CommandRobot&args=%5B186515%2C+%22%22%5D", options) }

Trading View消息框中设置(要发送的请求中的Body数据):

  • JSON格式:

    img

    text
    {"close": {{close}}, "name": "aaa"}

    ID为186515的实盘即可收到交互命令:{"close": 39773.75, "name": "aaa"}

  • 文本格式:

    img

    text
    XXX PERP 穿过(Crossing) 39700.00 close: {{close}}

    ID为186515的实盘即可收到交互命令:XXX PERP 穿过(Crossing) 39700.00 close: 39739.4

PythonGolang语言调用示例:

python
#!/usr/bin/python # -*- coding: utf-8 -*- import json import ssl ssl._create_default_https_context = ssl._create_unverified_context try: import urllib2 except: import urllib.request as urllib2 accessKey = 'your accessKey' secretKey = 'your secretKey' def api(method, *args): return json.loads(urllib2.urlopen(('https://www.youquant.com/api/v1?access_key=%s&secret_key=%s&method=%s&args=%s' % (accessKey, secretKey, method, json.dumps(list(args)))).replace(' ', '')).read().decode('utf-8')) # 如果APIKEY 没有该接口权限,调用 print(api('RestartRobot', 130350)) 会失败,返回数据:{'code': 4, 'data': None} # print(api('RestartRobot', 130350)) # 打印ID为:130350的实盘详细信息 print(api('GetRobotDetail', 130350))
mylang
package main import ( "fmt" "encoding/json" "net/http" "io/ioutil" "net/url" ) // 填写自己的优宽量化交易平台账号的api key var apiKey string = "your access_key" // 填写自己的优宽量化交易平台账号的secret key var secretKey string = "your secret_key" var baseApi string = "https://www.youquant.com/api/v1" func api(method string, args ... interface{}) (ret interface{}) { jsonStr, err := json.Marshal(args) if err != nil { panic(err) } params := map[string]string{ "access_key" : apiKey, "secret_key" : secretKey, "method" : method, "args" : string(jsonStr), } // http request client := &http.Client{} // request urlValue := url.Values{} for k, v := range params { urlValue.Add(k, v) } urlStr := urlValue.Encode() request, err := http.NewRequest("GET", baseApi + "?" + urlStr, nil) if err != nil { panic(err) } resp, err := client.Do(request) if err != nil { panic(err) } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } ret = string(b) return } func main() { method := "GetRobotDetail" fmt.Println("调用接口:", method) ret := api(method, 130350) fmt.Println("main ret:", ret) }

使用优宽量化交易平台扩展API实现TradingView报警信号交易
使用优宽量化交易平台扩展API实现TradingView报警信号交易,B站视频链接