微网站建设服务备案的网站可以改域名吗
WEBSOCKET行情接入
行情在线测试 websocket行情接口
交易在线测试 在线交易接口
官方文档地址 行情交易接口用户文档
分配服务器
注意:每次分配的服务器地址会发生变化,连接服务前,请务必调用该接口获取最新的服务器地址。
获取服务器:
http://jvQuant.com/server?market=ab&type=websocket&token=<token> 
Copy
接口参数:
| # | 参数名 | 类型 | 描述 | 
|---|---|---|---|
| 1 | market | string | 市场标志,沪深为ab | 
| 2 | type | string | 接口类别,行情类别为websocket | 
| 3 | token | string | jvQuant token | 
接口返回:
| # | 参数名 | 类型 | 描述 | 
|---|---|---|---|
| 1 | code | string | 请求状态码 | 
| 2 | server | string | 分配服务器地址及端口号 | 
返回示例:
{"code": "0","server": "xx.xx.x.xx:xxxx/xxx"
} 
Copy
CODE规范
jvQuant支持沪深主板、科创板、创业板,股票以及可转债行情,提供level1和level2数据推送。
订阅代码由行情标志和证券代码组成,用分隔符"_"连接。
如:
lv1_600519,代表贵州茅台level1行情
lv2_127063,代表贵轮转债level2行情
| # | 行情标志 | 类型 | 描述 | 
|---|---|---|---|
| 1 | lv1 | string | level1行情 | 
| 2 | lv2 | string | level2行情 | 
连接登录
使用分配的服务器地址,通过websokcet协议连接服务器。
websocket接口地址:
ws://xx.xx.x.xx:xxxx/xxx?token=<token> 
Copy
订阅行情
创建websocket连接后,您可以输入以下指令进行行情订阅:
| # | 指令 | 参数 | 描述 | 
|---|---|---|---|
| 1 | add | string | 增加订阅code | 
| 2 | del | string | 删除订阅code | 
| 3 | all | string | 覆盖全部code | 
| 4 | list | string | 查看全部订阅code | 
指令后接code参数,用分隔符"="连接,多个code用分隔符","分隔。
例:
add=lv1_600519,lv2_127063 ,表示增加订阅lv1_600519,lv2_127063行情。
del=lv1_600519,lv2_127063 ,表示删除订阅lv1_600519,lv2_127063行情。
all=lv1_600519 ,表示覆盖全部订阅code。
all= ,后接参数为空,表示删除全部订阅code。
list ,无需参数,表示查看全部订阅code。
解析行情
为提高数据传输速率,行情推送采用二进制方式传输,请在接收端解压缩为字符串。
level1
level1行情推送数据以换行符"\n"为分隔,每一行以lv1_xxxxxx=为开头,代表该类别code对应的行情。
lv1每笔交易数据字段以","为分隔符,定义如下:
推送时间,证券名称,最新价格,涨幅,成交量,成交额,买五档[挂单数量,挂单价格],卖五档[挂单数量,挂单价格]
leve1推送数据包格式如下:
lv1_证券代码1=推送时间 ,证券名称,最新价格,涨幅,成交量,成交额,买五档[挂单数量,挂单价格],卖五档[挂单数量,挂单价格]...lv1_证券代码2=推送时间,证券名称,最新价格,涨幅,成交量,成交额,买五档[挂单数量,挂单价格],卖五档[挂单数量,挂单价格]...
level2
level2行情推送数据以换行符"\n"为分隔,每一行以lv2_xxxxxx=为开头,代表该类别code对应的行情。
同一时刻会存在多笔交易,以"|"为分隔符。
lv2每笔交易数据字段以","为分隔符,定义如下:
成交时间(毫秒),成交编号,成交价格,成交数量/(股)
推送数据包格式如下:
lv2_证券代码1=成交时间1,成交编号1,成交价格1,成交数量1|成交编号2,成交时间2,成交价格2,成交数量2... lv2_证券代码2=成交时间1,成交编号1,成交价格1,成交数量1|成交编号2,成交时间2,成交价格2,成交数量2...
在线测试
行情接入示例
PYTHON
#!python3
# -*- coding:utf-8 -*-
import time
import websocket
import zlib# 发送订阅
def on_open(ws):ws.send("all=lv2_600519,lv1_000001")# 接收推送
def on_message(ws, message, type, flag):# 命令返回文本消息if type == websocket.ABNF.OPCODE_TEXT:print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message)print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message)# 行情推送压缩二进制消息,在此解压缩if type == websocket.ABNF.OPCODE_BINARY:rb = zlib.decompress(message, -zlib.MAX_WBITS)print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Binary响应:", rb.decode("utf-8"))def on_error(ws, error):print(error)def on_close(ws, code, msg):print(time.strftime('%H:%M:%S', time.localtime(time.time())), "连接已断开")wsUrl = "ws://<服务器地址>?token=<jvQuant token>"
ws = websocket.WebSocketApp(wsUrl,on_open=on_open,on_data=on_message,on_error=on_error,on_close=on_close)
ws.run_forever() 
Copy
GOLANG
package mainimport ("bytes""compress/flate""github.com/gorilla/websocket""log""time"
)func main() {//连接地址wsUrl := "ws://<服务器地址>?token=<jvQuant token>"conn, _, err := websocket.DefaultDialer.Dial(wsUrl, nil)if err != nil {log.Fatalln("连接错误:", err)}//接收协程go func() {receive(conn)}()//发送订阅cmd := "all=lv2_600519,lv1_000001"err = conn.WriteMessage(websocket.TextMessage, []byte(cmd))if err != nil {log.Fatalln("发送指令错误:", err)}log.Println("发送指令成功,等待接收")for {time.Sleep(time.Second)}
}func receive(conn *websocket.Conn) {for {//阻塞接收messageType, rb, err := conn.ReadMessage()if err != nil {log.Fatalln("接收错误:", err)return}//文本消息if messageType == websocket.TextMessage {log.Println("Text响应:", string(rb))}//二进制消息if messageType == websocket.BinaryMessage {unZipByte := DeCompress(rb)log.Println("Binary推送:", string(unZipByte))}}
}//解压方法
func DeCompress(b []byte) []byte {var buffer bytes.Bufferbuffer.Write([]byte(b))reader := flate.NewReader(&buffer)var result bytes.Bufferresult.ReadFrom(reader)reader.Close()return result.Bytes()
}