【问题标题】:last price for multiple symbols多个符号的最后价格
【发布时间】:2021-10-06 08:30:27
【问题描述】:

我正在尝试使用 ib_insync 包获取多个符号的最后价格,但我不知道如何将 ib 对象传递给函数,函数返回的最后价格是 nan。这将是单线程的,所以我可以为 ib 使用全局变量。

def last_live_price(ib,symbol_in,exchange_in,currency_in):
        contract=Stock(symbol=symbol_in,exchange=exchange_in,currency=currency_in)        
        last_live=ib.reqMktData(contract, genericTickList='', snapshot=True, regulatorySnapshot=False,mktDataOptions=None)
        time.sleep(5)
        last=last_live.last
        return(last)
    
    
util.startLoop()  # uncomment this line when in a notebook or spynder
ib = IB()
ib.connect('127.0.0.1', 7496,clientId=26)

d = {'symbol':['700', '9988', '2318', '386'],
        'exchange':['SEHK','SEHK','SEHK','SEHK'],
        'currency':['HKD','HKD','HKD','HKD']
        }
hk = pd.DataFrame(data=d)

#how should ib object be passed to the function?
hk['last']=hk.apply(lambda x: ib,last_live_price(symbol_in=x['symbol'],
                                 exchange_in=x['exchange'],
                                 currency_in=x['currency']),axis=1)

#how should ib object be passed to the function?
test_last=last_live_price(ib=ib,symbol_in='CBA',exchange_in='ASX',currency_in='AUD')

【问题讨论】:

  • 哪行代码给了你错误?
  • 我发现了那个bug——ib.reqMktData返回的对象不能变成数据框,但是我不能把ib对象传递给函数。我将编辑问题。

标签: python interactive-brokers tws


【解决方案1】:

此代码有效:time.sleep(x) 会导致问题,因此请将其替换为 ib.sleep(x),并通过 ib.qualifyContracts(contract) 获取完整合同是一种很好的做法。

def last_live_price(symbol_in,exchange_in,currency_in):
        contract=Stock(symbol=symbol_in,exchange=exchange_in,currency=currency_in)  
        ib.qualifyContracts(contract) 
        ib.sleep(5)
        last_live=ib.reqMktData(contract, genericTickList='', snapshot=True, regulatorySnapshot=False,mktDataOptions=None)
        ib.sleep(5)
        last=last_live.last
        return(last)

d = {'symbol':['NAB', 'CBA', 'ANZ', 'ORG'],
        'exchange':['ASX','ASX','ASX','ASX'],
        'currency':['AUD','AUD','AUD','AUD'],
        'last':[None,None,None,None]
        }

stocks = pd.DataFrame(data=d)

stocks['last']=stocks.apply(lambda x: last_live_price(symbol_in=x['symbol'],
                                  exchange_in=x['exchange'],
                                  currency_in=x['currency']),axis=1)

【讨论】:

  • ib.sleep(5) 两次太多了,1 秒就够了,只有一次 :) (至少对于
  • ib.sleep(5) 优于 ib.sleep(2)。我站得更正了。我通过实验发现,有时 2 秒对于填充最后一个值来说太快了。欢呼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多