如何正确使用来自 Ibpy 的 reqMktData?



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

我之前尝试过 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只股票。我可以在 505 分钟内得到总共 2 个。

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()

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

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

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

相关内容

  • 没有找到相关文章

最新更新