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

打印发现on_15min_bar()里self.am.update_bar(bar)之后的代码都没有被执行

我觉得可能是am的问题,所以我尝试把arraymanager()的参数改成1,修改之后后面的代码才开始被执行,之前的参数就是默认值size=100
我是VNPY默认数据库加载的数据,推送数据值都有几百条了,现在不明白问题在哪

代码如下:

from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
Direction,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)

from vnpy.trader.constant import Interval
class ver_two_TS_Strategy(CtaTemplate):
""""""
author = "用Python的交易员"

entry_window = 20

exit_window = 10

atr_window = 20

fixed_size = 1


entry_up = 0
entry_down = 0

exit_up = 0
exit_down = 0

atr_value = 0

long_entry = 0
short_entry = 0

long_stop = 0
short_stop = 0


parameters = ["entry_window", "exit_window", "atr_window", "fixed_size"]
variables = ["entry_up", "entry_down", "exit_up", "exit_down", "atr_value"]

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
    """"""
    # 类的初始化

    super().__init__(cta_engine, strategy_name, vt_symbol, setting)


    self.bg15min = BarGenerator(self.on_bar, 15, self.on_15min_bar, interval=Interval.MINUTE)

    self.am = ArrayManager()

def on_init(self):

    self.write_log("策略初始化")
    self.load_bar(20)

def on_start(self):

    self.write_log("策略启动")

def on_stop(self):

    self.write_log("策略停止")

def on_tick(self, tick: TickData):

    self.bg15min.update_tick(tick)


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

def on_15min_bar(self, bar: BarData):

    self.cancel_all()

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

    if not self.pos:
        self.entry_up, self.entry_down = self.am.donchian(
            self.entry_window)


    self.exit_up, self.exit_down = self.am.donchian(self.exit_window)

    if not self.pos:
        # 计算atr值
        self.atr_value = self.am.atr(self.atr_window)
        self.long_entry = 0
        self.short_entry = 0
        self.long_stop = 0
        self.short_stop = 0
        self.send_buy_orders(self.entry_up)
        self.send_short_orders(self.entry_down)

    elif self.pos > 0:
        self.send_buy_orders(self.entry_up)

        sell_price = max(self.long_stop, self.exit_down)

        self.sell(sell_price, abs(self.pos), True)


    elif self.pos < 0:
        self.send_short_orders(self.entry_down)

        cover_price = min(self.short_stop, self.exit_up)
        self.cover(cover_price, abs(self.pos), True)

    # 更新图形界面
    self.put_event()

def on_trade(self, trade: TradeData):
    if trade.direction == Direction.LONG:

        self.long_entry = trade.price
        self.long_stop = self.long_entry - 2 * self.atr_value
    else:
        self.short_entry = trade.price
        self.short_stop = self.short_entry + 2 * self.atr_value

def on_order(self, order: OrderData):

    pass

def on_stop_order(self, stop_order: StopOrder):

    pass

def send_buy_orders(self, price):

    t = self.pos / self.fixed_size

    if t < 1:
        self.buy(price, self.fixed_size, True)

    if t < 2:
        self.buy(price + self.atr_value * 0.5, self.fixed_size, True)

    if t < 3:
        self.buy(price + self.atr_value, self.fixed_size, True)

    if t < 4:
        self.buy(price + self.atr_value * 1.5, self.fixed_size, True)

def send_short_orders(self, price):

    t = self.pos / self.fixed_size

    if t > -1:
        self.short(price, self.fixed_size, True)

    if t > -2:
        self.short(price - self.atr_value * 0.5, self.fixed_size, True)

    if t > -3:
        self.short(price - self.atr_value, self.fixed_size, True)

    if t > -4:
        self.short(price - self.atr_value * 1.5, self.fixed_size, True)
Member
avatar
加入于:
帖子: 4949
声望: 297

15分钟,am的size等于100,那至少要1500分钟才够初始化,你只有几百条不够初始化是正常的

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

xiaohe wrote:

15分钟,am的size等于100,那至少要1500分钟才够初始化,你只有几百条不够初始化是正常的

但是我推送的几百条数据都是15分钟级别的,还是没法初始化呀

Member
avatar
加入于:
帖子: 4949
声望: 297

正常应该是策略加载1分钟K线合成15分钟K线
不知道你这里推送的几百条都是15分钟级别的指的是你是加载1分钟K线已经合成了几百条15分钟K线还是你加载的就是几百条15分钟K线

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

xiaohe wrote:

正常应该是策略加载1分钟K线合成15分钟K线
不知道你这里推送的几百条都是15分钟级别的指的是你是加载1分钟K线已经合成了几百条15分钟K线还是你加载的就是几百条15分钟K线

这个问题解决了,谢谢
还有一个问题是,我拿我这个代码去回测,显示成交记录为空无法计算,请问这是什么问题呢,是不是因为我这是15min级别的?

Member
avatar
加入于:
帖子: 4949
声望: 297

自己在策略里打印策略变量排查看看就知道了

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

xiaohe wrote:

自己在策略里打印策略变量排查看看就知道了

谢谢您的反馈
我打印策略变量没啥问题,但是回测还是有问题
14:53:48 ----------------------------------------
14:53:48 开始加载历史数据
14:53:48 加载进度:# [0%]
14:53:48 加载进度:# [10%]
14:53:48 加载进度:## [20%]
14:53:48 加载进度:### [29%]
14:53:48 加载进度:#### [39%]
14:53:48 加载进度:##### [49%]
14:53:48 加载进度:###### [59%]
14:53:48 加载进度:####### [68%]
14:53:48 加载进度:######## [78%]
14:53:48 加载进度:######### [88%]
14:53:48 加载进度:########## [98%]
14:53:48 历史数据加载完成,数据量:1023
14:53:48 策略初始化完成
14:53:48 开始回放历史数据
14:53:48 回放进度:= [0%]
14:53:48 回放进度:== [10%]
14:53:48 回放进度:=== [20%]
14:53:48 回放进度:==== [30%]
14:53:48 回放进度:===== [40%]
14:53:48 回放进度:====== [50%]
14:53:48 回放进度:======= [60%]
14:53:48 回放进度:======== [70%]
14:53:48 回放进度:========= [80%]
14:53:48 回放进度:========== [90%]
14:53:48 回放进度:=========== [100%]
14:53:48 历史数据回放结束
14:53:48 开始计算逐日盯市盈亏
14:53:48 成交记录为空,无法计算
14:53:48 开始计算策略统计指标
14:53:48 策略统计指标计算完成
14:55:00 ----------------------------------------

这样子的结果

Member
avatar
加入于:
帖子: 4949
声望: 297

你指的打印没有问题是说数据足够am初始化,指标计算正确,成功发出委托指令并收到on_order/on_trade推送吗?

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

xiaohe wrote:

你指的打印没有问题是说数据足够am初始化,指标计算正确,成功发出委托指令并收到on_order/on_trade推送吗?
是的,这些都没有问题。

目前我发现我使用1min数据可以回测成功,但是使用15min数据会回测失败,显示成交记录为空。
使用15min数据回测时候,我打印发现on_15min_bar函数似乎没有被调用,在15_min_bar之前打印的都可以成功输出
请问您知道这会是啥问题吗

Member
avatar
加入于:
帖子: 4949
声望: 297

如果你用15分钟的数据回测,你策略on_bar加载的就是15分钟级别的数据。如果你用1分钟的数据回测,你策略on_bar加载的就是1分钟级别的数据

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

沪公网安备 31011502017034号

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