Python 我如何知道我从ib_api reqMktData检索到了数据?

Python 我如何知道我从ib_api reqMktData检索到了数据?,python,interactive-brokers,ib-api,Python,Interactive Brokers,Ib Api,我是Python新手,开始使用交互式代理API。我的纸面账户中有一个期权组合,我想检索与每种工具相关的风险 我从一个我在代码(DIS…)中定义的单一期权合同开始。 我知道我缺少一些权限,但我应该能够使用tickOptionComputing,ticktype=83(基于期权和基础价格的最后收盘价) 我在哪里指定ticktype为83?如果它在覆盖的tickPrice方法中(我需要在这里添加它) 在取消订阅之前,如何确保已填充我的all_risk数据框?我需要以某种方式告诉reqMktData停止

我是Python新手,开始使用交互式代理API。我的纸面账户中有一个期权组合,我想检索与每种工具相关的风险

我从一个我在代码(DIS…)中定义的单一期权合同开始。 我知道我缺少一些权限,但我应该能够使用tickOptionComputing,ticktype=83(基于期权和基础价格的最后收盘价)

我在哪里指定ticktype为83?如果它在覆盖的tickPrice方法中(我需要在这里添加它) 在取消订阅之前,如何确保已填充我的all_risk数据框?我需要以某种方式告诉reqMktData停止(通过cancelMktData),否则我的数据帧永远不会被填充,我只是在打印更新

import datetime
from ibapi.ticktype import *
path = '/Volumes/'
filename_Risk = path + 'Risk/Risk_'

def read_risk():
    from ibapi.client import EClient
    from ibapi.wrapper import EWrapper
    from ibapi.common import TickerId
    from ibapi.contract import Contract
    import pandas as pd

    class ib_class(EWrapper, EClient):
        def __init__(self): EClient.__init__(self, self)
            self.all_risk = pd.DataFrame([], columns=['TickerId', 
            'tickType', 'ImpliedVolatility', 'Delta', 'OptionPrice',                                                    
            'pvDividend', 'Gamma', 'Vega', 'Theta', 
            'UnderlyingPrice'])

        def error(self, reqId: TickerId, errorCode: int, errorString: str):
            if reqId > -1:
                print("Error. Id: ", reqId, " Code: ", errorCode, " Msg: ", errorString)

        def tickOptionComputation(self, reqId: TickerId, tickType: TickType, impliedVol: float, delta: float,
                              optPrice: float, pvDividend: float,
                              gamma: float, vega: float, theta: float, undPrice: float):
            super().tickOptionComputation(reqId, tickType, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta,
                                      undPrice)
            print("TickOptionComputation. TickerId:", reqId, "tickType:", tickType, "ImpliedVolatility:", impliedVol,
              "Delta:", delta, "OptionPrice:", optPrice, "pvDividend:", pvDividend, "Gamma: ", gamma, "Vega:", vega,
              "Theta:", theta, "UnderlyingPrice:", undPrice)
            self.all_risk.loc[str(TickerId)] = reqId, tickType, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice

    ib_api = ib_class()
    ib_api.connect("127.0.0.1", 7497, 1)

    #Option Contract example
    contract = Contract()
    contract.symbol = "DIS"
    contract.secType = "OPT"
    contract.exchange = "BOX"
    contract.currency = "USD"
    contract.lastTradeDateOrContractMonth = "20191101"
    contract.strike = 126
    contract.right = "P"
    contract.multiplier = "100"

    ib_api.reqMktData(104, contract, "", False, False, [])
    ib_api.tickSnapshotEnd(104)
    current_risk = ib_api.all_risk
    ib_api.run()

    return (current_risk)

if __name__ == '__main__':
    print("List of Risk")
    all_risk = read_risk()
    all_risk.to_csv(filename_Risk + datetime.date.fromordinal(datetime.date.today().toordinal()).strftime("%Y-%m-%d") + ".csv", index=None, header=True)
    print(all_risk)
目前我得到的是:

List of Risk

Error. Id:  104  Code:  10090  Msg:  Part of requested market data is not subscribed. Subscription-independent ticks are still active.Delayed market data is available.DIS NYSE/TOP/ALL

TickOptionComputation. TickerId: 104 tickType: 83 ImpliedVolatility: 0.22862237443433486 Delta: -0.37556209487070186 OptionPrice: 2.208775770605327 Dividend: 0.0 Gamma:  0.04671156123062818 Vega: 0.13482689929523772 Theta: -0.052288197357214475 UnderlyingPrice: 128.16

TickOptionComputation. TickerId: 104 tickType: 80 ImpliedVolatility: None Delta: None OptionPrice: None Dividend: 0.0 Gamma:  None Vega: None Theta: None UnderlyingPrice: 128.16

TickOptionComputation. TickerId: 104 tickType: 81 ImpliedVolatility: None Delta: None OptionPrice: None Dividend: 0.0 Gamma:  None Vega: None Theta: None UnderlyingPrice: 128.16

TickOptionComputation. TickerId: 104 tickType: 82 ImpliedVolatility: None Delta: None OptionPrice: None Dividend: 0.0 Gamma:  None Vega: None Theta: None UnderlyingPrice: 128.16

TickOptionComputation. TickerId: 104 tickType: 83 ImpliedVolatility: 0.22862237443433486 Delta: -0.37556109977905566 OptionPrice: 2.2087398478046607 Dividend: 0.0 Gamma:  0.04671208125635446 Vega: 0.13482525175105353 Theta: -0.05228881750759203 UnderlyingPrice: 128.16

TickOptionComputation. TickerId: 104 tickType: 83 ImpliedVolatility: 0.22862237443433486 Delta: -0.3755601046450712 OptionPrice: 2.2087039245384745 pvDividend: 0.0 Gamma:  0.0467126012999343 Vega: 0.13482360418650208 Theta: -0.05228943767924362 UnderlyingPrice: 128.16
作为一个额外的问题,当市场关闭时,我不能从盒子交换中得到任何东西,我需要切换到另一个吗?(NYSE/TOP/ALL或ARCA,但我错过了那里的市场认购)

谢谢Boris(和Airn5475),希望现在看起来更好。关于永无止境的循环,(我怀疑)但是nextValidId方法在这里有用吗?一旦我得到下一个验证,这意味着上一个app.run()已经完成(?)感谢Boris(和Airn5475),希望现在看起来更好。关于永无止境的循环,(我怀疑)但是nextValidId方法在这里有用吗?一旦我得到下一个验证,就意味着上一个app.run()已经完成(?)