最近在自己重复造轮子,想写一个符合自己心意的engine。在过程中发现了一点小问题。
在远古时期(还在我接触vnpy之前),vnpy用的是conId作为股票的symbol的,这没啥问题。 但是现在ib_gateway已经改版挺久的了,已经都采用像 AAPL-USD-STK 这种格式作为symbol了,但是在ib_gateway里面我发现在 openOrder 和 execDetails 这两个函数里,symbol还是使用conId (见下图用三引号注释掉的有红框的部分)。
这就有点尴尬,在买卖的时候symbol都是一堆str,买完了之后想做个记录,突然全部都变整数了。
我不太清楚为什么ib_gateway还要保留conId这个东西,可能还有另外的其他的用处?但是经过小小修改过后(见图1图2红框部分),这个不方便的地方就可以改掉了。
其实这两个问题都跟交易所有关系。
在vnpy中,下单的时候经常会见到这样的情况
订单的状态一直就是“未成交”或者是“提交中”,但是IB的trader workstation却提示我说订单已经交易完成。
这是因为vnpy里面自带的交易所列表不全的原因。在vnpy > trader > constant 的 Exchange类中我们可以看到,vnpy自带的交易所就只有这么一些
而这是远远不够的,我们可以在IB的trader workstation中看到还有其他的交易所
而出问题的,就是这些在别的交易所成交的股票。
所以,我们只需要把vnpy的交易所列表补全就好了,在IB的Exchange Listings里面, 我们可以把这些交易所手动添加进去vnpy里面
class Exchange(Enum):
"""
Exchange.
"""
# Chinese
CFFEX = "CFFEX" # China Financial Futures Exchange
SHFE = "SHFE" # Shanghai Futures Exchange
CZCE = "CZCE" # Zhengzhou Commodity Exchange
DCE = "DCE" # Dalian Commodity Exchange
INE = "INE" # Shanghai International Energy Exchange
SSE = "SSE" # Shanghai Stock Exchange
SZSE = "SZSE" # Shenzhen Stock Exchange
SGE = "SGE" # Shanghai Gold Exchange
WXE = "WXE" # Wuxi Steel Exchange
CFETS = "CFETS" # China Foreign Exchange Trade System
# Global/Amaerica
SMART = "SMART" # Smart Router for US stocks
NYSE = "NYSE" # New York Stock Exchnage
NASDAQ = "NASDAQ" # Nasdaq Exchange
NYMEX = "NYMEX" # New York Mercantile Exchange
COMEX = "COMEX" # a division of theNew York Mercantile Exchange
GLOBEX = "GLOBEX" # Globex of CME
IDEALPRO = "IDEALPRO" # Forex ECN of Interactive Brokers
CME = "CME" # Chicago Mercantile Exchange
ICE = "ICE" # Intercontinental Exchange
SEHK = "SEHK" # Stock Exchange of Hong Kong
HKFE = "HKFE" # Hong Kong Futures Exchange
HKSE = "HKSE" # Hong Kong Stock Exchange
SGX = "SGX" # Singapore Global Exchange
CBOT = "CBT" # Chicago Board of Trade
CBOE = "CBOE" # Chicago Board Options Exchange
CFE = "CFE" # CBOE Futures Exchange
DME = "DME" # Dubai Mercantile Exchange
EUREX = "EUX" # Eurex Exchange
APEX = "APEX" # Asia Pacific Exchange
LME = "LME" # London Metal Exchange
BMD = "BMD" # Bursa Malaysia Derivatives
TOCOM = "TOCOM" # Tokyo Commodity Exchange
EUNX = "EUNX" # Euronext Exchange
KRX = "KRX" # Korean Exchange
OANDA = "OANDA" # oanda.com
ARCAEDGE = "ARCAEDGE" # ArcaEdge (ARCAEDGE)
BYX = "BYX" # Bats BYX (BYX)
BATS = "BATS" # Bats Global Markets (BATS)
CHX = "CHX" # Chicago Stock Exchange (CHX)
DRCTEDGE = "DRCTEDGE" # Direct Edge (DRCTEDGE)
EDGEA = "EDGEA" # Direct Edge (EDGEA)
VMAP = "VMAP" # IB VWAP Dealing Network (VWAP)
IEX = "IEX" # IEX
BEX = "BEX" # NASDAQ OMX BX (BEX)
PSX = "PSX" # NASDAQ OMX PSX (PSX)
ISLAND = "ISLAND" # NASDAQ/Island
ARCA = "ARCA" # NYSE Arca (ARCA)
PINK = "PINK" # OTC Markets Pink (PINK)
IBKRATS = "IBKRATS" # IB's paper trading exchange
# Canada
ALPHA = "ALPHA" # Alpha ATS (ALPHA)
OMEGA = "OMEGA" # Omega ATS (OMEGA)
TSE = "TSE" # Toronto Stock Exchange (TSE)
VENTURE = "VENTURE" # TSX Venture (VENTURE)
# Mexico
MEXI = "MEXI" # Mexican Stock Exchange (MEXI)
# Special Function
LOCAL = "LOCAL" # For local generated data
注意就是,玩paper trading的朋友一定要把 IBKRATS 这个交易所添上,在paper trading中,有一些订单是在这里交易的。
这个问题只会在少数的几只股票上发生,例如在订阅MSFT的时候会发现
这个问题其实在IB的API手册中有提到过
这是因为vnpy发出的合约信息对应了多个可能的合约(大概应该是因为一只股票有在几个交易所都有上市,IB不知道你这个合约是指哪一个吧?)。
所以针对MSFT和CSCO这两只股票(应该还有其他的,不过IB的官网也没说,我也不知道。。。),我们给他们加上primary exchange就好了。