IBPY中的reqHistoricalData不';不返回任何内容[python]

IBPY中的reqHistoricalData不';不返回任何内容[python],python,api,ibpy,Python,Api,Ibpy,我正试图通过Ibpy从交互式代理(IB)获取历史数据。 我已经为这个任务尝试了几个脚本,这些脚本是我从其他表明它应该工作的人那里改编的。然而,他们没有一个为我工作! 我是python新手,所以我承认我对这些方法的工作原理没有完全的了解——但是,我应该尝试最明显的修复方法。下面我列出了我尝试过的两个脚本。 我正在使用python2x 在TWS中,我有以下设置: 选中:启用ActiveX和套接字客户端。 未选中:启用DDE客户端。 未选中:只读API。 选中:在连接时下载未结订单。 选中:发送投资组

我正试图通过Ibpy从交互式代理(IB)获取历史数据。 我已经为这个任务尝试了几个脚本,这些脚本是我从其他表明它应该工作的人那里改编的。然而,他们没有一个为我工作! 我是python新手,所以我承认我对这些方法的工作原理没有完全的了解——但是,我应该尝试最明显的修复方法。下面我列出了我尝试过的两个脚本。 我正在使用python2x

在TWS中,我有以下设置:

选中:启用ActiveX和套接字客户端。 未选中:启用DDE客户端。 未选中:只读API。 选中:在连接时下载未结订单。 选中:发送投资组合时包括外汇头寸。 选中:发送EEP的状态更新。 套接字端口=7496。 选中:使用负数绑定自动订单。 未选中:创建API消息日志文件。 未选中:在API日志文件中包含市场数据。 日志记录级别=错误。 主API客户端ID=222。 将批量数据发送到API的超时时间为30秒。 组件Exch分隔符=空白。 选中:仅允许从本地主机进行连接

API-检查预防措施:绕过API订单预防措施。此选项卡中的所有其他内容均未选中

当我运行python脚本时,我已经登录并运行了TWS,与其他人在网上所说的相比,上面的twsapi设置似乎是正确的。我有一个真实的IB账户订阅了美国股票数据。应该进一步提到的是,我还试图运行另一个脚本,通过IBPY下订单——这是有效的,因此问题似乎只存在于(至少目前)获取历史数据方面

脚本1:

from time import sleep, strftime, localtime  
from ib.ext.Contract import Contract  
from ib.opt import ibConnection, message  


new_symbolinput = ['AAPL']
newDataList = []  
dataDownload = []  

def historical_data_handler(msg):  
    global newDataList  
    print (msg.reqId, msg.date, msg.close)
    if ('finished' in str(msg.date)) == False:  
        new_symbol = new_symbolinput[msg.reqId]  
        dataStr = '%s, %s, %s' % (new_symbol, strftime("%Y-%m-%d", localtime(int(msg.date))), msg.close)  
        newDataList = newDataList + [dataStr]
    else:  
        new_symbol = new_symbolinput[msg.reqId]  
        filename = 'minutetrades' + new_symbol + '.csv'  
        csvfile = open('IBdata/' + filename,'w')
        for item in newDataList:  
            csvfile.write('{} \n'.format(item))
        csvfile.close()  
        newDataList = []  
        global dataDownload  
        dataDownload.append(new_symbol)  


con = ibConnection(port=7496, clientId=222)  
con.register(historical_data_handler, message.historicalData)  
con.connect()  

symbol_id = 0  
for i in new_symbolinput:  
    print (i)  
    qqq = Contract()  
    qqq.m_symbol = i  
    qqq.m_secType = 'STK'  
    qqq.m_exchange = 'SMART'  
    qqq.m_currency = 'USD'
    con.reqHistoricalData(symbol_id, qqq, '20161101', '1 W', '1 D', 'MIDPOINT', 1, 2)  

    symbol_id = symbol_id + 1  
    sleep(10)  

print (dataDownload) 
filename = 'downloaded_symbols.csv'  
csvfile = open('IBdata/' + filename,'w')  
for item in dataDownload:  
    csvfile.write('%s \n' % item)  
