当前位置: 首页 > article >正文

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

WEBSOCKET行情接入

行情在线测试 websocket行情接口

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

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

分配服务器

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

获取服务器:

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

Copy

接口参数:

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

接口返回:

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

返回示例:

{
  "code": "0",
  "server": "xx.xx.x.xx:xxxx/xxx"
}

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

#!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 main

import (
	"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.Buffer
	buffer.Write([]byte(b))
	reader := flate.NewReader(&buffer)
	var result bytes.Buffer
	result.ReadFrom(reader)
	reader.Close()
	return result.Bytes()
}

http://www.kler.cn/a/109047.html

相关文章:

  • 基于表格滚动截屏(表格全部展开,没有滚动条)
  • [项目代码] YOLOv5 铁路工人安全帽安全背心识别 [目标检测]
  • 《基于深度学习的车辆行驶三维环境双目感知方法研究》
  • JDBC-Dao层模式
  • leetcode206. Reverse Linked List
  • git status 命令卡顿的排查
  • LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
  • idea 没加载 provided的包
  • GoLong的学习之路(十二)语法之标准库 flag的使用
  • LeetCode 125 验证回文串 简单
  • stream流—关于Collectors.toMap使用详解
  • Ubuntu服务器中java -jar 后台运行Spring Boot项目
  • 精通Nginx(01)-产品概览
  • 物联网数据采集网关连接设备与云平台的关键桥梁
  • calloc、malloc、realloc函数的区别及用法
  • 【力扣SQL】几个常见SQL题
  • 并发编程
  • uniapp开发小程序—根据生日日期计算年龄 周岁
  • 【自动驾驶】Free space与Ray casting
  • SpringBoot面试题8:运行 Spring Boot 有哪几种方式?Spring Boot 需要独立的容器运行吗?
  • ubuntu 18 更新git版本到 2.80.1
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 求二进制最低位1和最高位1的方法,以及反转二进制,复杂度O(1)
  • Python-easygui
  • 开发库介绍
  • 链游风暴再起?MBOX即将再度起飞