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

我们都知道策略文件中的on_tick(),on_bar()回调函数与K线的合成有关。
N分钟间隔K线是用BarGenerator来合成的,它的构造函数如下:
class BarGenerator:
"""
For:

1. generating 1 minute bar data from tick data
2. generateing x minute bar/x hour bar data from 1 minute data

Notice:
1. for x minute bar, x must be able to divide 60: 2, 3, 5, 6, 10, 15, 20, 30
2. for x hour bar, x can be any number
"""

def __init__(
    self,
    on_bar: Callable,
    window: int = 0,
    on_window_bar: Callable = None,
    interval: Interval = Interval.MINUTE
):

其中window为多少个分钟(假设interval=Interval.MINUTE)合成一根N分钟K线,
on_tick()里调用update_tick(tick),在收到的tick数据的分钟发生变化时,推送合成的
一分钟K线给on_bar():
if not self.bar:
new_minute = True
elif self.bar.datetime.minute != tick.datetime.minute:
self.bar.datetime = self.bar.datetime.replace(
second=0, microsecond=0
)
self.on_bar(self.bar)

        new_minute = True

那让我们看看BarGenerator.on_bar()是怎么判断N分钟K线是否结束的吧:

    # Check if window bar completed
    finished = False

    if self.interval == Interval.MINUTE:
        # x-minute bar
        if not (bar.datetime.minute + 1) % self.window:
            finished = True
    elif self.interval == Interval.HOUR:
        if self.last_bar and bar.datetime.hour != self.last_bar.datetime.hour:
            # 1-hour bar
            if self.window == 1:
                finished = True
            # x-hour bar
            else:
                self.interval_count += 1

                if not self.interval_count % self.window:
                    finished = True
                    self.interval_count = 0

    if finished:
        self.on_window_bar(self.window_bar)
        self.window_bar = None

问题:
它是根据最新一根分钟bar的分钟+1%self.window==0来判断N分钟K线已经结束的。
换句话说:N分钟K线是否结束是已经自然时间来计算的,而不管这中间是否有不规则
的休市时间。当需要合成N分钟价K线如30分钟、60分钟的时候,由于国内期货的交易
时间段在上午10:15~10:30有一个休市时间,这样就会导致同样是30分钟K线,有的交易
时间为30分钟,有的就只有15分钟;同样60分钟K线,有的交易时间为60分钟,有的就
只有45分钟。在分析行情的时,这样可能会有问题的。
建议:
把交易合约的交易时间段考虑进去,在ContractData里增加的合约交易时间段的查询功能,
在BarGenerator中,或在系统设置中增加:K线的间隔为自然时间还是交易时间的设置,
也就是BarGenerator的window参数代表的是自然时间还是交易时间。

Administrator
avatar
加入于:
帖子: 4138
声望: 230

ContractData无法获取到交易时段,这块可以自行继承修改BarGenerator的合成规则来解决

Administrator
avatar
加入于:
帖子: 4138
声望: 230

ContractData无法获取到交易时段,这块可以自行继承修改BarGenerator的合成规则来解决

Member
avatar
加入于:
帖子: 153
声望: 26

明白里,谢谢!

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