1

嗨,伙计们刚开始研究 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()
4

2 回答 2

1

我之前尝试过 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 个请求,因此我将其划分为 S&P 505 的 8 个多个会话。然后每 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()
于 2017-08-17T05:03:00.357 回答
0

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

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

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

于 2017-08-04T22:27:33.647 回答