未必孤独网 > 如何学习盈透 api 的开发?

如何学习盈透 api 的开发?

你好,我想学习盈透api的开发,从而实现自动化交易。关于编程本人只有过matlab编程和mql语言的一点经验,对盈透api开发一无所知,网上的资源很少 大多是官网tws的使用手册,看不很懂,对api开发是怎么一回事还不是很了解。能不能解释一下 什么是盈透api的开发 ?盈透api的开发过程是怎么样的?我该怎么学习盈透api的开发,并成功实现程序化交易,学习过程中有没有相关的书籍参考?有没有盈透api开发的源代码让我参考?谢谢谢谢

【用python的交易员的回答(109票)】:

2016-9-4: 挖坑

2016-10-03 19:01:更新问答

2016-10-03 20:39:让更多人看到,修改了下问题的话题范围,希望题主不介意

2016-10-10 12:36:上知乎推荐了,补充一些代码相关的内容

谢邀,前段时间开发vn.ib的接口封装花了挺久研究ib接口的底层细节,这个问题先留个名,后面来细答。

为啥IB API这么火?

这段纯属个人的一些瞎BB,没兴趣的可以跳过,2008年刚进大学的时候就听说过了Interactive Brokers的大名(当时对量化还是一窍不通),和曾经一度热火但是现在几乎已经淡出主流量化圈的MT4平台不同,IB API的用户数量和相关的项目数量都是有增无减:

AlgoTrader:应该算是对接IB的最有名的开源量化交易平台,使用CEP作为核心策略引擎,主要应用领域是极为复杂的交易策略(比如全自动的Volatility Arbitrage)

Glean(过去的tradelink):使用图形化的方式来开发策略,同样对接IB实现量化交易,偏向于速度较快的日内交易策略

Matlab Trading Toolbox:Mathworks官方提供的量化交易工具

Quantopian:当下最火的在线量化交易平台,最近支持了实盘交易,也是首先选择对接了IB

究其原因,IB API能成为许多量化平台的首选对接通道,不外乎一个原因:Created by traders, for traders。 公司创始人Thomas Peterffy的传奇背景就不多介绍了,关键在于IB背后的高频交易公司TimberHill,有这么一家市场上顶尖的玩家在为公司经纪相关的业务提供建议和各种技术支持,IB才可能同时给客户提供:

  • 提供强到变态的交易平台TWS

  • 多到变态的全球产品覆盖

  • 低到变态的交易费用

以上三点能做得比IB好的不能说没有,但是三点同时都能和IB竞争的似乎就不多见了:

  • 高盛之类的投行太过高大上,不够亲民

  • E*Trade之类的零售经纪商,费用较贵的同时,交易软件的功能还十分有限
  • FXCM之类的外汇公司,经常留点头寸不对冲跟客户对赌,点差还特别高
所以综合来看,其实IB成功的原因和其他行业成功的公司也没多大区别,能够抓住客户的痛点并且长期提供高质来那个的服务才是关键。

背景介绍

时隔一个月终于有时间来填坑了。

IB API的开发是一个非常大的话题,尽管如此看到这个问题时立马决定无论如何要给出一个比较全面的回答,简单做一些背景介绍吧(一段痛苦的折腾经历)。

问题1的答案: API是由Interactive Brokers为了量化交易推出的一套交易接口,结合IB广泛的市场覆盖,使用IB API的用户可以轻松实现全球市场的量化交易,也是世界上应用最广泛的量化交易接口之一(或许这里都没必要说“之一”)

本人目前在开发vn.py项目中的IB API的Python封装接口vn.ib,目的是为了替代之前使用的IbPy项目。IbPy已经若干年没有更新了,且因为其纯Python实现的关系很多地方存在设计不合理的情况(比如底层socket触发异常就直接断开,不抛出任何错误或者异常)。

vn.ib选择基于IB官方推出的最新9.72 C++ API来开发,和vn.py框架中的其他接口一样使用boost.python封装的形式,以提供更好的稳定性和远胜IbPy的性能。在开发过程中掉坑无数,花了大约两周的时间才勉强把程序给跑通起来,所以大家如果在具体开发过程中遇到什么问题欢迎提问,大概率我之前也遇到过了。

IB API的特点

