在原先的文章7、TWS API 和 IB 中的金融工具介绍详细翻译了 TWS API 中如何设置一个 contract,用于获取数据、下单等操作,以及如何查找 contract。本文尝试在应用层面上,来看看如何设置和查找 contract。
在上一篇文章中,【TWS API 使用教程 2】—如何使用 TWS API 在 ubuntu 和 windows 上分别设置 contract、获取 contract 详细信息、设置 order、下单、获取持仓信息、获取账户信息,对常用的一些操作进行了整合,如果上篇文章的代码没有问题,接下来就重点介绍如何设置 contract,如何查找 contract 了。
contract 具有重要的意义,代表着一个交易品种,可以通过 contract 这个标识符,每次与 TWS 进行交互的时候,比如获取数据、下单的时候,TWS 需要知道你希望获取的是哪个交易品种的数据,是在哪个交易品种上进行交易。所以,contract 具有基础性的重要的作用,很多操作都离不开 contract.
一个 contract 需要很多的字段去指定,用于和其他的 contract 进行区分。
- STK — 股票或者 ETF
- BOND — 债券
- IND — 指数
- FUND — 公募基金
- OPT — 期权
- FUT — 期货
- WAR — 权证
- FOP — 期货期权
- CASH — 外汇对
- CMDTY — 商品
- NEWS — 新闻
- BAG — 组合
- CONTFUT —连续期货
一般情况下,可以使用 SMART 来委托 IB 决定使用那个交易所。 支持的交易所很多,可以通过下面的链接获取具体支持哪个交易所
- USD (美元)
- EUR (欧元)
- JPY (日元)
- CNY (人民币)
- GBP (英镑)
- INR (印度卢比)
- CAD (加拿大元)
- AUD(澳大利亚元)
- CHF (Swiss Franc)
在某些情况下,可以添加这些字段,用于避免筛选出来很多的满足条件的 contract.
conId:IB 指定的品种名字,通常是一个数字,比如可以用于指定债券 primaryExchange:指定是哪个交易所的交易品种,避免模糊。通常是想要节省手续费,使用了 SMART 之后使用。 localSymbol:IB 本地的名称,使用这个的话,可以唯一指定交易品种,就不需要交割月份等信息了 tradingClass:IB 指定的分类( IB-specific designation for a contract) secIdType:特定证券类型(Type of specific security identification) secId:特定证券的认定的值(Specific security identification value) lastTradeDateOrContractMonth:对于期货或者期权等有到期日的交易品种,这个是最后的交割月份 multiplier:合约乘数,即一张合约对应多少 strike:期权的行权价 right:权利,看涨期权或者看跌期权 includeExpired:是否包含已经到期的 deltaNeutral Contract:delta 中性的 contract comboLegs:组合 comboLeg Description:对组合的描述
在原先的介绍 contract 的文章中,已经有了很多的如何设置 contract 的例子,下面供参考
- EUR/GBP 的外汇对
contract = Contract()
contract.symbol = "EUR"
contract.secType = "CASH"
contract.currency = "GBP"
contract.exchange = "IDEALPRO" - ETH 的数字货币
contract = Contract();
contract.symbol = "ETH";
contract.secType = "CRYPTO";
contract.currency = "USD";
contract.exchange = "PAXOS"; - IB 的股票
contract = Contract()
contract.symbol = "IBKR"
contract.secType = "STK"
contract.currency = "USD"
#In the API side, NASDAQ is always defined as ISLAND in the exchange field
contract.exchange = "ISLAND" - 需要 SMART 但是又要指定交易所的股票
contract = Contract()
contract.symbol = "MSFT"
contract.secType = "STK"
contract.currency = "USD"
contract.exchange = "SMART"
#Specify the Primary Exchange attribute to avoid contract ambiguity
#(there is an ambiguity because there is also a MSFT contract with primary exchange = "AEB")
contract.primaryExchange = "ISLAND" - DAX 的指数
contract = Contract()
contract.symbol = "DAX"
contract.secType = "IND"
contract.currency = "EUR"
contract.exchange = "DTB" - 一个名叫 IBDE30 的 CFD
contract = Contract()
contract.symbol = "IBDE30"
contract.secType = "CFD"
contract.currency = "EUR"
contract.exchange = "SMART" - 一个 19 年 03 月到期的期货合约
contract = Contract()
contract.symbol = "ES"
contract.secType = "FUT"
contract.exchange = "GLOBEX"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "201903" - 用 localSymbol 指定的期货合约
contract = Contract()
contract.secType = "FUT"
contract.exchange = "GLOBEX"
contract.currency = "USD"
contract.localSymbol = "ESU6" - 指定了到期日和合约乘数的期货合约
contract = Contract()
contract.symbol = "DAX"
contract.secType = "FUT"
contract.exchange = "DTB"
contract.currency = "EUR"
contract.lastTradeDateOrContractMonth = "201903"
contract.multiplier = "5" - 期货连续合约只能用于历史数据
contract = Contract()
contract.symbol = "ES"
contract.secType = "CONTFUT"
contract.exchange = "GLOBEX" - 同时请求期货合约和连续合约的具体合约,只能用于获取合约信息
contract = Contract()
contract.symbol = "ES"
contract.secType = "FUT+CONTFUT"
contract.exchange = "GLOBEX" - 指定到期日、行权价、期权类型、乘数的期权合约
contract = Contract()
contract.symbol = "GOOG"
contract.secType = "OPT"
contract.exchange = "BOX"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "20190315"
contract.strike = 1180
contract.right = "C"
contract.multiplier = "100" - 如果指定了到期日、行权价、期权类型、乘数之后的期权合约还有多个,可以用 tradingClass 进行区分
contract = Contract()
contract.symbol = "SANT"
contract.secType = "OPT"
contract.exchange = "MEFFRV"
contract.currency = "EUR"
contract.lastTradeDateOrContractMonth = "20190621"
contract.strike = 7.5
contract.right = "C"
contract.multiplier = "100"
contract.tradingClass = "SANEU" - 期权合约可以通过 localSymbol 进行指定
contract = Contract()
#Watch out for the spaces within the local symbol!
contract.localSymbol = "C BMW JUL 20 4800"
contract.secType = "OPT"
contract.exchange = "DTB"
contract.currency = "EUR" - 使用 symbol = CUSIP 指定债券合约
contract = Contract()
# enter CUSIP as symbol
contract.symbol= "912828C57"
contract.secType = "BOND"
contract.exchange = "SMART"
contract.currency = "USD" - 使用 conId 指定债券合约
contract = Contract()
contract.conId = 15960357
contract.exchange = "SMART" - 共同基金
contract = Contract()
contract.symbol = "VINIX"
contract.secType = "FUND"
contract.exchange = "FUNDSERV"
contract.currency = "USD" - 商品
contract = Contract()
contract.symbol = "XAUUSD"
contract.secType = "CMDTY"
contract.exchange = "SMART"
contract.currency = "USD" - 和期权类似的权证
contract = Contract()
contract.symbol = "GOOG"
contract.secType = "WAR"
contract.exchange = "FWB"
contract.currency = "EUR"
contract.lastTradeDateOrContractMonth = "20201117"
contract.strike = 1500.0
contract.right = "C"
contract.multiplier = "0.01" - 荷兰权证和结构化产品(Dutch Warrants and Structured Products),需要使用 localSymbol 或者 conId 指定
contract = Contract()
contract.localSymbol = "B881G"
contract.secType = "IOPT"
contract.exchange = "SBF"
contract.currency = "EUR" - 股票价差组合
contract = Contract()
contract.symbol = "IBKR,MCD"
contract.secType = "BAG"
contract.currency = "USD"
contract.exchange = "SMART"
leg1 = ComboLeg()
leg1.conId = 43645865#IBKR STK
leg1.ratio = 1
leg1.action = "BUY"
leg1.exchange = "SMART"
leg2 = ComboLeg()
leg2.conId = 9408#MCD STK
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "SMART"
contract.comboLegs = []
contract.comboLegs.append(leg1)
contract.comboLegs.append(leg2) - 期权价差组合
contract = Contract()
contract.symbol = "DBK"
contract.secType = "BAG"
contract.currency = "EUR"
contract.exchange = "DTB"
leg1 = ComboLeg()
leg1.conId = 317960956 #DBK JUN 21 2019 C
leg1.ratio = 1
leg1.action = "BUY"
leg1.exchange = "DTB"
leg2 = ComboLeg()
leg2.conId = 334216780 #DBK MAR 15 2019 C
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "DTB"
contract.comboLegs = []
contract.comboLegs.append(leg1)
contract.comboLegs.append(leg2) - 指定交易所的期货价差组合(Guaranteed Futures Spread)
contract = Contract()
contract.symbol = "VIX"
contract.secType = "BAG"
contract.currency = "USD"
contract.exchange = "CFE"
leg1 = ComboLeg()
leg1.conId = 326501438 # VIX FUT 201903
leg1.ratio = 1
leg1.action = "BUY"
leg1.exchange = "CFE"
leg2 = ComboLeg()
leg2.conId = 323072528 # VIX FUT 2019049
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "CFE"
contract.comboLegs = []
contract.comboLegs.append(leg1)
contract.comboLegs.append(leg2) - Smart-Routed 期货价差(Smart-Routed Futures Spread)
contract = Contract()
contract.symbol = "WTI" # WTI,COIL spread. Symbol can be defined as first leg symbol ("WTI") or currency ("USD")
contract.secType = "BAG"
contract.currency = "USD"
contract.exchange = "SMART"
leg1 = ComboLeg()
leg1.conId = 55928698 # WTI future June 2017
leg1.ratio = 1
leg1.action = "BUY"
leg1.exchange = "IPE"
leg2 = ComboLeg()
leg2.conId = 55850663 # COIL future June 2017
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "IPE"
contract.comboLegs = []
contract.comboLegs.append(leg1)
contract.comboLegs.append(leg2) - 跨商品的期货价差(Inter-Commodity Futures)
contract = Contract()
contract.symbol = "CL.BZ" #symbol is 'local symbol' of intercommodity spread.
contract.secType = "BAG"
contract.currency = "USD"
contract.exchange = "NYMEX"
leg1 = ComboLeg()
leg1.conId = 47207310 #CL Dec'16 @NYMEX
leg1.ratio = 1
leg1.action = "BUY"
leg1.exchange = "NYMEX"
leg2 = ComboLeg()
leg2.conId = 47195961 #BZ Dec'16 @NYMEX
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "NYMEX"
contract.comboLegs = []
contract.comboLegs.append(leg1)
contract.comboLegs.append(leg2) 在 client 连接到 TWS 之后,可以使用 reqContractDetails 函数获取 contract 的详细信息,contract 的信息会返回到 contractDetails,可以通过 details 获取详细的信息并打印出来。
contract = Contract()
contract.symbol = "EUR"
contract.secType = "CASH"
contract.currency = "USD"
contract.exchange = "IDEALPRO"
client.reqContractDetails(1, contract)