VeighNa量化社区
你的开源社区量化交易平台
QuantumRose's Avatar
Member
离线
5 帖子
声望: 4

最近在自己重复造轮子,想写一个符合自己心意的engine。在过程中发现了一点小问题。

在远古时期(还在我接触vnpy之前),vnpy用的是conId作为股票的symbol的,这没啥问题。 但是现在ib_gateway已经改版挺久的了,已经都采用像 AAPL-USD-STK 这种格式作为symbol了,但是在ib_gateway里面我发现在 openOrder 和 execDetails 这两个函数里,symbol还是使用conId (见下图用三引号注释掉的有红框的部分)。

description

description

这就有点尴尬,在买卖的时候symbol都是一堆str,买完了之后想做个记录,突然全部都变整数了。

description

我不太清楚为什么ib_gateway还要保留conId这个东西,可能还有另外的其他的用处?但是经过小小修改过后(见图1图2红框部分),这个不方便的地方就可以改掉了。

description

本文要解决的问题有两个

  1. 在vnpy中通过IB下单,订单状态一直显示“提交中”或“未成交”。
  2. 在vnpy中订阅/下单,api提示ambiguous symbol。

其实这两个问题都跟交易所有关系。

首先来搞问题 1

问题描述:

在vnpy中,下单的时候经常会见到这样的情况

description

订单的状态一直就是“未成交”或者是“提交中”,但是IB的trader workstation却提示我说订单已经交易完成。

原因

这是因为vnpy里面自带的交易所列表不全的原因。在vnpy > trader > constant 的 Exchange类中我们可以看到,vnpy自带的交易所就只有这么一些

description

而这是远远不够的,我们可以在IB的trader workstation中看到还有其他的交易所

description

而出问题的,就是这些在别的交易所成交的股票。

解决办法

所以,我们只需要把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中,有一些订单是在这里交易的。

问题 2

问题描述

这个问题只会在少数的几只股票上发生,例如在订阅MSFT的时候会发现

description

原因

这个问题其实在IB的API手册中有提到过

description

这是因为vnpy发出的合约信息对应了多个可能的合约(大概应该是因为一只股票有在几个交易所都有上市,IB不知道你这个合约是指哪一个吧?)。

解决办法

所以针对MSFT和CSCO这两只股票(应该还有其他的,不过IB的官网也没说,我也不知道。。。),我们给他们加上primary exchange就好了。

description

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】