尽管都交交易接口,但是IB API和国内常见的接口(CTP类,恒生等)有着诸多不同,先来介绍几个比较关键的点:

  1. 使用IB API连接上的不是IB的交易服务器,而是运行于本机的TWS(带图形的交易平台)或者IB Gateway(只提供简单日志的交易路由,适合量化),即使对于FIX接口也是如此

    (IB网关,由于没有复杂的图形界面,能够提供比TWS更高的交易性能)(IB网关,由于没有复杂的图形界面,能够提供比TWS更高的交易性能)

  2. IB API提供了所有的底层源代码,用户在使用时需要自行编译底层API接口部分的组件,提供了一定灵活性的同时,也导致项目开发过程中容易遇到额外的编译问题

  3. IB API内建了一个比较大的内存缓冲区,回调函数即使阻塞一段时间也基本不会导致API崩溃,所以CTP类API开发时常用的一个回调函数推送的数据必须先进缓冲队列的设计模式就没有必要了,可以把一些可能耗时较长的逻辑直接写在回调函数中(出于程序代码架构的原因仍然不建议这么做,不过对于API封装来说省了很大的力气)

  4. 最大的坑:IB API里回调函数(负责向用户的程序中推送数据)的工作线程需要用户自行创建和管理(国内几乎所有的API都是内部实现的),提供了极大的灵活性(比如用户可以使用类似协程的模式轻松实现一个线程同时管理8个API连接的推送),但是由于官方文档和Demo的缺失导致用户一上来几乎不知道怎么去写这个线程!!!只能靠一步步试错的方式折腾,无比浪费时间。

使用IB API的开发流程(问题2的答案)

这里的内容针对使用Visual Studio开发C++接口,其他语言的大同小异:

  1. 从这里http://interactivebrokers.github.io下载最新的IB API,选择9.72 beta(比起9.71有了很大的改进,比如取消了Win32 C++ 接口,统一提供POSIX标准的C++接口)
  2. 安装后,进入TWS API文件夹下的source/CppClient, 把ssl lib client三个文件夹统一复制到你自己项目的文件夹中
  3. 把client文件夹下的.h和.cpp文件添加到你自己的Visual Studio项目中
  4. 在C++项目配置中的Preprocessor中添加_CRT_SECURE_NO_DEPRECATE和_WINSOCK_DEPRECATED_NO_WARNINGS,否则编译时会触发警告
  5. 在项目的General配置中,把Character Set设置为Use Multi-Byte Character Set,这里有可能报错,或者编译时报这个Character Set错误,提示用户需要安装一个补丁包,去Microsoft官网搜索后下载安装就行
  6. 后面就可以写自己程序的代码了,如果你不幸遇到各种问题,欢迎在评论里提问......

IB API的结构简介(问题3的答案)

据我所知目前市面上是没有关于IB API的开发书籍的,最好的参考资料就是官方的Reference Guide:TWS API v9.72: Trader Workstation API

这里简单介绍一下IB API的结构:

  • EWrapper:类似CTP中的SPI类,提供回调函数
  • EClientSocket:类似CTP中的API类,提供主动函数
  • EReaderOSSignal:一个信号量,回调函数管理线程需要监听该信号量,当socket收到数据后该信号量会被触发
  • EReader:当上面的信号量被触发后,用户需要调用EReader中的处理信息函数,来触发EWrapper中对应的回调函数

结构后是一个API的大体工作顺序:

  1. 继承EWrapper并实现回调函数

    //步骤1class IbWrapper : public EWrapper{private:VnIbApi *api;public:IbWrapper(VnIbApi *api){this-api = api;};~IbWrapper(){};void tickPrice(TickerId tickerId, TickType field, double price, int canAutoExecute);......

  2. 创建EWrapper对象wrapper
  3. 创建EReaderOSSignal对象signal
  4. 创建EClientSocket对象client,传入wrapper和client的对象指针作为构造参数

    //步骤2、3、4class VnIbApi{private://EClientSocket *client;IbWrapper *wrapper;EReaderOSSignal signal;EReader *reader;thread *worker;public:EClientSocket *client;VnIbApi(){this-signal = EReaderOSSignal();this-wrapper = new IbWrapper(this);this-client = new EClientSocket(this-wrapper, this-signal);};......

  5. 调用client的eConnect方法,连接TWS程序
  6. 连接成功后,创建EReader对象reader,传入client和signal的对象指针作为构造函数
  7. 调用reader的start方法,启动reader中的socket端口数据监听线程

    //步骤5、6、7bool VnIbApi::eConnect(string host, int port, int clientId, bool extraAuth){bool r = this-client-eConnect(host.c_str(), port, clientId, extraAuth);if (r){//启动EReader从socket读取信息this-reader = new EReader(this-client, this-signal);this-reader-start();//启动数据推送线程function0void f = boost::bind(VnIbApi::run, this);thread t(f);this-worker = t;};return r;};

  8. 启动回调函数管理线程,进入无限循环,首先调用signal的waitForSignal等待信号的触发
  9. socket收到数据后,信号被触发,调用reader的processMsgs函数,激发wrapper中对应的回调函数

    //步骤8、9void VnIbApi::run(){while (this-client-isConnected()){this-reader-checkClient();signal.waitForSignal();this-reader-processMsgs();}};

  10. 用户可以调用client中的主动函数来实现其他的工作任务

    //步骤10void IbWrapper::nextValidId(OrderId orderId){PyLock lock;this-api-nextValidId(orderId);};

