简体   繁体   English

如何从盈透证券 API 获取合约详情?

[英]How to obtain Contract Details from the Interactive Brokers API?

Following the Interactive Brokers documentation I am trying to obtain the contract details using the below code:按照盈透证券的文档,我尝试使用以下代码获取合同详细信息:

from ibapi.client import EClient
from ibapi.wrapper import EWrapper

class MyWrapper(EWrapper):

    def contractDetails(self, reqId, contractDetails):
        super().contractDetails(reqId, contractDetails)

        print("ContractDetails. ReqId:", reqId,
              contractDetails.summary.symbol,
              contractDetails.summary.secType,
              "ConId:", contractDetails.summary.conId,
              "@", contractDetails.summary.exchange)

    def contractDetailsEnd(self, reqId):
        super().contractDetailsEnd(reqId)
        print("ContractDetailsEnd. ", reqId, "\n")


wrapper = MyWrapper()
app = EClient(wrapper)
app.connect("127.0.0.1", 7497, clientId=0)
print("serverVersion:%s connectionTime:%s" % (app.serverVersion(), app.twsConnectionTime()))

from ibapi.contract import Contract
contract = Contract()
contract.symbol = "XAUUSD"
contract.secType = "CMDTY"
contract.exchange = "SMART"
contract.currency = "USD"

app.reqContractDetails(4444, contract)
app.run()

And the output that is returned is:返回的输出是:

serverVersion:148 connectionTime:b'20190117 17:11:38 AEST'

An exception has occurred, use %tb to see the full traceback.

SystemExit


C:\Users\Greg\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:2969: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

How to obtain the contract details from the Interactive Brokers API?如何从盈透证券API获取合约详情? I tried using %tb but don't think I put it on the correct line.我尝试使用%tb但不认为我把它放在正确的行上。

from ibapi.client import EClient
from ibapi.wrapper import EWrapper


class MyWrapper(EWrapper):

    def nextValidId(self, orderId:int):
        print("setting nextValidOrderId: %d", orderId)
        self.nextValidOrderId = orderId
        # start program here or use threading
        app.reqContractDetails(4444, contract)

    def contractDetails(self, reqId, contractDetails):
        print(reqId, contractDetails.contract)# my version doesnt use summary

    def contractDetailsEnd(self, reqId):
        print("ContractDetailsEnd. ", reqId)
        # this is the logical end of your program
        app.disconnect() # delete if threading and you want to stay connected

    def error(self, reqId, errorCode, errorString):
        print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)


wrapper = MyWrapper()
app = EClient(wrapper)
app.connect("127.0.0.1", 7497, clientId=123)
print("serverVersion:%s connectionTime:%s" % (app.serverVersion(), app.twsConnectionTime()))

from ibapi.contract import Contract
contract = Contract()
contract.symbol = "XAUUSD"
contract.secType = "CMDTY"
contract.exchange = "SMART"
contract.currency = "USD"

app.run() # delete this line if threading

# def runMe():
#     app.run()

# import threading
# thread = threading.Thread(target = runMe)
# thread.start()

# input('enter to disconnect')
# app.disconnect()

You are asking for data before you start the message reader.您在启动消息阅读器之前要求提供数据。 Maybe you get the data before it starts.也许你在开始之前就得到了数据。

IB recommends starting the program after you receive nextValidId so you know everything is running properly. IB 建议在您收到 nextValidId 后启动该程序,以便您知道一切正常运行。 Since the python API blocks in a message read loop you need to implement threading or structure your program to run asynchronously.由于 python API 阻塞在消息读取循环中,因此您需要实现线程化或构建程序以异步运行。

I've shown how to do it so it will just run with no user input and it is event driven, or asynchronous.我已经展示了如何做到这一点,因此它将在没有用户输入的情况下运行,并且它是事件驱动的或异步的。 This means the program waits until it is supposed to do something and then it does it.这意味着程序会一直等到它应该做某事,然后才去做。

I've including the threading option, just change the comments.我已经包含了线程选项,只需更改注释即可。

ContractDetails.summary has been changed to contract. ContractDetails.summary 已更改为合同。 I'm not sure it ever was summary in python, don't know where you got that from.我不确定它是否曾经是 python 中的摘要,不知道你从哪里得到的。

Using ib_insync package with Python 3, you can also do the following if you want to get the details for a list of contracts all stored in a df:将 ib_insync 包与 Python 3 一起使用,如果您想获取所有存储在 df 中的合同列表的详细信息,您还可以执行以下操作:

from ib_insync import *
import pandas as pd


def add_contract_details(ib_client, ib_contract, df):
    list_of_contract_details = ib_client.reqContractDetails(contract=ib_contract)
    if list_of_contract_details:
        print(
            f"Found {len(list_of_contract_details)} contract{'s' if len(list_of_contract_details) > 1 else ''} for {ib_contract.symbol}: "
        )
        for contract_details in list_of_contract_details:
            data = {}
            for k, v in contract_details.contract.__dict__.items():
                data[k] = v
            for k, v in contract_details.__dict__.items():
                if k != "contract":
                    data[k] = v
            df = pd.DataFrame([data]) if df is None else df.append(pd.DataFrame([data]))
    else:
        print(f"No details found for contract {ib_contract.symbol}.")
    return df



ib = IB()
ib.connect(host="127.0.0.1", port=7497, clientId=1)
btc_fut_cont_contract = ContFuture("BRR", "CMECRYPTO")
ib.qualifyContracts(btc_fut_cont_contract)
fx_contract_usdjpy = Forex('USDJPY')
ib.qualifyContracts(fx_contract_usdjpy)

df_contract_details = None
for c in [btc_fut_cont_contract, fx_contract_usdjpy]:
    df_contract_details = add_contract_details(ib, c, df_contract_details)
print(df_contract_details)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从Interactive Brokers API获取新闻合同详细信息? - How to obtain News Contract Details from the Interactive Brokers API? 如何等待交互式经纪人从 tws api 下载数据? - how to wait for data to download in tws api from interactive brokers? 如何从交互式经纪人API获取历史股价数据? - How to get historical stock price data from interactive brokers API? 如何始终如一地从 IBKR API(互动经纪商)返回头寸? - How to return positions from IBKR API (interactive brokers) consistently? 互动经纪人 API 执行细节,我如何获得我得到的期货的入场价格? - interactive brokers API execute details, how I get the entry price of a Future that i got? 使用python从交互式经纪人获取帐户摘要详细信息 - Get account summary details from interactive brokers using python 如何从API Interactive Brokers的ib.reqHistoricalData生成的元组列表中获取元素 - How do I get the elements from list of tuples generated by ib.reqHistoricalData from API Interactive Brokers 使用 Python API 下载数据时如何消除(或从控制台抑制)盈透证券错误 - How to eliminate (or suppress from console) Interactive Brokers error when downloading data with Python API 期权价差与盈透证券的 API? - Option spreads with Interactive Brokers' API? 捕获盈透证券交易执行详细信息 python - Capture Interactive Brokers Trade Execution details python
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM