相信大家对股市都不陌生,甚至什么是L2,可能大家都略有了解,但是说到L2行情接口可能大家就会觉得一头雾水,今日我们就来说说什么是L2行情接口,以及L2行情接口的优势。
首先,L2就是level 2,Level-2产品是由上海证券交易所推出的实时行情信息收费服务,主要提供在上海证券交易所上市交易的证券产品的实时交易数据。包括level2十档行情,买卖队列,逐笔成交,委托总量和加权价格等多种新式数据。使用Level-2软件的股民,在开盘时间内,可以随时看到庄家、散户买卖股票的情况。而L2行情接口就是指通过接口功能直接获得行情数据,并利用数据进行股票交易策略。
L2行情接口有什么优势?
回到正题,那到底L2行情接口有什么优势呢?一般来讲,L2行情接口其实是用于股票量化交易的工具之一,一般投资者最多只能看到10档买卖行情,但是只有这么少的数据,我们是很难进行买卖决策的,必须拿到更多的数据才能做出比较准确的判断,而L2行情接口就可以帮到我们了。换句话来说,L2行情接口就是为了帮助我们更好完成股票交易的一个工具。
说了这么多,相信大家对于L2行情接口多少也有了解了,如果再深入点说,L2行情接口还会根据不同的编程方式,适用的人群也不会一样,如果大家有兴趣,以后再跟大家详细讲解,今日就先说这么多,大家先好好消化一下吧。不懂的也可以找我聊聊
1.下载行情工具
https://gitee.com/l2gogogo/l2-push-python/tree/master/cli
2.目录说明
名称 说明
conf 配置目录
data 数据目录
log 日志目录
txtool 命令行工具-Linux
txtool.exe 命令行工具-Windows
3.行情工具常用命令
命令 说明
txtool -h 查看帮助
txtool version 查看工具版本号
txtool proxy 启动本地代理服务器。默认命令,Windows可直接双击执行
4.接入说明
1.下载行情工具,修改conf/proxy.toml
1.设置用户名和密码:User/Passwd
2.设置推送服务器地址:RpcServer/TcpServer
2.打开命令窗口,切换到cli目录,执行命令启动本地代理服务器
1.Linux系统执行:txtool proxy
2.Windows系统执行:txtool.exe proxy
3.如果提示本机端口已占用,可修改配置项Address(代理服务器监听地址)
3.启动成功,调用代理服务器提供的GRPC接口
1.接口地址见配置项Address,默认为:localhost:8090
2.接口定义,见目录proto
4.代理服务器配置
1.proxy.toml 配置代理服务器监听地址,是否将推送消息写入本地文件等
2.log.toml 配置日志格式,是否写入控制台和文件等
Level2行情接口
l接口定义,见目录proto
订阅事件
get_subscription查询订阅
add_subscription新增订阅
del_subscription取消订阅
数据推送事件
tick_record_stream 推送逐笔成交行情数据
order_record_stream 推送逐笔委托行情数据
order_queue_record_stream推送委托队列行情数据
stock_quote_record_stream 推送股票十档行情行情数据
代码示例
# -*- coding: utf-8 -*-
# 此Demo只是演示接入过程
import grpc
import entity_pb2
import proxy_pb2_grpc
import threading
from multiprocessing import Process
# 代理服务器监听的地址和端口
ServerConnect = grpc.insecure_channel('localhost:5000')
Stub = proxy_pb2_grpc.ProxyStub(ServerConnect)
# 查询订阅
def get_subscription():
# rep返回code为1代表成功,其余状态码可参考接入文档,data是返回订阅股票的情况
Result = Stub.GetSubscription(entity_pb2.Void())
print(Result)
# 新增订阅
def add_subscription():
# 实例ProtoBuf协议的方法
String = entity_pb2.String()
# 修改协议的值
# 2:市场代码标识(1为上海证券,2为深圳证券)
# 000002:股票代码
# 15:订阅全部标识(1为逐笔成交,2为逐笔委托,4为委托队列,8为股票十档行情,如果想全部订阅可直接填入15,原理是1+2+4+8,如果想订阅某几个行情将几个行情标识相加即可)
String.value = '2_000002_15'
# String.value = '2_000001_15,2_000002_5,2_000003_12,批量订阅'
# rep返回code为1代表成功,其余状态码可参考接入文档
Result = Stub.AddSubscription(String)
print(Result)
# 取消订阅
def del_subscription():
# 实例ProtoBuf协议的方法
String = entity_pb2.String()
# 修改协议的值
# 2:市场代码标识(1为上海证券,2为深圳证券)
# 000002:股票代码
# 15:取消全部标识(1为逐笔成交,2为逐笔委托,4为委托队列,8为股票十档行情,如果想全部取消可直接填入15,原理是1+2+4+8,如果想取消某几个行情将几个行情标识相加即可)
String.value = '2_000002_15'
# String.value = '2_000001_15,2_000002_5,2_000003_12,批量取消'
# rep返回code为1代表成功,其余状态码可参考接入文档
Result = Stub.DelSubscription(String)
print(Result)
# 推送逐笔成交行情数据
def tick_record_stream():
StreamResult = Stub.NewTickRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
# 推送逐笔委托行情数据
def order_record_stream():
StreamResult = Stub.NewOrderRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
# 推送委托队列行情数据
def order_queue_record_stream():
StreamResult = Stub.NewOrderQueueRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
# 推送股票十档行情行情数据
def stock_quote_record_stream():
StreamResult = Stub.NewStockQuoteRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
if __name__ == '__main__':
# 可以使用多线程并发接收推送数据
ThreadOne = threading.Thread(target=tick_record_stream)
ThreadTwo = threading.Thread(target=order_record_stream)
ThreadThree = threading.Thread(target=order_queue_record_stream)
ThreadFour = threading.Thread(target=stock_quote_record_stream)
# 多进程并发接收推送数据
# ProcessOne = Process(target=tick_record_stream)
# ProcessTwo = Process(target=order_record_stream)
# ProcessThree = Process(target=order_queue_record_stream)
# ProcessFour = Process(target=stock_quote_record_stream)
# 这设置为随主线程退出子线程,避免产生孤儿或僵尸线程
ThreadOne.daemon = True
ThreadTwo.daemon = True
ThreadThree.daemon = True
ThreadFour.daemon = True
# ProcessOne.daemon = True
# ProcessTwo.daemon = True
# ProcessThree.daemon = True
# ProcessFour.daemon = True
# 有一点值得注意一下,假如订阅的股票相对活跃,推送的数据就不会有休眠的状态出现,因为Python的GIL锁,所以用多线程接收推送效率不显著,这个时候可以考虑用多进程来接收推送
ThreadOne.start()
ThreadTwo.start()
ThreadThree.start()
ThreadFour.start()
# ProcessOne.start()
# ProcessTwo.start()
# ProcessThree.start()
# ProcessFour.start()
ThreadOne.join()
ThreadTwo.join()
ThreadThree.join()
ThreadFour.join()
# ProcessOne.join()
# ProcessTwo.join()
# ProcessThree.join()
# ProcessFour.join()