IB API的参考源代码(问题4的答案)

我这里主要介绍下Github上IB相关的一些项目吧:

  1. GitHub - blampe/IbPy: Python API for the Interactive Brokers on-line trading system., 著名的IbPy接口,欧美很多关于IB开发交易策略的文章都使用IbPy,但是问题上面也提过了

  2. GitHub - jamesmawm/High-Frequency-Trading-Model-with-IB: A high-frequency trading model using Interactive Brokers API with pairs and mean-reversion in Python, 一个关于使用IB实现高频交易模型的项目,策略本身只是展示目的,没有实际应用个价值,使用IbPy作为交易接口

  3. GitHub - Komnomnomnom/swigibpy: Third party Interactive Brokers Python API generated from TWS C++ API using SWIG.,使用SWIG开发的IB API的Python封装

  4. GitHub - JanBoonen/TwsApiCpp: Improved TWS API POSIX C++ library for the Interactive Brokers (IB) TWS (same project as TwsApiC++ in Yahoo TWSAPI).,这个项目改进了官方提供的C++ API代码,号称是降低了开发难度,同时提供更高的并发性能

  5. github.com/jamesmawm/IB,对于2中的策略模型的改进版
  6. GitHub - brotchie/ib-zmq: Interactive Brokers API to ZeroMQ proxy,把IB API和ZMQ进行对接实现了一个消息代理,用户可以直接使用ZMQ来进行交易
  7. vnpy/vn.ib at dev · vnpy/vnpy · GitHub,本人开发的vn.ib接口,目前尚未完成,不过自认代码质量还过得去,同时以上回答中提到的内容都基于该代码

  8. Trading with Interactive Brokers using Python,一个同样基于IB官方的C++接口做的Python封装项目,提供了和Quantopian兼容的策略开发API,但是github上的仓库里没有底层的封装代码,猜测可能作者是想做商业项目?

暂时想到的就是以上内容,还是回到开始的一句话;IB接口的开发是个非常大的话题,但是如果能掌握,基本国内大部分接口的开发也都没什么问题了。有问题欢迎在评论里提问,本答案预计后续还会有很多内容上的更新,欢迎关注吧。

【许哲的回答(214票)】:

Update:解释起来太复杂,搞点封装 盈透API的一个极简单SDK - 许哲的文章 - 知乎专栏

谢邀。

这就是我天天在干的活,让盈透TWS里的市场数据放到Matlab写的函数里,然后跑出结果来后扔到TWS里做交易,并且在数据库里留个底。

首先你得选择一个语言SDK,有些是官方的,有些是开发者自己写的。这个主要看你自己熟悉哪门语言。

在官网的介绍里有罗列官方的实现版本IB API | Interactive Brokers

这里不推荐ActiveX和DDE两种,性能上比较弱。ActiveX 不谈了,这个主要用于一些特殊场合,就算要在你的网站上嵌入盈透相关的东西,我认为也完全没必要,且不说ActiveX插件经常被禁掉,这类应用场景完全可以用其他牢靠技术实现。DDE主要用来在Excel 表格里插入不断变化的价格数据,期权希腊值,债券收益率等等,用于公式做头寸计算,报表自动生成,也不推荐,非常容易出错。如果工作非得要以Excel的形式输出,我依然推荐使用.NET接口对接盈透,并且用.NET框架里的Excel组件。

如果你不是非要在非Windows环境下工作的话,我推荐你使用C#作为主语言。如果你非得在非windows环境下的话,推荐使用Java。当然,如果你有特别心仪的语言,比如上面有位朋友本命语言Python,你就选自己最喜欢的语言。

盈透的软件基本上是全Java的,C++和C#的实现风格也非常Java,对于Java程序员而言,非常好上手。性能上,如今CLR和JVM都足够足够了。

与Matlab的桥接,也推荐用官方的SDK过一道。我用的方式是C# SDK读取盈透TWS上的数据,然后用MathWorks提供的COM+插件C#代码直接操作Matlab,这样子做是最好的。而不要用Matlab直接和TWS硬接,调试起来很会痛苦,这都是血的教训。有VS和没VS完全是两个工种。

这个是MathWorks 官方的C#操作Matlab 接口的使用办法。

cn.mathworks.com/help/m

官方文档里没用到,但其实最爽的是可以直接在C#里执行Matlab命令。

添加组件:

