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

我写了一个简单的5分钟策略用于回测,代码大致如下:

class MyStrategy(CtaTemplate):
    author = "常山之蛇"

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

        self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar)
        self.am = ArrayManager()


    def on_bar(self, bar: BarData):
        self.bg.update_bar(bar)


    def on_5min_bar(self, bar: BarData):
        """"""
        self.cancel_all()

        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return     
        #条件判断
        if ......:
            self.x = -1

        if ......:
            self.x = 1

        #持空仓
        if self.pos == 0:
            if self.x == -1:          
                self.buy(bar.close_price, 1,True)
                self.settle_price = am.low_array[-2]
            elif self.x == 1:
                self.short(bar.close_price, 1,True)
                self.settle_price = am.high_array[-2]
            else:
                pass

        #持多仓
        elif self.pos > 0:
            if am.low_array[-1] < self.settle_price:
                self.sell(am.low_array[-1], abs(self.pos),True)

            elif self.x == 1:
                self.sell(am.low_array[-1], abs(self.pos),True)

        #持空仓
        elif self.pos < 0:
            if am.high_array[-1] > self.settle_price:
                self.cover(am.high_array[-1], abs(self.pos),True)
            elif self.x == -1:
                self.cover(am.high_array[-2], abs(self.pos),True)

        self.put_event()

    def on_order(self, order: OrderData):
        """
        Callback of new order data update.
        """
        pass

    def on_trade(self, trade: TradeData):
        """
        Callback of new trade data update.
        """
        self.put_event()

    def on_stop_order(self, stop_order: StopOrder):
        """
        Callback of stop order update.
        """
        pass

可是回测的时候,这个self.pos > 0不发生作用,按理来说self.pos > 0,不会再买入,不过我通过查看记录,发现它不断的买入?
enter image description here

然后到后来,他又正常了

enter image description here

请问这是什么原因?如何解决?谢谢。

Member
加入于:
帖子: 77
声望: 17

你用了stoporder阻止单开仓,虽然开单,未必成交。你的log是由onTrade触发的吗

Member
avatar
加入于:
帖子: 91
声望: 2

不是的,是写在on_5min_bar里面的self.buy, self.sell里面的。。

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

self.pos 的更新是按照发出的单子更新持仓(不论成交与否),还是按照成交回报更新持仓?

Administrator
avatar
加入于:
帖子: 1690
声望: 80

根据成交回报更新

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