如何获取Level2实时行情和交易报单接口及历史数据回测?
摘要:相同的二级市场,相同的市场数据,为什么自己的账户总是亏的。真正拉开差距的,往往是信息的获取速度和执行效率。 你还在手动盯盘、手动下单的时候,别人已经用程序化交易在毫秒间完成了买卖。 可能他们有更好的策略、更多的资金,或者更丰富的经验。但说实
相同的二级市场,相同的市场数据,为什么自己的账户总是亏的。真正拉开差距的,往往是信息的获取速度和执行效率。 你还在手动盯盘、手动下单的时候,别人已经用程序化交易在毫秒间完成了买卖。
可能他们有更好的策略、更多的资金,或者更丰富的经验。但说实话,这些都不是最核心的原因。
普通投资者接入了实时行情和交易接口,也能搭建自己的量化交易系统。
实时行情接入:为什么Level2行情是量化交易的“刚需”?
很多量化新手一开始都会去抓取基础行情数据,比如Akshare或者一些券商的普通行情接口。但很快就会发现,这些数据远远不够,并发抓取更是灾难。
而且Level2行情根本抓不到,对于高频交易和策略优化来说,Level2行情是必需的数据源。
之前也抓过不少行情源,刷新间隔太大,基本都在3~6s,再刷新拉板都封死了。
Wind 恒生等服务商只对机构合作。只有搞到Level2高速行情,才算是拉平了数据源的差距。用WebSocket接口非常稳定,延迟低,数据全,接入也很简单,没有那么复杂的协议编码。下面是找的一个C++示例,通过WebSocket来接入Level2行情:
#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>
#include <string>
#include <iostream>
#include <memory>
#include <assert.h>
#include <cstring>
#include "zlib.h"
#define CHUNK 16384
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
typedef websocketpp::client <websocketpp::config::asio_client> client;
typedef websocketpp::config::asio_client::message_type::ptr message_ptr;
int DecompressString(const char *in_str, size_t in_len, std::string &out_str);
/**
* 接收处理
*/
void on_message(client *c, websocketpp::connection_hdl hdl, message_ptr msg) {
//文本消息
if (msg->get_opcode()==websocketpp::frame::opcode::text){
std::cout <<"Text响应:"<<msg->get_payload().c_str()<< std::endl;
}
//二进制消息
if (msg->get_opcode()==websocketpp::frame::opcode::binary){
std::string tmp = "";
std::string &out_decompress = tmp;
DecompressString( msg->get_payload().c_str(), msg->get_payload().size(), out_decompress);
std::cout <<"Binary响应:"<<out_decompress<< std::endl;
}
}
/**
* 连接处理
*/
void on_open(client *c, websocketpp::connection_hdl hdl) {
//发送订阅指令
c->send(hdl, "add=lv1_600519,lv2_600519", websocketpp::frame::opcode::text);
std::cout << "连接成功" << std::endl;
}
int main(int argc, char *argv[]) {
//服务地址。
