vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 75
声望: 0

在使用ib接口时,获取外汇数据是正常的。

但在NYMEX交易所的原油品种上,不能获得当天的一分钟历史数据。下载的历史数据是昨天的最后一分钟截止的。

数据如下:

Date: 20210312  05:53:00, Open: 65.960000, High: 65.970000, Low: 65.930000, Close: 65.930000, Volume: 87, Average: 65.950000, BarCount: 69
Date: 20210312  05:54:00, Open: 65.940000, High: 65.940000, Low: 65.930000, Close: 65.940000, Volume: 27, Average: 65.938000, BarCount: 19
Date: 20210312  05:55:00, Open: 65.940000, High: 65.950000, Low: 65.880000, Close: 65.890000, Volume: 237, Average: 65.913000, BarCount: 126
Date: 20210312  05:56:00, Open: 65.890000, High: 65.910000, Low: 65.880000, Close: 65.890000, Volume: 37, Average: 65.897000, BarCount: 17
Date: 20210312  05:57:00, Open: 65.880000, High: 65.920000, Low: 65.880000, Close: 65.900000, Volume: 20, Average: 65.899000, BarCount: 15
Date: 20210312  05:58:00, Open: 65.890000, High: 65.900000, Low: 65.880000, Close: 65.880000, Volume: 54, Average: 65.895000, BarCount: 24
Date: 20210312  05:59:00, Open: 65.880000, High: 65.920000, Low: 65.880000, Close: 65.910000, Volume: 96, Average: 65.905000, BarCount: 41
[BarData(gateway_name='IB', symbol='CL-20210322-USD-FUT', exchange=<Exchange.NYMEX: 'NYMEX'>, datetime=datetime.datetime(2021, 3, 10, 22, 30, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), interval=<Interval.MINUTE: '1m'>, volume=4672, open_interest=0, open_price=64.09, high_price=64.09, low_price=63.72, close_price=63.85), BarData(gateway_name='IB', symbol='CL-20210322-USD-FUT', exchange=<Exchange.NYMEX: 'NYMEX'>, datetime=datetime.datetime(2021, 3, 10, 22, 31, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), interval=<Interval.MINUTE: '1m'>, volume=3798, open_interest=0, open_price=63.85, high_price=63.9, low_price=63.56, close_price=63.6), BarData(gateway_name='IB', symbol='CL-20210322-USD-FUT', exchange=<Exchange.NYMEX: 'NYMEX'>, datetime=datetime.datetime(2021, 3, 10, 22, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), interval=<Interval.MINUTE: '1m'>, volume=3478, open_interest=0, open_price=63.59, high_price=63.87,

交易所早上6点收盘,然后数据就截止到5点59。

NYMEX交易所我已经购买了付费行情。

如果交易所不提供当天的1分钟历史数据,那就只能依靠tick来合成。麻烦大了。

Member
avatar
加入于:
帖子: 75
声望: 0

description

图表上同样如此,

Administrator
avatar
加入于:
帖子: 4595
声望: 262

请将你的机器改为美国纽约时区试试

Member
avatar
加入于:
帖子: 75
声望: 0

用Python的交易员 wrote:

请将你的机器改为美国纽约时区试试

感谢回复!!

老板你好

我把自己的电脑和tws都设置成为纽约时间,问题还是照旧,

description

description

Member
avatar
加入于:
帖子: 75
声望: 0

我明白是怎么回事了,加载历史数据的时候,只加载了常规交易时段的,这种数据是从晚上十点半开始的。而我做上述的测试的时候,都是白天进行的。

可是,要怎么才能得到非常规交易时段的数据呢??

Member
avatar
加入于:
帖子: 75
声望: 0

http://interactivebrokers.github.io/tws-api/historical_time_and_sales.html

在盈透的官网一顿找,终于找到了这个

description

这个的意思是

requestId, 请求的id
contract,查询对象的合同对象。
startDateTime,即 "20170701 12:01:00"。使用登录时指定的 TWS 时区。
endDateTime,即 "20170701 13:01:00"。在TWS时区。必须定义startDateTime或endDateTime中的一个。
numberOfTicks, 不同数据点的数量。每个请求最大为1000个。
whatToShow, (Bid_Ask, Midpoint, or Trades) 请求的数据类型。
useRth, 来自常规交易时间的数据 (1), 或所有可用时间 (0).
ignoreSize, 省略只反映大小变化而不反映价格变化的更新。适用于 Bid_Ask 数据请求。
miscOptions 应定义为空;保留给内部使用。

看来关键是useRth参数的设置。

于是,在这里照猫画虎

description

本来想试一下,结果tws不能登陆了。今天礼拜六。唉

老板,你看是这个问题不??

Administrator
avatar
加入于:
帖子: 4595
声望: 262

应该就是这个问题了,如果测试出来有效欢迎发个Github的PR,另外问下原油非标准交易时段,指的是美国夜盘(之前完全不知道美国期货还有非标准时段的概念)?

Member
avatar
加入于:
帖子: 75
声望: 0

问题解决了,上图中的修改是错误的,应该修改成这样。

self.client.reqHistoricalData(
            self.reqid,
            ib_contract,
            end_str,    #结束时间
            duration,
            bar_size,   #返回开线的周期,例如一分钟,五分钟等。
            bar_type,   #
            0,  #我修改了这里的参数,本来是1。返回数据是否包括非交易时段0是包括,1是不包括。
            1,
            False,
            []
        )

其实是我没常识,还到处去查,其实系统中的文件中就有说明。

description

把这个说明附在这里

#########################################################################
    ################## Historical Data
    #########################################################################

    def reqHistoricalData(self, reqId:TickerId , contract:Contract, endDateTime:str,
                          durationStr:str, barSizeSetting:str, whatToShow:str,
                          useRTH:int, formatDate:int, keepUpToDate:bool, chartOptions:TagValueList):
        """Requests contracts' historical data. When requesting historical data, a
        finishing time and date is required along with a duration string. The
        resulting bars will be returned in EWrapper.historicalData()

        reqId:TickerId - The id of the request. Must be a unique value. When the
            market data returns, it whatToShowill be identified by this tag. This is also
            used when canceling the market data.
        contract:Contract - This object contains a description of the contract for which
            market data is being requested.
        endDateTime:str - Defines a query end date and time at any point during the past 6 mos.
            Valid values include any date/time within the past six months in the format:
            yyyymmdd HH:mm:ss ttt

            where "ttt" is the optional time zone.
        durationStr:str - Set the query duration up to one week, using a time unit
            of seconds, days or weeks. Valid values include any integer followed by a space
            and then S (seconds), D (days) or W (week). If no unit is specified, seconds is used.
        barSizeSetting:str - Specifies the size of the bars that will be returned (within IB/TWS listimits).
            Valid values include:
            1 sec
            5 secs
            15 secs
            30 secs
            1 min
            2 mins
            3 mins
            5 mins
            15 mins
            30 mins
            1 hour
            1 day
        whatToShow:str - Determines the nature of data beinging extracted. Valid values include:

            TRADES
            MIDPOINT
            BID
            ASK
            BID_ASK
            HISTORICAL_VOLATILITY
            OPTION_IMPLIED_VOLATILITY
        useRTH:int - Determines whether to return all data available during the requested time span,
            or only data that falls within regular trading hours. Valid values include:

            0 - all data is returned even where the market in question was outside of its
            regular trading hours.
            1 - only data within the regular trading hours is returned, even if the
            requested time span falls partially or completely outside of the RTH.
        formatDate: int - Determines the date format applied to returned bars. validd values include:

            1 - dates applying to bars returned in the format: yyyymmdd{space}{space}hh:mm:dd
            2 - dates are returned as a long integer specifying the number of seconds since
                1/1/1970 GMT.
        chartOptions:TagValueList - For internal use only. Use default value XYZ. """

翻译了一下

""请求提供合同的历史数据。在要求提供历史数据时,a
        结束时间和日期以及持续时间字符串是必需的。该
        结果的条形图将在EWrapper.historicalData()中返回。

        reqId:TickerId - 请求的id。必须是一个唯一的值。当
            市场数据返回,它什么要显示将由这个标签识别。这也是
            当取消市场数据时使用。
        contract:Contract - 这个对象包含了对合同的描述,其中的
            市场数据被请求。
        endDateTime:str - 定义过去6个月内任何时间点的查询结束日期和时间。
            有效值包括过去6个月内的任何日期/时间,格式如下。
            yyyymmdd HH:mm:ss ttt。

            其中 "ttt "是可选的时区。
        durationStr:str - 使用时间单位设置查询持续时间,最长为一周。
            秒、天或周。有效值包括任何带空格的整数。
            然后是S(秒)、D(天)或W(周)。如果没有指定单位,则使用秒。
        barSizeSetting:str - 指定将被返回的条形图的大小(在IB/TWS列表中)。
            有效值包括
            1秒
            5秒
            15秒
            30秒
            1分钟
            2分钟
            3分钟
            5分钟
            15分钟
            30分钟
            1小时
            1天
        whatToShow:str - 确定被提取的数据的性质。有效值包括。

            TRADES
            中点
            BID
            ASK
            BID_ASK
            历史上的波动性
            OPTION_IMPLIED_VOLATILITY(期权)
        useRTH:int - 确定是否返回请求的时间跨度内的所有数据。
            或只在正常交易时间内的数据。有效值包括

            0 - 所有的数据都会被返回,即使是有关市场在它的外部
            常规交易时间。
            1 - 只有在正常交易时间内的数据才会被返回,即使是在
            要求的时间跨度部分或完全在RTH之外。
        formatDate: int - 确定适用于返回条形图的日期格式,validd值包括。

            1 - 应用于返回的条形图的日期格式为:yyyymmdd{空格}{空格}hh:mm:dd。
            2 - 返回的日期是一个长整数,指定了自日期开始的秒数。
                1970年1月1日GMT.MarketingOptions:TagValueList - 仅供内部使用。
        chartOptions:TagValueList - 仅供内部使用。使用默认值XYZ。"""

原来历史数据可以下载各种周期的,还还打算自己写代码合成呢,现在省了。

收获还是挺多的,感谢老板提供的产品。

Member
avatar
加入于:
帖子: 75
声望: 0

用Python的交易员 wrote:

应该就是这个问题了,如果测试出来有效欢迎发个Github的PR,另外问下原油非标准交易时段,指的是美国夜盘(之前完全不知道美国期货还有非标准时段的概念)?

标准时段的交易是在交易所交易的,就像中国的期货是上班时间开盘。晚上十点正好是美国的白天的早晨开盘。到美国的下午也就是中国的凌晨6点多就收盘了。
非交易时段是凌晨7点开盘的电子盘。电子盘一直到晚上十点交易所正式开盘。所以美国的期货是每天只有一个小时休息的,可以说全天都可以交易。
其实对于用户来说,电子盘什么,交易所什么的不重要,根本没有感觉。操作都是一样的。而且每天的下午(中国)是欧洲的早上,布伦特原油的活跃时段,这个时候美国原油的交易所还没有开盘,但电子盘也是一样的,会跟着布伦特上下翻飞,成交量也很大。

美国的期货大多都是这种。

所以这个参数默认设置成为0最好。

Github的PR我不熟,不会弄,就不弄了。这个很简单,就是修改一个参数,相关需要的人修改一下参数就好了。

Administrator
avatar
加入于:
帖子: 4595
声望: 262

OK,感谢告知!

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号