盈透数据获取实时K线与坑点
官方API文档地址
TWS API v9.72+: Trader Workstation APIhttps://interactivebrokers.github.io/tws-api/一.如何获取ETH/EUR/USD/BTC等外汇或者数字货币实时数据走势
1.第一种方式我们可以通过
eg:m_s.reqRealTimeBars(1,contract,5,"MIDPOINT",true,Collections.emptyList());
我们可以通过5秒k线数据图请求5秒内快照数据进行拼接
注意该方法是在 realtimeBar中进行回调我们需要在此接口中重写相关方法处理业务逻辑
简单的贴一份代码:
建立TWS CLIENT连接:
private EJavaSignal m_signal = new EJavaSignal(); private EClientSocket m_s = new EClientSocket(this, m_signal); m_s.eConnect("localhost", 7496, 0);final EReader reader = new EReader(m_s, m_signal);reader.start();new Thread(() -> {while (m_s.isConnected()) {m_signal.waitForSignal();try {SwingUtilities.invokeAndWait(() -> {try {reader.processMsgs();} catch (Exception e) {error(e);}});} catch (Exception e) {error(e);}}}).start(); if (NextOrderId < 0) {sleep(1000); }
以EUR为例:
Contract contract = new Contract();
contract.symbol("EUR");
contract.secType("CASH");
contract.exchange("IDEALPRO");
contract.currency("USD");
m_s.reqMarketDataType(1);
m_s.reqRealTimeBars(1,contract,5,"MIDPOINT",true,Collections.emptyList());
处理回调方法:
@Override public void realtimeBar(int reqId, long time, double open, double high, double low, double close, Decimal volume, Decimal wap, int count) throws UnirestException {//下面代码实在回调中处理自己的相关业务 我们是通过http请求我们自己的接口发送相关数据 在通过webscoket进行数据的推送
Unirest.post(twsnotifyUrl).header("Content-Type", "application/json").header("charset","utf-8").body(jsonObject.toJSONString()).asString(); }
2.第二种方式我们可以通过
m_s.reqMktData(9,contract9,"",false,false, Collections.emptyList());
每秒快照的方式进行数据的请求只不过该方法我们回调的接口是不同的这点需要注意下
tickPrice我们可以通过这个回调接口得到k线所需要的相关价格进行k线数据的构造
话不多说直接贴代码 建立连接的过程是相同的
@Override public void tickPrice(int tickerId, int field, double price, TickAttrib attribs) throws UnirestException { //处理相关业务 }
二.盈透数据的坑
因为我们是通过TWS客户端获取的实时数据推送 所以这一点也是比较坑的 我们需要VPS 取部署windows服务器 安装TWS客户端进行数据的推送 但是TWS客户端由于他的维护缺点每天都会定时的进行关闭维护 所以我们要向获取实时走势 就需要定时的维护TWS客户端 但是作为一个程序员 我们也是为了各种苦逼的事情想到的解决办法就是 进程守护
直接上代码 让TWS每天定时守护进程 让他关机自己启动
@echo off
set _task=tws.exe
set _svr=c:\windows\tws.exe
set _des=start.bat
set _interval=50
:checkstart
for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do (
if %%n==%_task% (goto checkag) else goto startsvr
)
:startsvr
echo %time%
echo ********program start begin********
echo program reboost at %time% ,please check log. >> restart_service.txt
start %_svr%
::echo exit >> %_des%
::start %_des%
::set/p=.<nul
::for /L %%i in (1 1 10) do set /p a=.<nul&ping.exe /n 2 127.0.0.1>nul
::echo .
::echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs
::cscript //b //nologo %tmp%\delay.vbs 10000
::del %_des% /Q
echo ********program start finished ********
goto checkstart
:checkag
echo %time% program %_task% run normally, next check will be lauched in %_interval% milliseconds ...
echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs
cscript //b //nologo %tmp%\delay.vbs %_interval%
goto checkstart
当然了除了脚本 也给大家推荐个软件 Always Open 如果有需要自行下载
三.webscoket数据推送
public class AliyunClient extends WebSocketClient {protected Logger logger = LoggerFactory.getLogger(this.getClass());private final AliyunExchangeService aliyunExchangeService;private AliyunMonitor aliyunMonitor;public AliyunClient(URI serverUri, AliyunExchangeService aliyunExchangeService) {super(serverUri,new Draft_6455());this.aliyunExchangeService = aliyunExchangeService;}@Overridepublic void onOpen(ServerHandshake handshakedata) {logger.info("AliyunClient onOpen {} {}", handshakedata.getHttpStatusMessage(), handshakedata.getHttpStatus());aliyunMonitor = new AliyunMonitor();ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1);executorService.scheduleAtFixedRate(aliyunMonitor, 0, 10, TimeUnit.SECONDS);aliyunExchangeService.init();}@Overridepublic void onMessage(String message) {logger.info("AliyunClient message: {} ", message);if (message.contains("ping")){aliyunMonitor = new AliyunMonitor();return;}if (message.contains("rm")) {aliyunExchangeService.handleData(message);}}@Overridepublic void onMessage(ByteBuffer byteBuffer) {}@Overridepublic void onClose(int code, String reason, boolean remote) {logger.error("AliyunClient onClose code: {} message: {}", code, reason);aliyunExchangeService.stop();}@Overridepublic void onError(Exception ex) {logger.error("AliyunClient error");}class AliyunMonitor implements Runnable {@Overridepublic void run() {sendPing();}private void sendPing() {send("/heartbeat/ok");}} }
@Component public class AliyunExchangeService implements IExchangeService {protected Logger logger = LoggerFactory.getLogger(this.getClass());// private static final String WEBSOCKET_URL = WebSocketProperties.ALIYUN_URL + WebSocketProperties.TOKEN;private final Map<String, String> TRADE_DETAIL_MAP = new HashMap<>();private AliyunClient aliyunClient;@Resourceprivate MergeService mergeService;@Resourceprivate SymbolCache symbolCache;@Overridepublic void start() {try {TRADE_DETAIL_MAP.clear();logger.info("启动AliyunClient"); // aliyunClient = new AliyunClient(new URI(WEBSOCKET_URL), this); // aliyunClient.connect();} catch (Exception e) {logger.error(e.getMessage(), e);}}@Overridepublic void stop() {//重连if (aliyunClient.getReadyState() == WebSocket.READYSTATE.OPEN|| aliyunClient.getReadyState() == WebSocket.READYSTATE.CONNECTING) {aliyunClient.close();}aliyunClient = null;try {Thread.sleep(2000);} catch (InterruptedException e) {logger.error(e.getMessage(), e);}start();}public void init() {List<String> exchangeSymbolList = symbolCache.listExchangeSymbol(MarketConstant.EXCHANGE_ALIYUN);for (String symbol : exchangeSymbolList) {//订阅缓存中的所有行情数据sub(symbol);}}@Overridepublic void sub(String symbol) {subTradeMarKet(symbol);}@Overridepublic void unsub(String symbol) {unsubTradeMarket(symbol);}/*** 订阅行情数据* @param symbol*/private void subTradeMarKet(String symbol) {String sub = "/sub/" + symbol;if (TRADE_DETAIL_MAP.containsKey(symbol)) {return;}TRADE_DETAIL_MAP.put(symbol, sub);aliyunClient.send(sub);}/*** 退订行情数据*/private void unsubTradeMarket(String symbol) {String sub = "/unsub/" + symbol;if (!TRADE_DETAIL_MAP.containsKey(symbol)) {return;}TRADE_DETAIL_MAP.remove(symbol);aliyunClient.send(sub);}public void handleData(String message) {try {数据处理//}} catch (Exception e) {logger.error(e.getMessage(), e);}} }
public interface IExchangeService {void start();void stop();void sub(String symbol);void unsub(String symbol); }
盈透数据获取实时K线与坑点相关推荐
- 微交易平台搭建开发-盘内实时K线对接
微盘,微交易系统是一个有争议的系统,为什么这么说呢,因为有玩家被割了韭菜,有玩家被杀了猪,这是因为遇到了不法运营者.今天我们暂且不论运营问题,单从技术的角度讨论一下微交易系统K线的对接. 微交易盘有时 ...
- Python笔记11-基于VN.py的实时K线生成器
from vnpy.trader.vtObject import VtBarData from datetime import timedelta import pymongo from queue ...
- CTP程序化交易入门系列之三:获取实时行情及k线合成
前面两篇有了基础知识的准备,这一篇讲通过CTP API获取实时行情,录入csv,实时合成k线.github上开源了录入csv及合成k线代码,后台回复pyctp可获取.先上两张效果图: 图1 csv数据 ...
- 用Python绘制专业的K线图【含源代码】
使用Python绘制一幅专业的K线图,是量化投资和金融数据分析的必备功课. 下面我将从K线图简介.数据获取.K线图绘制及成交量绘制等方面,结合源代码,一步步实现专业K线图的绘制. K线图简介 K线图又 ...
- Python获取股票数据并绘制相应K线图,看这个就够了!
Python对股票的K线可视化 前言 说明 注意 数据获取 Tushare获取股票数据 获取医疗器械板块数据(代码部分) 获取股票数据(代码部分) 数据预处理 变量中文化(代码部分) K线绘制 代码部 ...
- C++连接CTP接口实现简单量化交易(行情、交易、k线、策略)
对于量化交易来说,量化策略和技术系统缺一不可,为了知其所以然,本文实现了一个C++连接CTP接口进行仿真交易的demo,从接收行情.下订单.数据处理到添加策略.挂载运行交易等多个环节来看一下量化交易的 ...
- PHP实现量化交易,量化交易干货丨如何使用DolphinDB计算K线
DolphinDB提供了功能强大的内存计算引擎,内置时间序列函数,分布式计算以及流数据处理引擎,在众多场景下均可高效的计算K线.本教程将介绍DolphinDB如何通过批量处理和流式处理计算K线.历史数 ...
- 干货丨如何使用DolphinDB计算K线
DolphinDB提供了功能强大的内存计算引擎,内置时间序列函数,分布式计算以及流数据处理引擎,在众多场景下均可高效的计算K线.本教程将介绍DolphinDB如何通过批量处理和流式处理计算K线. 历史 ...
- 量化干货丨如何使用DolphinDB计算K线
DolphinDB提供了功能强大的内存计算引擎,内置时间序列函数,分布式计算以及流数据处理引擎,在众多场景下均可高效的计算K线.本教程将介绍DolphinDB如何通过批量处理和流式处理计算K线. 历史 ...
最新文章
- 新国立尤洋:夸父AI——用于大规模并行训练的统一深度学习系统
- 【SSH项目实战】国税协同平台-26.分页功能编写
- ORACEL游标的使用实例
- 菜鸟学习物联网---辨析基于Andriod 5.1,Linux,Windows10开发Dragon Board 410c板
- 用闭包的写法弹出元素的索引值
- endless admin_一次中国之旅如何激发Endless OS并教孩子们黑客
- 修改linux服务器时间
- 如何添加二级标题_怎样给Word文档添加目录?
- 用图形工具管理Server Core上的账号和组图文教程
- Python 父与子的编程之旅 第七章答案
- 【Qt】x509证书操作之获取证书链并验证
- 2021年了,还有人认为视觉导航不如激光导航
- 2018c与语言程序设计形成性考核册,最新版中央广播电视大学C语言程序设计形成性考核册及答案.docx...
- (六十五)Android O StartService的 anr timeout 流程分析
- 二阶求导 算法 实现 寻峰问题(转)
- 众安在线2019年净亏损4.5亿,消金保费收入降12%,赔付率升至97%
- win10下手机投影到电脑及第二屏幕
- 4、配置虚拟局域网技术
- MATLAB计算K近邻
- java 遍历删除list_Java list利用遍历进行删除操作3种方法解析
热门文章
- da转化输出不同波形8086和DAC0832的Proteus仿真
- 《大数据时代的统计学思维》读后感
- 查询已激活车辆的车架号和iccid
- 斜滑块斜导柱计算公式_如何计算模具斜导柱长度
- bmp图片格式及读取
- 立春后赏雾凇最佳去处
- python实现excel搜索_从几百个Excel中查找数据,用Python一分钟搞定
- Elasticsearch-7.x学习笔记
- Oracle数据库齿轮变灰色,重明鸟灰色齿轮地区怎么过关_灰色齿轮地区通关攻略分享_3DM单机...
- 通信专科生,出路在哪里?