Python 如何正确使用Ibpy中的reqMktData?

Python 如何正确使用Ibpy中的reqMktData?,python,algorithmic-trading,interactive-brokers,ibpy,Python,Algorithmic Trading,Interactive Brokers,Ibpy,大家好,我刚刚开始研究一个Ibpy算法,我想先用纸面交易来测试它,但我对如何使用reqMktData获得最后的价格有一点了解。我下订单没有问题,但25秒内不会返回任何信息,我想它只在交易时间使用,或者我只是用错了,有什么想法吗 from ib.opt import ibConnection, message from ib.ext.Contract import Contract from time import sleep def my_callback_handler(msg):

大家好,我刚刚开始研究一个Ibpy算法,我想先用纸面交易来测试它,但我对如何使用reqMktData获得最后的价格有一点了解。我下订单没有问题,但25秒内不会返回任何信息,我想它只在交易时间使用,或者我只是用错了,有什么想法吗

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(788,c,"",False)
sleep(25)
print 'All done'

tws.disconnect()

我认为这与IB内部的市场数据订阅有关,因为我也有类似的问题。我在连接中得到了TWS时间。。。与“市场数据场连接”消息一起返回结果。 确保已建立连接端口和客户端ID,即:

tws = ibConnection(port=7496,clientId=100)

请注意,7496是一个通用端口,但clientId是您希望指定的任何内容(在您正在使用的IB帐户中,在文件->API->设置下)。

我以前尝试过IbPy并成功获取数据,但现在我改用了Ibapi,这更加困难,仍然无法完全交易,但它有一个调整后的历史价格

这是我的代码,你必须根据自己的需要来定制

1.获取股票会员表格Excel

from ib.opt import ibConnection, message
from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.ext.TickType import TickType as tt
from time import sleep, time, strftime
import datetime
from __future__ import print_function #I'm using 3.x style print
import pandas as pd
import numpy as np
from math import ceil
import re

xls_file = pd.ExcelFile('xxxx\\Interactive_Broker_trading\\SNP2.xlsx')
df = xls_file.parse('Sheet1')
Ticker = df.iloc[:,1]
all_data = pd.DataFrame(Ticker)
all_data.columns = ['ticker']
all_data['type'] = 'STK'
all_data['exchange'] = 'SMART'
all_data['curr'] = 'USD'
all_data['bidPrice'] =0
all_data['askPrice'] =0
all_data['lastPrice'] =0
all_data['HistoryPrice']=0
2.使用for循环获取历史价格,因为我的帐户限制每时每刻100个请求,所以我将其分为8个多个会话,用于标准普尔505。然后重新登录每70只股票。我可以在2分钟内得到总共505个

def error_handler(msg):
    print(msg)
def my_callback_handler(msg):
    if msg.field in [tt.BID,tt.ASK,tt.LAST]:
#         from ib.ext.TickType import TickType as tt

        #now we can just store the response in the data frame
        all_data.loc[msg.tickerId,tt.getField(msg.field)] = msg.price
#         if msg.field == tt.LAST:
# #             print('a')
#             print(all_data.loc[msg.tickerId,'ticker'],msg.price)

t = time()
max_amount_per_Iter = 70 #max number per iter to save cost
max_Iter = ceil(len(all_data)/max_amount_per_Iter)
for i in range (0,max_Iter):
    print('====================for : ',i+1,'==========================')
    sleep(1)
    tws = ibConnection(clientId=11+i)
    tws.register(my_callback_handler, message.tickPrice, message.tickSize)
    tws.register(error_handler, 'Error')
    tws.connect()
    all_dum = all_data.iloc[i*max_amount_per_Iter:min((i+1)*max_amount_per_Iter,len(all_data)),:]
    for index, row in all_dum.iterrows():


        c = Contract()
        c.m_symbol = row['ticker']
        c.m_exchange = row['exchange']
        c.m_currency = row['curr']
        c.m_secType = row['type']
        # the tickerId is just the index in but for some reason it needs str()
        tws.reqMktData(str(index),c,'',False)

        sleep(0.2)
    sleep(2)
    print('=========End round : ',i+1,'with time :',time() - t,'==============')
    tws.disconnect()

如果请求发送成功,它应该返回数据或某种错误消息。您应该确保正在捕获错误消息。我不熟悉Ibpy,但我发现了如何在这里启用日志记录。如果您使用的是IBGateway,请同时选中“显示日志”复选框,查看那里发生了什么(不确定如何在TWS中查看日志)。您好,我已对其进行了修改,以便可以获得错误。这是我得到的:连接时的TWS时间:20170801 23:59:20湿,因此显然它没有连接到usfuture、usfarm,fundfarm和USHMD是不应该24/7上线的,还是我必须付费才能访问?他们应该24/7上线,如果你还没有,你必须为任何市场数据付费。您必须在帐户管理->管理帐户->交易配置下登录并在那里订阅。明白了,我想我必须完成应用程序才能获得数据。谢谢你的信息!