MLApp.MLApp matlab = new MLApp.MLApp();// Change to the directory where the function is located matlab.Execute($"cd {txtMatlabPath.Text}");

把C#程序内存里的数据,导入到Matlab里,和Matlab函数执行结果读回来超容易。Matlab的矩阵可以和double数组无缝切换。

double[,] pr = new double[60, 8];double[,] pi = new double[60, 8];for (int i = 0; i 60; i++) for (int j = 0; j 8; j++) { pr[i, j] = Convert.ToDouble(dgv.Rows[i].Cells[j + 2].Value); pi[i, j] = 0; }matlab.PutFullMatrix("input", "base", pr, pi);

一个PutFullMatrix 就OK了,base是Matlab里WorkSpace的名字。值得注意的是,放的数组是复数的,也就是一定要有虚数部分。如果你的应用里没有用到复数,都只是实数的话,虚数部分全部填0(也就是我上面那种做法)就OK了。

读取结果

matlab.Execute($"[F]=FuncName(input....)");double[,] res_martix = matlab.GetVariable("F", "base");

结果放回一个double数组里,就好像调用一个本地的函数一样简单。Execute方法基本上是万能的,就好比嵌入了个Matlab的REPL一样。

其他语言和Matlab的混合编程参考:

cn.mathworks.com/help/m

C++,Java,Python 等等都有。C++,Java,Python 等等都有。

原则是:有官方的SDK用官方的,少自己造轮子。等实现完全没问题了,用得滚瓜烂熟了,再想着自己造轮子。

下载地址:Interactive Brokers

Linux用户不用教,自觉选右边的。大家Linux用户不用教,自觉选右边的。大家不要去下载Beta版,我遇到过几次坑,就是Beta里面的Bug。这玩意的Bug,那真是分分钟钟几百万上下不开玩笑。代码都在Github上,造轮子特别溜得可以去贡献贡献,说不定哪个金融巨鳄土豪受益了,一开心,赏你个小目标什么的。

与盈透TWS的对接有点复杂,文档在TWS API v9.72: Trader Workstation API这里,确实不是很友好。特别是题主如果是从mql转过来的话,适应会比较难。

但这依然是最重要的参考资料,好比盈透API开发的MSDN,完成度当然和MSDN差得不是一个等量级了。你们看看哪个圈最大,明显是C#对吧,大家就明白哪个最完整啦。但这依然是最重要的参考资料,好比盈透API开发的MSDN,完成度当然和MSDN差得不是一个等量级了。你们看看哪个圈最大,明显是C#对吧,大家就明白哪个最完整啦。

TWS API v9.72: Initial Setup 开始盈透API开发前,先把安装设置部分的看清楚。这些看清楚了之后再开始操作。接下来我讲讲整个框架的逻辑,和MT4/MT5这类玩具是完全不一样的。

我还是拿我自己用的C#做例子,下载SDK后,有两个官方完整的Demo,我建议学习者从例子开始着手,结合文档来学。一个例子简单,一个例子复杂。简单的那个例子叫做IBSamples。

上面的CSharpAPI是API的工程,这个部分没事不要去修改它,下面那个IBSamples是一个最简单的例子。

整个盈透API写的应用可以看作是对EWrapper接口的一个实现。你可以不精确得理解为,这个是TWS给你的程序的一个输出窗口。

而你对TWS的输入窗口,则要通过创建一个EClientSocket类的对象来实现。而你对TWS的输入窗口,则要通过创建一个EClientSocket类的对象来实现。

如果不是很明白的话,不精确的认为一个是向TWS发布请求,一个从TWS那里接受消息就可以了。如果不是很明白的话,不精确的认为一个是向TWS发布请求,一个从TWS那里接受消息就可以了。

我们看官方的例子里 EWrapperImpl.cs 文件,就是一个对EWrapper接口非常基本的实现。

你可以以后慢慢去体会这个结构的设计模式,暂时咱们先用官方的实现用着。我们回到Main函数。你可以以后慢慢去体会这个结构的设计模式,暂时咱们先用官方的实现用着。我们回到Main函数。

有了基本的实现后,我们新建一个对象然后使用对象里的ClienSocket成员的方法,让C#程序连接上TWS,方法名字是eConnect。具体的参考在有了基本的实现后,我们新建一个对象然后使用对象里的ClienSocket成员的方法,让C#程序连接上TWS,方法名字是eConnect。具体的参考在TWS API v9.72: EClientSocket Class Reference

这是我推荐的学习方式,一边看事例代码,一边看参考。当然我们有VS的话,也可以F12一下。反正代码都就在同一个解决方案里。这是我推荐的学习方式,一边看事例代码,一边看参考。当然我们有VS的话,也可以F12一下。反正代码都就在同一个解决方案里。

