VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 420
声望: 173

1. 先看看R-Breaker策略的init():

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super(DynaRBreakStrategy, self).__init__(
            cta_engine, strategy_name, vt_symbol, setting
        )

        self.bg = BarGenerator(self.on_bar)   # 这是1分钟K线生成器
        self.am = ArrayManager()
        self.bars = []

可以看出它的self.bg是1分钟K线的产生器。

2. 再看看R-Breaker策略的on_bar()代码:

    def on_bar(self, bar: BarData):
        """
        Callback of new bar data update.
        """
        self.cancel_all()

        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return

        self.bars.append(bar)
        if len(self.bars) <= 2:
            return
        else:
            self.bars.pop(0)
        last_bar = self.bars[-2]

        # New Day
        if last_bar.datetime.date() != bar.datetime.date():       # 这样可能只可以判断夜盘和日盘
            if self.day_open:

                self.buy_setup = self.day_low - self.setup_coef * (self.day_high - self.day_close)  # 观察买入价
                self.sell_setup = self.day_high + self.setup_coef * (self.day_close - self.day_low)  # 观察卖出价

                self.buy_enter = (self.enter_coef_1 / 2) * (self.day_high + self.day_low) - self.enter_coef_2 * self.day_high  # 反转买入价
                self.sell_enter = (self.enter_coef_1 / 2) * (self.day_high + self.day_low) - self.enter_coef_2 * self.day_low  # 反转卖出价

                self.buy_break = self.buy_setup + self.break_coef * (self.sell_setup - self.buy_setup)  # 突破买入价
                self.sell_break = self.sell_setup - self.break_coef * (self.sell_setup - self.buy_setup)  # 突破卖出价

            self.day_open = bar.open_price
            self.day_high = bar.high_price
            self.day_close = bar.close_price
            self.day_low = bar.low_price

        # Today
        else:
            self.day_high = max(self.day_high, bar.high_price)
            self.day_low = min(self.day_low, bar.low_price)
            self.day_close = bar.close_price

        if not self.sell_setup:
            return

        self.tend_high, self.tend_low = am.donchian(self.donchian_window)

        if bar.datetime.time() < self.exit_time:   # self.exit_time==14:55,----》0:00~14:55是可以下单的

            if self.pos == 0:
                self.intra_trade_low = bar.low_price
                self.intra_trade_high = bar.high_price

                if self.tend_high > self.sell_setup:
                    long_entry = max(self.buy_break, self.day_high)
                    self.buy(long_entry, self.fixed_size, stop=True)

                    self.short(self.sell_enter, self.multiplier * self.fixed_size, stop=True)

                elif self.tend_low < self.buy_setup:
                    short_entry = min(self.sell_break, self.day_low)
                    self.short(short_entry, self.fixed_size, stop=True)

                    self.buy(self.buy_enter, self.multiplier * self.fixed_size, stop=True)

            elif self.pos > 0:
                self.intra_trade_high = max(self.intra_trade_high, bar.high_price)
                long_stop = self.intra_trade_high * (1 - self.trailing_long / 100)
                self.sell(long_stop, abs(self.pos), stop=True)

            elif self.pos < 0:
                self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
                short_stop = self.intra_trade_low * (1 + self.trailing_short / 100)
                self.cover(short_stop, abs(self.pos), stop=True)

        # Close existing position
        else:      # 14:55平仓,夜盘是不做的吗???
            if self.pos > 0:
                self.sell(bar.close_price * 0.99, abs(self.pos))
            elif self.pos < 0:
                self.cover(bar.close_price * 1.01, abs(self.pos))

        self.put_event()

3. 这样判断是否是跨日有点不对劲:

# New Day
if last_bar.datetime.date() != bar.datetime.date():

我们知道很多期货品种都可能有夜盘,而且日K线的起始时间是上一交易日的晚上21:00,这就不用多说了。也就是说连续的2个1分钟bar是没有办法判断跨交易日的。
如果这样可能判断错误,那么这几个变量:
self.day_open = bar.open_price
self.day_high = bar.high_price
self.day_close = bar.close_price
self.day_low = bar.low_price
就有点名不副实了。

4. 不做夜盘是否是策略设计的本意???

目前的这个R-Breaker又不是完全没有夜盘,因为 0:00~14:55 可以下单的,14:55平仓,夜盘是不做的,是有什么说法吗?
要知道象白银之类的合约的夜盘是21:00-2:30,从21:00到次日00:00有3小时之多呢,大概1/3的时间被剔除出可以交易时间,是什么原因呢?

5. 怎么能够做夜盘 ?

可以考虑合约的交易时间段来判断交易日的开始和结束,陈老师觉得是否有必要呢?这是我的一点点意见,不知道是否正确,望批评指正!

Administrator
avatar
加入于:
帖子: 4502
声望: 321

R-BREAKDER策略刚诞生的时候,是没有夜盘的。。。。

其实根据目前规则,应该用夜盘开盘来作为开始计算

Member
avatar
加入于:
帖子: 420
声望: 173

那我来想办法改一版吧。

Member
avatar
加入于:
帖子: 420
声望: 173

用Python的交易员 wrote:

R-BREAKDER策略刚诞生的时候,是没有夜盘的。。。。

其实根据目前规则,应该用夜盘开盘来作为开始计算

老师,我现在的修改就是从夜盘开始计算,下午14:55退出平仓的。
修改方法见:https://www.vnpy.com/forum/topic/4463-yi-ge-ke-yi-jiao-yi-ye-pan-de-rbreakerstrategy

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

沪公网安备 31011502017034号

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