• 程序化交易(二)level2行情数据源接入


    WEBSOCKET行情接入

    行情在线测试 websocket行情接口

    交易在线测试 在线交易接口

    官方文档地址 行情交易接口用户文档

    分配服务器

    注意:每次分配的服务器地址会发生变化,连接服务前,请务必调用该接口获取最新的服务器地址。

    获取服务器:

    http://jvQuant.com/server?market=ab&type=websocket&token=<token>

    Copy

    接口参数:

    #参数名类型描述
    1marketstring市场标志,沪深为ab
    2typestring接口类别,行情类别为websocket
    3tokenstringjvQuant token

    接口返回:

    #参数名类型描述
    1codestring请求状态码
    2serverstring分配服务器地址及端口号

    返回示例:

    1. {
    2. "code": "0",
    3. "server": "xx.xx.x.xx:xxxx/xxx"
    4. }

    Copy

    CODE规范

    jvQuant支持沪深主板、科创板、创业板,股票以及可转债行情,提供level1和level2数据推送。

    订阅代码由行情标志证券代码组成,用分隔符"_"连接。

    如:

    lv1_600519,代表贵州茅台level1行情

    lv2_127063,代表贵轮转债level2行情

    #行情标志类型描述
    1lv1stringlevel1行情
    2lv2stringlevel2行情

    连接登录

    使用分配的服务器地址,通过websokcet协议连接服务器。

    websocket接口地址:

    ws://xx.xx.x.xx:xxxx/xxx?token=<token>

    Copy

    订阅行情

    创建websocket连接后,您可以输入以下指令进行行情订阅:

    #指令参数描述
    1addstring增加订阅code
    2delstring删除订阅code
    3allstring覆盖全部code
    4liststring查看全部订阅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

    1. #!python3
    2. # -*- coding:utf-8 -*-
    3. import time
    4. import websocket
    5. import zlib
    6. # 发送订阅
    7. def on_open(ws):
    8. ws.send("all=lv2_600519,lv1_000001")
    9. # 接收推送
    10. def on_message(ws, message, type, flag):
    11. # 命令返回文本消息
    12. if type == websocket.ABNF.OPCODE_TEXT:
    13. print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message)
    14. print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message)
    15. # 行情推送压缩二进制消息,在此解压缩
    16. if type == websocket.ABNF.OPCODE_BINARY:
    17. rb = zlib.decompress(message, -zlib.MAX_WBITS)
    18. print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Binary响应:", rb.decode("utf-8"))
    19. def on_error(ws, error):
    20. print(error)
    21. def on_close(ws, code, msg):
    22. print(time.strftime('%H:%M:%S', time.localtime(time.time())), "连接已断开")
    23. wsUrl = "ws://<服务器地址>?token="
    24. ws = websocket.WebSocketApp(wsUrl,
    25. on_open=on_open,
    26. on_data=on_message,
    27. on_error=on_error,
    28. on_close=on_close)
    29. ws.run_forever()

    Copy

    GOLANG

    1. package main
    2. import (
    3. "bytes"
    4. "compress/flate"
    5. "github.com/gorilla/websocket"
    6. "log"
    7. "time"
    8. )
    9. func main() {
    10. //连接地址
    11. wsUrl := "ws://<服务器地址>?token="
    12. conn, _, err := websocket.DefaultDialer.Dial(wsUrl, nil)
    13. if err != nil {
    14. log.Fatalln("连接错误:", err)
    15. }
    16. //接收协程
    17. go func() {
    18. receive(conn)
    19. }()
    20. //发送订阅
    21. cmd := "all=lv2_600519,lv1_000001"
    22. err = conn.WriteMessage(websocket.TextMessage, []byte(cmd))
    23. if err != nil {
    24. log.Fatalln("发送指令错误:", err)
    25. }
    26. log.Println("发送指令成功,等待接收")
    27. for {
    28. time.Sleep(time.Second)
    29. }
    30. }
    31. func receive(conn *websocket.Conn) {
    32. for {
    33. //阻塞接收
    34. messageType, rb, err := conn.ReadMessage()
    35. if err != nil {
    36. log.Fatalln("接收错误:", err)
    37. return
    38. }
    39. //文本消息
    40. if messageType == websocket.TextMessage {
    41. log.Println("Text响应:", string(rb))
    42. }
    43. //二进制消息
    44. if messageType == websocket.BinaryMessage {
    45. unZipByte := DeCompress(rb)
    46. log.Println("Binary推送:", string(unZipByte))
    47. }
    48. }
    49. }
    50. //解压方法
    51. func DeCompress(b []byte) []byte {
    52. var buffer bytes.Buffer
    53. buffer.Write([]byte(b))
    54. reader := flate.NewReader(&buffer)
    55. var result bytes.Buffer
    56. result.ReadFrom(reader)
    57. reader.Close()
    58. return result.Bytes()
    59. }
  • 相关阅读:
    如何戒掉短视频?2个方法适合职场人,从未失败过
    掷骰子的多线程应用程序1(复现《Qt C++6.0》)
    C# 中结构体的复制
    PyTorch and Stable Diffusion on FreeBSD
    决策树C4.5算法的技术深度剖析、实战解读
    即将拉开序幕!武汉市人工智能领域技术成果征集内容、范围和相关要求
    Echarts 实现X轴多维效果
    C语言经典算法实例1:求二维数组最大最小值
    OpenLayer通过WMTSCapabilities.xml加载GeoServer发布的标准vmts地图服务
    不止于观测|阿里云可观测套件正式发布
  • 原文地址:https://blog.csdn.net/FuckTheWindows/article/details/134073704