下面的先不管他,他们先运行一下连接部分。这里要注意的是,默认的实盘TWS接口是7496,而模拟盘的默认接口是7497。我现在开一个TWS的模拟账户,并且运行该程序的结果是:

程序去尝试连接127.0.0.1地址上的7496端口,而模拟账户开的是7497端口。所以我们是返回一个错误。而这个错误的输出内容程序去尝试连接127.0.0.1地址上的7496端口,而模拟账户开的是7497端口。所以我们是返回一个错误。而这个错误的输出内容

Exception throw:System.Net..... 不是系统默认的,是自己定义的。

public virtual void error(Exception e){ Console.WriteLine("Exception thrown: "+e); throw e;}

就是刚刚说的那个EWrapperImpl.cs文件里,对于错误的实现。发生错误了,就会调用这个接口里处理错误的实现方法。

也就是说,这个EWrapperImpl的实现里的种种方法,你可以当作是mql语言里的一个个事件。这个public virtual void error(Exception e)可以理解为 OnError()。

那我们再来看几个实现。

public virtual void tickPrice(int tickerId, int field, double price, int canAutoExecute) { Console.WriteLine("Tick Price. Ticker Id:"+tickerId+", Field: "+field+", Price: "+price+", CanAutoExecute: "+canAutoExecute+"");}

这个实现的意思是,当价格变动的时候,tikerId是资产的编号,field是Ask还是Bid或者是深度数据,price是价格,后面是能否自动执行的标志位。

这个相当于题主熟悉是mql里的OnTick()事件。

这里的实现只是简单的输出里一下。

ublic virtual void updatePortfolio(Contract contract, int position, double marketPrice, double marketValue, double averageCost, double unrealisedPNL, double realisedPNL, string accountName){ Console.WriteLine("UpdatePortfolio. "+contract.Symbol+", "+contract.SecType+" @ "+contract.Exchange +": Position: "+position+", MarketPrice: "+marketPrice+", MarketValue: "+marketValue+", AverageCost: "+averageCost +", UnrealisedPNL: "+unrealisedPNL+", RealisedPNL: "+realisedPNL+", AccountName: "+accountName+"");}

这个是当检查头寸命令发出后的回应,哪些个合约现在仓位多少,市场价多少,市值多少,建仓平均价多少,浮亏浮盈多少,已经实现的盈亏多少,哪个账号。

可以粗浅类比成 OnTrade() 事件。

我们把端口号改成模拟账户的7497,返回的结果:

返回了TWS时间等等,这些就表明我们的程序和TWS连接上了。返回了TWS时间等等,这些就表明我们的程序和TWS连接上了。

连接上后,我们要做的第一件事情是获取行情数据,所有的事情都是在有行情的基础上做的。代理里有丰富的例子,就下下面testIBMethods里,几乎囊括了所有功能。

这个在main函数里也调用过了,所有都被注释掉了,慢慢解掉注释,我们就能感受一个个功能怎么写的了。这个在main函数里也调用过了,所有都被注释掉了,慢慢解掉注释,我们就能感受一个个功能怎么写的了。

比如我们把这两行代码解除注释。比如我们把这两行代码解除注释。

wrapper.ClientSocket.reqMarketDataType(2);wrapper.ClientSocket.reqMktData(1001, ContractSamples.getEurUsdForex(), "", false, GetFakeParameters(3));

意思是我们要请求获取一个市场数据,第二个参数是要获取哪个合约,这里返回的合约是 ContractSamples.getEurUsdForex(),是一个EURUSD即期汇率的合约。

