簡體   English   中英

如何從盈透證券 API 獲取合約詳情?

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

按照盈透證券的文檔,我嘗試使用以下代碼獲取合同詳細信息:

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

返回的輸出是:

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)

如何從盈透證券API獲取合約詳情? 我嘗試使用%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()

您在啟動消息閱讀器之前要求提供數據。 也許你在開始之前就得到了數據。

IB 建議在您收到 nextValidId 后啟動該程序,以便您知道一切正常運行。 由於 python API 阻塞在消息讀取循環中,因此您需要實現線程化或構建程序以異步運行。

我已經展示了如何做到這一點,因此它將在沒有用戶輸入的情況下運行,並且它是事件驅動的或異步的。 這意味着程序會一直等到它應該做某事,然后才去做。

我已經包含了線程選項,只需更改注釋即可。

ContractDetails.summary 已更改為合同。 我不確定它是否曾經是 python 中的摘要,不知道你從哪里得到的。

將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM