首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ibpy:提取多个契约的API响应

ibpy:提取多个契约的API响应
EN

Stack Overflow用户
提问于 2015-05-09 02:15:16
回答 1查看 4K关注 0票数 8

我对使用ibpy和Interactive Brokers API来获取100只股票的实时行情数据很感兴趣。下面的代码来自web上的示例,适用于一只股票。有人能告诉我如何才能同时处理100只股票吗?

Python脚本:

代码语言:javascript
复制
from ib.opt import ibConnection, message
from ib.ext.Contract import Contract
from time import sleep

def my_callback_handler(msg):
    inside_mkt_bid = ''
    inside_mkt_ask = ''

    if msg.field == 1:
        inside_mkt_bid = msg.price
        print 'bid', inside_mkt_bid
    elif msg.field == 2:
        inside_mkt_ask = msg.price
        print 'ask', inside_mkt_ask


tws = ibConnection()
tws.register(my_callback_handler, message.tickSize, message.tickPrice)
tws.connect()

c = Contract()
c.m_symbol = "DATA"
c.m_secType = "STK"
c.m_exchange = "SMART"
c.m_currency = "USD"

tws.reqMktData(1,c,"",False)
sleep(25)

print 'All done'

tws.disconnect()

命令行输出:

代码语言:javascript
复制
    Server Version: 76
    TWS Time at connection:20150508 13:42:02 EST
    bid 111.42
    ask 111.5
    bid 111.43
    bid 111.44
    bid 111.42
    bid 111.38
    bid 111.32
    ask 111.44
    All done
EN

回答 1

Stack Overflow用户

发布于 2015-05-11 07:06:57

当您请求数据时,您需要提供一个tickerId来标识响应消息是针对哪个请求的。

我会从文件中读取证券列表,并将其放入数据框中,然后将索引用作tickerId。它将使查找和存储数据变得更加容易。

下面是我创建数据结构的方法

代码语言:javascript
复制
from __future__ import print_function #I'm using 3.x style print
import pandas as pd

#better to read these from a file
contracts = pd.DataFrame([
        ['IBM','SMART','USD'],
        ['AAPL','SMART','USD'],
        ['GOOG','SMART','USD'],
        ['ES','GLOBEX','USD','201506','50'],
        ['CL','NYMEX','USD','201506','1000']
])

# make decent column names
contracts.columns = ['sym','exch','curr','expiry','mult']

#add these specific column names to match the name returned by TickType.getField()
contracts['bidPrice'] = 0
contracts['askPrice'] = 0
contracts['lastPrice'] = 0

现在,为了发出请求,我只需循环遍历数据帧。在回调中,我使用tickerId查找数据框中的行。

代码语言:javascript
复制
from ib.opt import ibConnection, message
from ib.ext.Contract import Contract
from ib.ext.TickType import TickType as tt
from time import sleep

def error_handler(msg):
    print (msg)

def my_callback_handler(msg):
    if msg.field in [tt.BID,tt.ASK,tt.LAST]:
        #now we can just store the response in the data frame
        contracts.loc[msg.tickerId,tt.getField(msg.field)] = msg.price
        if msg.field == tt.LAST:
            print(contracts.loc[msg.tickerId,'sym'],msg.price)

tws = ibConnection(clientId=1)
tws.register(my_callback_handler, message.tickPrice, message.tickSize)
tws.register(error_handler, 'Error')
tws.connect()

for index, row in contracts.iterrows():
    c = Contract()
    c.m_symbol = row['sym']
    c.m_exchange = row['exch']
    c.m_currency = row['curr']
    c.m_secType = 'STK' if row['expiry'] is None else 'FUT'
    c.m_expiry = row['expiry']
    c.m_multiplier = row['mult']
    # the tickerId is just the index in but for some reason it needs str()
    tws.reqMktData(str(index),c,"",False)

现在,如果我想以某种方式使用它,我就有了所有的当前数据。另一种选择是使用某种结构来保存它并生成图形。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30130319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档