public static Contract getEurUsdForex(){ Contract contract = new Contract(); contract.Symbol = "EUR"; contract.SecType = "CASH"; contract.Currency = "USD"; //we can also give the conId instead of the whole description //but we still need the exchange though contract.ConId = 12087792; contract.Exchange = "IDEALPRO"; return contract;}

Contract 类是用来描述一个合约的,这里的细节先不讨论,总之这列返回了一个EURUSD的即期汇率合约的Contract对象,交给reqMktData方法来发送给TWS。我们来看看解注掉这两行后的结果。

这里的结果事实上,是触发了两个实现的方法。一个是 tickPrice,另外一个是tickSize

public virtual void tickPrice(int tickerId, int field, double price, int canAutoExecute) { Console.WriteLine("Tick Price. Ticker Id:"+tickerId+", Field: "+field+", Price: "+price+", CanAutoExecute: "+canAutoExecute+"");}

这个方法上面介绍过,就是价格变化时会发生的,输出前缀是。这里的输出:

Tick Price.Ticker Id:1001,Field:2,Price:1.11624,CanAutoExecute:1

的意思是,Ticker Id编号为1001(我们解注的代码的第二行里自己定义的)的资产的Field为2的价格(等效于Ask)为 1.11624。也就是意味着那一瞬间,EURUSD的Ask报价是 1.11624。彼时Bid没动的话,Field:1的就不更新。

TickSize. Ticker Id:1001,Field:0,Size:3000000

这条输出是因为触发了方法 tickSize方法

public virtual void tickSize(int tickerId, int field, int size){ Console.WriteLine("Tick Size. Ticker Id:" + tickerId + ", Field: " + field + ", Size: " + size+"");}

意味着那一个瞬间,EURUSD 这一层的可交易对手量是3000000美元,超过这个的话,就会滑点了。

这些信息会不断得刷屏,因为EURUSD是非常活跃的品种,市场深度和容量结构一致在变化的。

相当于TWS上这个界面(Book Trader)里的信息的输出。

这一个简单的小例子,涵盖了整个SDK的运行逻辑。用EClienSocket类的方法去向TWS提出要求,比如 reqMarketData 就是要求一个合约的市场数据。

TWS 应该有的回应会调用那个EWrapper接口里你实现的方法。所以学习的方法是,将下面那些注释掉的内容解注掉后多看看,然后那个EWrapperImpl里的实现多看看,逻辑都是一样的。

(未完待续)

不用原生库慢慢解释了,还是封装好再说吧: 盈透API的一个极简单SDK - 许哲的文章 - 知乎专栏

【菠菜philsong的回答(3票)】:

大约1年前一个朋友在搞盈透,让我看下搞个黄金白银的套利,我当时看的是官方C++的demo,代码各种烂。

前几天放假,正好又说他搞的C#demo越跑与慢(必然是bug),让我帮忙看下Java怎么搞。我最近估计会抽出时间研究下这块,大家可以一起讨论:)

人生苦短,我用Java.

API:Interactive Brokers

9.72beta document:TWS API v9.72: Trader Workstation API 文档很短,没什么卵用。

刚刚上传了一个Java samples,在官方版本上修复一些错误:GitHub - philsong/ibjts

中文文档,这个看了下很有用:https://github.com/philsong/ibjts/blob/master/APIprintable_CN.pdf

10.2号申请注册了个号,让我提交住宅证明,暂时还没通过(然而就收到北京3个电话说相关方推送她们说我最近股票开户,给我推荐股票,我怀疑盈透透露了我注册手机,没想到啊,国际大券商啊!!!)

代码解析:

com.ib.client的是对ib协议的核心封装

com.ib.contracts只是继承com.ib.client.Contract实现的几个具体类

com.ib.controller只是对com.ib.client中EWrapper的一层封装实现。

sample分析:

TestJavaClient直接调用com.ib.client,加上GUI进行测试。

apidemo用了com.ib.controller, 然后加上GUI进行测试。

samples直接调用com.ib.client且没有涉及GUI部分。

总体来说,代码很简单,我从10.2号看了两个晚上基本上明白就那么回事了。剩余的就是熟悉下业务的逻辑,重点就是搞策略了,比如抓下数据用stata搞个高大尚的统计套利:)

package com.ib.client,其包含以下classes:

EWrapper

该接口负责从TWS接收信息。

ComboLeg

该class包含用于描述组合边的属性。

Contract

该class包括用于描述合约的属性。

ContractDetails

该class包括用于描述合约详细的属性,包括债券详细。

EClientSocket

该class负责向TWS发送信息。

Execution

该class包含用于描述交易的属性。

ExecutionFilter

该class包含用于描述执行过滤器条件的属性。

Order

该class包含用于描述定单的属性

OrderState

该class包含用于描述定单状态的属性。

ScannerSubscription

该class包含用于描述市场扫描元素的属性。

TickType

该class定义通用跳动类型和其跳动值

使用Java API连接TWS

1. 将com.ib.client.*输入到您的源代码文件。

2. 实施EWrapper接口。这个class将从插口接收信息。

3. 取代下列方法:

Ewrapper方法

tickPrice()

tickSize()

tickOptionComputation()

tickGeneric()

tickString()

tickEFP()

处理市场数据。

orderStatus()

接收定单状态。

openOrder()

接收开放定单。

error()

接收出错信息。

connectionClosed()

在TWS终止连接时发出通知。

updateAccountValue()

接收当前账户值。

updateAccountTime()

接收最后一次账户更新信息。

updatePortfolio()

接收当前投资组合信息。

nextValidId()

接收连接时的下一个有效定单代号。

contractDetails()

接收合约信息。

contractDetailsEnd()

确认一个给定合约细节请求的结束。

bondContractDetails()

接收债券合约信息。

exectDetails()

接收执行报告信息。

updateMktDepth()

接收市场深度信息。