csvfile.close()
这将返回csv文件中的数据。csv文件已创建,但为空

答复:

Server Version: 76
TWS Time at connection:20170315 14:18:06 CET
AAPL
[]
所以它显然没有返回任何东西

脚本2:

from time import sleep, strftime
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message

def my_account_handler(msg):
    print(msg)

def my_tick_handler(msg):
    print(msg)

def my_hist_data_handler(msg):
    print(msg)


if __name__ == '__main__':

    con = ibConnection(port=7496,clientId=222)
    con.register(my_account_handler, 'UpdateAccountValue')
    con.register(my_tick_handler, message.tickSize, message.tickPrice)
    con.register(my_hist_data_handler, message.historicalData)
    con.connect()

    print(con.isConnected())

    def inner():

        qqqq = Contract()
        qqqq.m_secType = "STK" 
        qqqq.m_symbol = "AAPL"
        qqqq.m_currency = "USD"
        qqqq.m_exchange = "SMART"
        endtime = strftime('%Y%m%d %H:%M:%S')
        print(endtime)
        print(con.reqHistoricalData(1,qqqq,endtime,"1 W","1 D","MIDPOINT",1,2))



    sleep(10)

    inner()
    sleep(5)
    print('disconnected', con.disconnect())
    print(con.isConnected())
答复如下:

Server Version: 76
TWS Time at connection:20170315 14:29:53 CET
True
20170315 14:30:05
None
('disconnected', True)
False
同样,什么也没有返回。我不知道为什么,因为这似乎对其他人有用。我可能错过了一些基本的东西,因为我对Python很陌生


非常感谢您的帮助

始终实现一个错误处理程序,API会告诉您出了什么问题。在这种情况下,它说使用“1天”的酒吧大小

没有必要睡觉。使用
nextValidId
了解连接何时准备就绪。使用不同的结束方法来知道何时完成
historicalDataEnd
似乎还没有在IBpy中实现,所以只需查找“finished”

不要关闭api日志记录,它会显示错误以及发送到TWS和从TWS发送的所有不同消息。您可以关闭日志文件中的市场数据,因为它相当多。在jts目录中查找文件“api.222.Wed.log”

from time import sleep, strftime
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
import pandas as pd
import numpy as np

def nextValidId_handler(msg):
    print(msg)
    inner()

hist = []

def my_hist_data_handler(msg):
    print(msg)
    if "finished" in msg.date:
        print('disconnecting', con.disconnect())
        df = df = pd.DataFrame(index=np.arange(0, len(hist)), columns=('date', 'close', 'volume'))
        for index, msg in enumerate(hist):
            df.loc[index,'date':'volume'] = msg.date, msg.close, msg.volume
        print(df )
    else:
        hist.append(msg)    

def error_handler(msg):
    print(msg)

if __name__ == '__main__':

    con = ibConnection(port=7497,clientId=222)
    con.register(error_handler, message.Error)
    con.register(nextValidId_handler, message.nextValidId)
    con.register(my_hist_data_handler, message.historicalData)
    con.connect()

    print(con.isConnected())

    def inner():

        qqqq = Contract()
        qqqq.m_secType = "STK" 
        qqqq.m_symbol = "AAPL"
        qqqq.m_currency = "USD"
        qqqq.m_exchange = "SMART"
        endtime = strftime('%Y%m%d %H:%M:%S')
        print(endtime)
        con.reqHistoricalData(1,qqqq,endtime,"1 W","1 day","MIDPOINT",1,2)

    print(con.isConnected())

我希望不要要求太多,但有人能提供我如何将输出放入pd.DataFrame的见解吗?我明白了-无论如何,谢谢。顺便说一下:我现在有另一个奇怪的问题。该脚本可以工作,但当我(通过spyder)执行它时,数据不会“更新”,直到我在控制台中单击。因此,我无法通过循环获取多个证券的数据,因为我必须在每次运行后在控制台中单击以实际获取数据。有什么想法吗?