IB看起来很复杂,我该如何入手?

虽然Class List很多,但是和开发者主要打交道的就三个类,EWrapper,EClientSocket,EReaderSignal。IB的代码交互方式,是一种类似于请求/映射的结构,其背后采用了一种异步方式,用户发送了请求消息至TWS或者IB Gate,然后经过处理后提交给IB的服务器或者直接提交到交易所进行处理,然后等待从IB服务器或者交易所返回信息,再推送至客户端,客户端则通过回调函数的形式,交给对应的代码进行数据处理。

这也是为什么IB的开发文档里,反复提及的延迟问题,也是为什么IB反复强调用户提交的每一个指令,应该有一个独一无二的标识符。因为这种结构决定了返回的消息不会按顺序返回,用户则需要通过ID辨识获得的数据是什么时候提交的,提交的是什么内容。

如何获取IB API

首先你需要TWS客户端:地址:https://www.interactivebrokers.com.hk/en/index.php?f=16042

而API则在这个地址:https://www.interactivebrokers.com.hk/en/index.php?f=1325

API References: http://interactivebrokers.github.io/tws-api/index.html

如果还有什么不懂,你应该看看我的上一个教程TWS开发准备工作。其他的Q&A,你可以在我的博客下面留言,有空的时候我会回复你的。

第一个简单的程序

话不多说,我们直接上第一个程序。我的程序都采用了C#,而Java/CPP/Python等程序的编写原则上是一样的。所以你可以很容易重构自己的代码,也可以参考IB给的示例编写。目前你需要与TWS交互的一共4个类,分别是:EWrapper, EClientSocket, EReaderSignal, EReader。

EWrapper,在前面已经说了,主要是用来处理各种消息的回调函数集合,所有像TWS/IB Gateway发送的消息请求,全部会使用EWrapper进行处理,所以开发属于自己的分析程序,其中一个重点就是处理EWrapper获得的各类回调数据。

EClientSocket,封装的是TCP通信协议,与TWS或IB Gateway所有的通信协议都已经被封装在了EClientSocket里。IB默认使用这个类来进行数据通信,但是如果你需要使用EClientSocketSSL,进行加密通信。

EReaderSignal,是用来获取从TWS返回的消息的,而EReader,则是用来处理消息队列的,根据IB文档描述,用于接受来自TWS的消息,并且处理相关信号的工作应该使用一个单独的后台线程进行处理。

所以,我们首先对EWrapper的抽象方法进行实例化:

    class IBWrapper : EWrapper{...}

根据提示,我们会被要求实例化一大波函数,但是一开始我们需要关心,并且需要实现的只有这么几个:

    /// 这个函数负责当客户端与TWS建立连接时使用,作用类似于消息握手public void connectAck(){if (clientSocket.AsyncEConnect)clientSocket.startApi();}/// 这个函数负责当客户端与TWS关闭连接时使用,现在我们只打印closed消息即可public void connectionClosed(){Console.WriteLine("Connection to TWS closed");}/// IB API一共需要用户实现三种不同的错误信息,分别来自.NET自身的错误,来自IB API自身的异常抛出,以及来自TWS反馈的消息/// 这个error属于IB自身异常抛出的回调处理函数public void error(Exception e){Console.WriteLine("API Error: thrown exception: {0}", e);}/// 这个error属于.net自身的错误,比如访问越界什么的public void error(string str){Console.WriteLine("Error: message: {0}", str);}/// 这个error则是TWS反馈消息的API,errorCode为-1的时候不代表着错误,而其他>0的public void error(int id, int errorCode, string errorMsg){Console.WriteLine("TWS Error: id:{0} code:{1} message:{2}", id, errorCode, errorMsg);}/// 这个API是用来接受返回的账户信息的,在建立连接的第一步时会调用这个函数public void managedAccounts(string accountsList){Console.WriteLine("Account list: " + accountsList);}/// nextValidId,根据IB描述的意思,在每一次任务下达后,都会生成一个可用的新的任务Id,因为IB的消息机制是异步的,每一个任务都用唯一的ID进行标识,并且处理,比如说你需要对不同订单下达“买入”、“卖出”命令,但是这两个命令结果返回的时间先后可能不一致,为了避免混淆,应该给这些不同的命令不同的IDpublic void nextValidId(int orderId){Console.WriteLine("Next Valid Id: " + orderId);nextOrderId = orderId;}

然后你需要准备三个变量,分别记录新的可用ID,和TWS连接的Socket,以及用于消息处理的EReaderSignal。

/// 可用的订单IDprivate int nextOrderId;/// TWS连接Socket,非SSL版private EClientSocket clientSocket;/// 消息处理类,这个不需要做太多干预private EReaderSignal signal;/// 以及对外的访问接口public int NextOrderId {get { return nextOrderId; }set { nextOrderId = value; }}/// 以及对外的访问接口public EClientSocket ClientSocket {get { return clientSocket; }set { clientSocket = value; }}/// 以及对外的访问接口public EReaderSignal Signal{get { return signal; }}

当你完成这些工作后,再创造一个构造函数,用于初始化EWrapper。

    public IBWrapper(){signal = new EReaderMonitorSignal();clientSocket = new EClientSocket(this, signal);}

我们需要准备的前期工作基本完毕,现在回到Main函数

    static void Main(){/// 创建Wrapper,并且获取创建好的clientSocket以及readerSignalIBWrapper wrapper = new IBWrapper();EClientSocket clientSocket = wrapper.ClientSocket;EReaderSignal readerSignal = wrapper.Signal;// 连接至服务器,IP地址,端口号,本客户端ID,默认为0// 关于0有什么用,我们在后面的文章里再详细说明clientSocket.eConnect("127.0.0.1", 7497, 0);// 创建一个reader,用于处理消息事件var reader = new EReader(clientSocket, readerSignal);reader.Start();// 创建后台线程,监控来自TWS的消息new Thread(() => {while (clientSocket.IsConnected()) {readerSignal.waitForSignal();reader.processMsgs();}}) { IsBackground = true }.Start();// 这一步会一直循环,直到我们获得了可用的OrderID,>0 时表示着此时开始,可以向TWS发送命名了。while (wrapper.NextOrderId <= 0) { }// 啥事也不干,就睡10sThread.Sleep(10000);// 与TWS关闭连接Console.WriteLine("Disconnecting from TWS...");clientSocket.eDisconnect();// 类似于断点,我们可以查看到代码的输出Console.ReadKey();}

成功的输出

成功以后得到的输出就是这样的,这些信息表示我们获取的信息和数据都是正常的,连接到交易所的通信也是正常的。

在下一章中,我们将在这个代码的基础上,创建一个简易的订单。

#IB TWS编程手记——01.TWS建立基础连接相关推荐

  1. #IB TWS编程手记——00.TWS API准备工作

    IB TWS是什么? IB TWS是电子券商IB的量化交易API,是开发.研究自动量化交易算法的重要工具.关注过我的朋友,可能知道之前我曾经翻译过IB API的相关文档,但是由于平日工作实在太忙,这个 ...

  2. #IB TWS编程手记——02.提交你的第一个Hello World!

    关于IB的错误码 在我们进一步深入IB的工作机理前,需要回到Wrapper中error函数,如果善用error函数提供的错误信息,将能帮助我们快速定位到错误,并且修正我们的代码. 关于IB错误Code ...

  3. PLC编程入门-01基础知识介绍

    PLC编程入门-01基础知识介绍 PLC的组成结构 PLC编程语言: PLC输入输出的特点 输入 输出 PLC的组成结构 简图 明细图 CPU:控制器和运算器本身就是CPU主要组成部分,和PC的CPU ...

  4. [小北De编程手记] : Lesson 02 - Selenium For C# 之 核心对象

    从这一篇开始,开始正式的介绍Selenium 以及相关的组件,本文的将讨论如下问题: Selenium基本的概念以及在企业化测试框架中的位置 Selenium核心对象(浏览器驱动) Web Drive ...

  5. U3D_Shader编程(第二篇:基础夯实篇)

    <U3D_Shader编程> ##<U3D_Shader编程>发布说明: ++++Shader一个高大上的领域,不管怎么样,我来了. ++++立钻哥哥从2018年开始正式对Sh ...

  6. [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式

    写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...

  7. Java 笔试强训 牛客网选择编程题 01

    一.选择 1.单选 1.1.语法: public class Test3{public static void main(String[] args) {System.out.println(100 ...

  8. Linux网络编程之套接字基础

    Linux网络编程之套接字基础 1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_ ...

  9. 【PaddlePaddle学习笔记】从零开始学习图像分类01——图像处理入门基础

    本系列文章链接 [PaddlePaddle学习笔记]从零开始学习图像分类01--图像处理入门基础 未完待续...... 目录 一.关于图像的几个基本概念 1. 像素及其坐标 2. 图像的四种基本类型 ...

最新文章

  1. 高斯用服务器能算chk文件么,教程(二十四)使用freqchk命令进行热力学校正
  2. [云炬创业基础笔记]第七张创业资源测试12
  3. java:蓝桥杯练习 分解质因数
  4. LinkCutTree 总结
  5. [Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]
  6. QQ浏览器怎么把文件添加到私密空间 怎么使用私密空间
  7. MySQL遇到的知识点
  8. GraphQL教程(三) .net core api
  9. html5游戏网页代码大全,HTML网页代码大全
  10. H.264视频压缩标准
  11. 普中科技51单片机开发板
  12. UINO优锘:竞速“元宇宙”,中国能凭借数字孪生技术突围吗?
  13. vue.js+muse-ui制作在线简历编辑
  14. Unity Recorder屏幕录制问题
  15. 21世纪新诞生的NBPL--语言与它的奠基人——SulluBouth.M.G博士
  16. 博客摘录「 2022年C语言程序设计题库习集带答案(史上最全版)」2023年5月2日
  17. Kali获取手机照片
  18. python自动化测试框架nose
  19. U盘复制文件提示错误0x80071AC3无法复制解决办法
  20. 【TUXEDO】Linux下Tuxedo安装教程

热门文章

  1. 01-夜神模拟器安装介绍
  2. 假如高考考编程。。。
  3. java浏览器内核_深入理解浏览器内核 - 概述
  4. 节省 3/4 的设计时间:14个设计神器
  5. ML\图像处理等资料汇总
  6. VCSA 7.0 重置root密码
  7. 将多个PDF文件整合成一个文件
  8. LeetCode题解(1728):猫和老鼠II(Python)
  9. 你需要知道的13个有用的Python片段
  10. 3dmax通过烘焙合并一个模型的多个贴图