承袭上一篇文章《提交你的第一个订单》我们通过合约,可以查到很多交易产品的信息,可查询的内容包含但不限于大盘指数,股价,期权,期货,贵金属,债券,外汇等。
由于金融产品的相关标识有很多重复的情况,所以要查找一个具体的标的,往往需要添加许多字段信息的描述。
在上一篇文章中,我们通过EClient类的reqMatchingSymbols方法,从市场中或者说从TWS中查找了名为“IB”的合约信息,但如果我们需要查找更深一点,我们就需要准备更多的工作了。
标识一个合约对象的类,在IB中,是Contract类。那我们先来看一下填写一个Contract类需要哪些东西。
Contract contract = new Contract();
contract.Symbol = "EUR";
contract.SecType = "CASH";
contract.Currency = "GBP";
contract.Exchange = "IDEALPRO";
这是一个FX合约,也就是外汇合约信息。Symbol字段,表示的是合约代码,如果在大A股,就是如果查找浦发银行的合约信息,那么这个字段就是“600000”。
SecType表示的是资产类型,“CASH”表示现金或者说货币,那么股票,期货,期权,贵金属,债券等,这个字段都是不同的。
Currency表示的是货币单位,对于我们大A股的货币单位就是RMB了,而对于在美国交易的合约,其货币单位就是USD,而GBP就是英国磅的意思。
Exchange是交易所代码,IB里面还有根据具体情况而定义的PrimaryExch,也就是交易品的主要交易所代码。
那么关于这个类的具体定义,以及哪些字段可以用,我们可以直接参考官方的文档:http://interactivebrokers.github.io/tws-api/classIBApi_1_1Contract.html
需要注意的是,如果合约信息填写错误或者调用的请求函数错误,可能会无法取得想要的合约数据,会通过error函数返回错误的数据,所以如果发现了合约获取失败,就要注意是字段填写错误,还是请求函数错误了。
虽然说这个列表在IB的文档里有详细说明,但为了方便大家以后查找,当然也方便我自己将来检索使用,所以我在这里把这些都罗列出来。
Contract contract = new Contract();
contract.Symbol = "EUR";
contract.SecType = "CASH";
contract.Currency = "GBP";
contract.Exchange = "IDEALPRO";
Contract contract = new 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";
由于可能存在相同交易代码,为了更快的获取到对应股票合约信息,除了股票代码,货币符号,交易所,你还需要指定主要的交易所标记,以便唯一地确定对应的合约,具体实现如下:
Contract contract = new 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.PrimaryExch = "ISLAND";
需要注意下,primaryExch 字段指定主要交易所,避免由于交易所符号不清晰,导致歧义。其次,对于美国来说,IB使用ISLAND来代指纳斯达克,所以如果是要查询纳斯达克的某个合约,PrimaryExch就要写成ISLAND。
需要注意,这个只是IB自己的定义,而不是代表着所有的其他类似系统也是这样定义的。
另外,作为主要交易所和交易所字段的替代方法,可以通过指定字段“Exchange:Primary Exchange”,例如:“SMART:NASDAQ”,使用“:”或“/”符号区分字段。
Contract contract = new Contract();
contract.Symbol = "DAX";
contract.SecType = "IND";
contract.Currency = "EUR";
contract.Exchange = "DTB";
Contract contract = new Contract();
contract.Symbol = "IBDE30";
contract.SecType = "CFD";
contract.Currency = "EUR";
contract.Exchange = "SMART";
标准期货合约通常使用到期日和symbol字段作为基础标记进行定义。
Contract contract = new Contract();
contract.Symbol = "ES";
contract.SecType = "FUT";
contract.Exchange = "GLOBEX";
contract.Currency = "USD";
contract.LastTradeDateOrContractMonth = "201803";
此外,IB使用“LocalSymbol” 标记为期货专用。当使用“local symbol”标记期货合约时,“合约到期日”字段不再需要。
例如:
Contract contract = new Contract();
contract.SecType = "FUT";
contract.Exchange = "GLOBEX";
contract.Currency = "USD";
contract.LocalSymbol = "ESU6";
某些时候,你可能期望获得多于单一期货合约的多个拥有共同基础标记及合约到期日(注:例如某一天到期的多个棉花期货合约)。为了处理歧义性,可以设置合约乘数“Multiplier”,例如:
Contract contract = new Contract();
contract.Symbol = "DAX";
contract.SecType = "FUT";
contract.Exchange = "DTB";
contract.Currency = "EUR";
contract.LastTradeDateOrContractMonth = "201609";
contract.Multiplier = "5";
也可以通过设置连续合约获取某合约的历史数据,时间轴,或者合约详细信息。连续期货合约不能用于实时数据,或着提交订单。
Contract contract = new Contract();
contract.Symbol = "ES";
contract.SecType = "CONTFUT";
contract.Exchange = "GLOBEX";
资产类型“FUT+CONTFUT”可以被用于查询合约详细信息及合约历史信息,除此之外不能被其他合约类型使用。
Contract contract = new Contract();
contract.Symbol = "ES";
contract.SecType = "FUT+CONTFUT";
contract.Exchange = "GLOBEX";
如同期货,期权合约也需要到期日,以及一个期权合约乘数。
Contract contract = new Contract();
contract.Symbol = "GOOG";
contract.SecType = "OPT";
contract.Exchange = "BOX";
contract.Currency = "USD";
contract.LastTradeDateOrContractMonth = "20170120";
contract.Strike = 615;
contract.Right = "C";
contract.Multiplier = "100";
查找几乎拥有相同属性的期权合约(如基础标识,竞价,最近交易时间,乘数等),通过增加更多的信息,可以帮助用户更容易的找到对应的期权合约。
Contract contract = new 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";
使用OCC属性标记,可以在API中用来定义一个期权合约。
Contract contract = new Contract();
//Watch out for the spaces within the local symbol!
contract.LocalSymbol = "C DBK DEC 20 1600";
contract.SecType = "OPT";
contract.Exchange = "DTB";
contract.Currency = "EUR";
Contract contract = new Contract();
contract.Symbol = "ES";
contract.SecType = "FOP";
contract.Exchange = "GLOBEX";
contract.Currency = "USD";
contract.LastTradeDateOrContractMonth = "20180316";
contract.Strike = 2800;
contract.Right = "C";
contract.Multiplier = "50";
债券可以在“symbol”为“CUSIP”或“ISIN”,具体的标识,可以通过reqMatchingSymbols或者在TWS中查看。
Contract contract = new Contract();
// enter CUSIP as symbol
contract.Symbol = "912828C57";
contract.SecType = "BOND";
contract.Exchange = "SMART";
contract.Currency = "USD";
债券也可以像其他资产类型一样,通过conId和exchange进行定义。
Contract contract = new Contract();
contract.ConId = 285191782;
contract.Exchange = "SMART";
API也提供了对共同基金的支持。
注意!模拟交易账户不能交易共同基金。
Contract contract = new Contract();
contract.Symbol = "VINIX";
contract.SecType = "FUND";
contract.Exchange = "FUNDSERV";
contract.Currency = "USD";
Contract contract = new Contract();
contract.Symbol = "XAUUSD";
contract.SecType = "CMDTY";
contract.Exchange = "SMART";
contract.Currency = "USD";
这种类型的资产,在IB种有很多,所以容易导致歧义,因此IB要求用户必须填写conId和localSymbol。
Contract contract = new Contract();
contract.LocalSymbol = "B881G";
contract.SecType = "IOPT";
contract.Exchange = "SBF";
contract.Currency = "EUR";
今天就先到这里,在下一篇文章种,我们来研究下怎么提交这些不同的合约数据。
话说看到这里,你不来点个赞,写个好评么?我要没动力又把这技术介绍的文章鸽了怎么办?哎,真是头疼呢