updateMktDepthL2()

接收二级市场深度信息。

updateNewsBulletin()

接收IB新闻公告。

managedAccounts()

接收金融顾问(FA)管理的账户列表。

receiveFA()

接收FA配置信息。

historicalData()

接收历史数据结果。

scannerParameters()

接收描述扫描仪订阅的有效参数的XML文件。

scannerData()

接收市场扫描仪结果。

realTimeBar()

接收实时柱。

currentTime()

接收服务器的当前系统时间。

fundamentalData()

接收路透社全球基本面市场数据。

4. 实例EClientSocket class。该对象将被用于发送信息到TWS。

5. 调用下列方法:

EClientSocket方法

eConnect()

连接TWS。

eDisconnect()

断开TWS。

reqMktData()

请求市场数据。

cancelMktData()

取消市场数据。

reqMktDepth()

请求市场深度。

cancelMktDepth()

取消市场深度。

reqContractDetails()

请求合约详细。

placeOrder()

下达定单。

cancelOrder()

取消定单。

reqAccountUpdates()

请求账户值、投资组合、和账户更新时间信息。

reqExecutions()

请求日执行报告列表。

reqOpenOrders()

请求关于请求客户的当前开放定单列表和将TWS开发定单与客户相连。 相连仅在请求客户的客户代号为0时发生。

reqAllOpenOrders()

请求所有开放定单的列表。

reqAutoOpenOrders()

自动将新的TWS运作与客户相连。 相连仅在请求客户的客户代号为0时发生。

reqNewsBulletin()

请求IB新闻公告。

cancelNewsBulletins()

取消IB新闻公告。

setServerLogLevel()

设置API请求和处理记录的级别。

reqManagedAccts()

请求金融顾问(FA)管理的账户编码列表。

requestFA()

请求TWS的FA配置信息。

replaceFA()

修改API的FA配置信息。

reqScannerParameters()

请求描述扫描仪订阅有效参数的XML文件。

reqScannerSubscription()

请求市场扫描仪结果。

cancelScannerSubscription()

取消扫描仪订阅。

reqHistoricalData()

请求历史数据。

cancelHistoricalData()

取消历史数据。

reqRealTimeBars()

请求实时柱。

cancelRealTimeBars()

取消实时柱。

exerciseOptions()

行使期权。

reqCurrentTime()

请求当前服务器时间。

serverV ersion()

反馈API应用程序连接的TWS实例的版本。

TwsConnectionTime()

反馈API应用程序连接到TWS的时间

reqFundamentalData()

请求路透社全球基本面数据。 必须通过账户管理订阅路透社基本面才可以接收数据。

cancelFundamentalData()

取消路透社全球基本面数据。

可以认为samples文件夹中的testbed是入门最佳之选。他演示实现了EWrapper接口 ,如EWrapperImpl,基本看懂这个就可以跑自动化程序了。至于程序化,分享一个我内部培训的文档 pan.baidu.com/s/1hr909w

本人程序狗野路子,没去过什么银行证券,策略都是实战总结的,大家笑笑就好,要是赐教下就更好了

apidemo昨晚跑起来,待续。。。

【明达的回答(7票)】:

IB自带Java, C++, C#的API, 此处有reference: interactivebrokers.com/

第三方Python的库IbPy,其实就是是Java API的wrapper,也就是说function signature可以基本参照上面的链接,GitHub - blampe/IbPy: Python API for the Interactive Brokers on-line trading system.

如何用IbPy下单:Using Python, IBPy and the Interactive Brokers API to Automate Trades

如何用IbPy调取历史数据:GitHub - busygin/ib_data_loader: A python script to download daily futures market data from Interactive Brokers using IbPy

然而IbPy下历史数据也有诸多limitations,某些很严格某些似乎不存在:interactivebrokers.com/

交易系统:实时历史数据 - 分析并产生买卖信号 - 下单,就这么简单,不需要太复杂的封装。

研究框架:长期历史数据 - 提取优质信号 - 设计策略 - 回测

目前本人正在搭建交易系统(下载历史数据,测试交易信号,向量化+事件驱动回测系统)一条龙,已经完成80%。如果对这方面感兴趣,有IB的账户,有较好的Python编程经验,有空余时间,或者有成功手动交易经验,欢迎私信并一起折腾。目前本人正在搭建交易系统(下载历史数据,测试交易信号,向量化+事件驱动回测系统)一条龙,已经完成80%。如果对这方面感兴趣,有IB的账户,有较好的Python编程经验,有空余时间,或者有成功手动交易经验,欢迎私信并一起折腾。

【鲁塔弗的回答(2票)】:

何必这样麻烦,不要浪费时间在通道上,策略本身更重要

