<p>如果列表中的每个条目都是一个列表本身(并且子列表中的每个索引位置总是包含同一个字段),那么“列”要求在某种程度上是模糊的</p>
<p>您收到的消息将发送到您在tws注册的回调。每个“转储”字段都可以用“点”表示法或通过dict类似的方法(如“keys”、“values”和“items”)访问</p>
<p>主要的挑战是合约:IB提供了大量交易所和不同交易资产的通道。“contract”对象(以及IB后端的信息)似乎反映了一种对所有事物提供统一/统一访问的努力,同时也表明它们必须建立在现有基础设施之上。在</p>
<p>你提到“股票行情”,所以我想你可能会喜欢这样的东西:IBM-STK-SMART带有“ib”行业标准符号(第二个字段表示它是股票,第三个字段表示ib将使用智能路由来更新订单和价格)</p>
<p>我们来看看列表:</p>
<pre><code>def acct_update(self, msg):
# Assume the function is a method in a class with access to a member
# 'portfolio' which is a list
if isinstance(msg, ib.opt.message.updatePortfolio):
c = msg.contract
ticker = '%s-%s-%s' % (contract.m_symbol, c.m_secType, c.m_exchange)
entry = [ticker]
entry.extend(msg.values)
self.portfolio.append(entry)
</code></pre>
<p>不幸的是,<code>ibpy</code>消息中的“keys”方法不是<code>classmethod</code>,但名称实际上是<code>__slots__</code>。在持有<code>acct_update</code>方法的类中,可以执行以下操作:</p>
^{pr2}$
<p>如果您不想通过索引访问列表中的字段,而是更喜欢ibpy已经提供的字段的名称,那么还可以对dict进行dict</p>
<pre><code>def __init__(self, ...)
self.portfolio = collections.OrderedDict()
def acct_update(self, msg):
# Assume the function is a method in a class with access to a member
# 'portfolio' which is a list
if isinstance(msg, ib.opt.message.updatePortfolio):
c = msg.contract
ticker = '%s-%s-%s' % (contract.m_symbol, c.m_secType, c.m_exchange)
self.portfolio[ticker] = collections.OrderedDict(msg.items())
</code></pre>
<p>这将允许您按名称获取最新的股票信息,并按名称访问字段。在</p>
<p>如果你需要保持每票的历史记录</p>
<pre><code>def __init__(self, ...)
self.portfolio = collections.defaultdict(list)
def acct_update(self, msg):
# Assume the function is a method in a class with access to a member
# 'portfolio' which is a list
if isinstance(msg, ib.opt.message.updatePortfolio):
c = msg.contract
ticker = '%s-%s-%s' % (contract.m_symbol, c.m_secType, c.m_exchange)
self.portfolio[ticker].extend(msg.values())
</code></pre>
<p>您可以存储“items”而不是值,然后根据需要访问元组。在</p>