mulitcharts,amibroker 都可以连接ib交易

【mousewu的回答(0票)】:

介绍一个直接用Matlab连IB的接口IB4m,GitHub - softwarespartan/IB4m: Interactive Brokers API for Matlab , 对只熟悉Matlab的量化小白是个不错的工具。作者已经将底层API用Java封装好,只需要用Matlab调用即可。里面可以实现一些基本的操作,比账户信息查询,委托单查询,市场数据获取,下单等。里面也提供了事件驱动模块,应该能够实现一些简单的程序化交易,不过稳定性如何还有待测试。

【永远的乌托帮的回答(0票)】:

很想知道IB的订单有没有和MT4的magic number类似的东西,可以用来区分订单?

【Ramon的回答(0票)】:

api的使用参考例程,业务不明白的地方问在线客服。

【金王的回答(0票)】:

ibkr有手册和例程的,例如c和java

【繁华落尽的回答(0票)】:

留名

新闻聚焦
热门推荐
  • 内牛满面!政府大院里的超囧一幕,惊了

    走到乡政府办公大楼门口,突见台阶上有一物非常扎眼。这是神马东西?顿时让人浮想联翩,不由地怀疑自己走错地方了。可是没错啊!这里确实是乡政府办公大楼......

    01-12 来源:未知

    分享
  • 《天天有喜2之人间有爱》刘四喜扮演者陈浩民个人资料

    《天天有喜2之人间有爱》刘四喜扮演者陈浩民 本篇电视资讯由未必孤独网(www.vbgudu.com)独家整理,如有转载请注明出处。 近期在湖南卫视金鹰独播剧场古装神话偶像剧《天天有喜2之人间有爱》,该剧被观众称为 “减......

    01-12 来源:未知

    分享
  • 龚玥菲穿蓝色低胸内衣翩翩起舞:风情万种

    近日,3D影片《新金瓶梅》一组片场照曝光,饰演潘金莲的龚玥菲着低胸内衣起舞。而由龚玥菲演唱的新歌《寻找西门庆》正是《新金瓶梅》的主题曲。......

    01-12 来源:未知

    分享
  • 《刀光枪影》任非常扮演者何明翰个人资料及照片 何明

    《刀光枪影》任非常扮演者何明翰 本篇电视资讯由未必孤独网(www.vbgudu.com)独家整理,如有转载请注明出处。 《刀光枪影》由浙江晟喜华视文化传媒有限公司出品,张东东、孙梦飞执导,何明翰、刘恩佑、吕一等联袂主......

    01-12 来源:未知

    分享
  • 给力!实拍日本夜店的男公关工作过程

    ......

    01-12 来源:未知

    分享
  • 《烂滚夫斗烂滚妻》海报:周秀娜杜汶泽SM服抢镜

    日前周秀娜与杜汶泽为新片《烂滚夫斗烂滚妻》拍摄宣传海报,为配合戏中的角色,两人除了有正经的造型外,还穿上性感的SM服,十分抢镜。......

    01-12 来源:未知

    分享
  • 明道为什么被雪藏 霸道总裁竟落魄到在菜市场卖起了地

    王子变青蛙然我们认识啦阳光帅气的明道,从此之后他便火的一发不可收拾,提起明道,大家想到的都是小时候看的台湾偶像剧中的黄金男主角吧,只是近年来他很少出现在荧幕上了,于是有网友好奇明道为什么后来不红了?明......

    01-11 来源:

    分享
  • 女孩惨遭胁迫卖淫 被数狼扒光强拍裸照险失身令人发指

    现在的社会越来越乱拉。丧尽天良!女孩惨遭胁迫卖淫,这不是赤裸裸的逼良为娼吗?!做出这种伤天害理之事难道就不怕天打雷劈?宁夏中卫一男子为了给足浴店招揽客户,竟然在街边物色年轻貌女孩,先是掌握她们的出行规......

    01-11 来源:

    分享
  • 女童输液流血死亡 揭女童输液离奇死亡事件始末令人唏

    现在大医院看病难看病贵,所以很多人去小门诊看病,但是,现在的私人诊所医院越来越不安全了,只能去大医院看病才是最安全可靠的。近日,女童生病输液流血死亡了,但是大家怀疑是输液药水有问题的。4岁女童在私人诊......

    01-11 来源:

    分享
  • 王梓薇个人资料 清纯校花神秘男友及个人资料首袒露

    芒果卫视的一年级已经播完啦,大家对里面的学生都有怎样的印象哪?一年级大学季本周六又要跟大家见面啦,在公布出来的要跟旁听生PK的正式生里,有一个叫做王梓溦的,这个王梓溦被网友们称为最美女生。同时也被称为是......

    01-11 来源:

    分享
返回列表