VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 4
声望: 0

from datetime import datetime
import pytz
from vnpy_ctastrategy import CtaTemplate, StopOrder, BarGenerator, ArrayManager
from vnpy.trader.constant import (
Direction, Offset, Interval, Status, Exchange, OrderType
)
from vnpy.trader.object import TickData, BarData, OrderData, TradeData
from vnpy.trader.utility import round_to

class RBPro(CtaTemplate):
"""R-Breaker Pro策略"""
author = "QuantVision Pro"

# 策略参数
donchian_window = 30
atr_period = 14
risk_ratio = 0.02
trailing_mult = 2.0
max_loss_count = 3
price_impact = 0.0002
exit_time = "14:55"
timezone = "Asia/Shanghai"

parameters = [
    "donchian_window",
    "atr_period",
    "risk_ratio",
    "trailing_mult",
    "max_loss_count",
    "price_impact",
    "exit_time",
    "timezone"
]

variables = [
    "day_high",
    "day_low",
    "atr_value",
    "pos"
]

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

    # 时区处理
    self.tz = pytz.timezone(self.timezone)
    self.exit_hour, self.exit_minute = map(int, self.exit_time.split(":"))

    # K线合成器
    self.minute_bg = BarGenerator(
        on_bar=self.on_bar,
        window=15,
        on_window_bar=self.on_15min_bar,
        interval=Interval.MINUTE
    )
    self.daily_bg = BarGenerator(
        on_bar=self.on_daily_bar,
        interval=Interval.DAILY
    )

    # 数据管理器
    self.am_15min = ArrayManager(size=200)
    self.am_daily = ArrayManager(size=5)

def on_init(self):
    """策略初始化"""
    self.write_log("策略初始化")
    self.load_bar(10)  # 加载10天数据

def on_start(self):
    """策略启动"""
    self.write_log("策略启动")

def on_stop(self):
    """策略停止"""
    self.write_log("策略停止")

def on_tick(self, tick: TickData):
    """Tick更新"""
    # 转换时区
    tick.datetime = tick.datetime.astimezone(self.tz)
    self.minute_bg.update_tick(tick)
    self.daily_bg.update_tick(tick)

def on_bar(self, bar: BarData):
    """1分钟K线回调"""
    self.minute_bg.update_bar(bar)
    self.daily_bg.update_bar(bar)

def on_15min_bar(self, bar: BarData):
    """15分钟K线回调"""
    self.am_15min.update_bar(bar)
    if not self.am_15min.inited:
        return

    # 计算ATR值
    self.atr_value = self.am_15min.atr(self.atr_period)

    # 获取当日的高点和低点
    if self.am_daily.inited:
        self.day_high = self.am_daily.high[-1]
        self.day_low = self.am_daily.low[-1]
    else:
        return

    # 交易逻辑
    if self.pos == 0:
        if bar.close_price > self.day_high:
            self.buy(bar.close_price, 1)
    elif self.pos > 0:
        if bar.close_price < self.day_low:
            self.sell(bar.close_price, 1)

def on_daily_bar(self, bar: BarData):
    """日线K线回调"""
    self.am_daily.update_bar(bar)
    if self.am_daily.inited:
        self.day_high = self.am_daily.high[-1]
        self.day_low = self.am_daily.low[-1]

def on_order(self, order: OrderData):
    """委托回调"""
    pass

def on_trade(self, trade: TradeData):
    """成交回调"""
    self.put_event()

Traceback (most recent call last):
File "H:\veighna_studio\lib\site-packages\vnpy_ctastrategy\ui\widget.py", line 177, in add_strategy
self.cta_engine.add_strategy(

File "H:\veighna_studio\lib\site-packages\vnpy_ctastrategy\engine.py", line 647, in add_strategy
strategy: CtaTemplate = strategy_class(self, strategy_name, vt_symbol, setting)
File "C:\Users\Administrator\strategies\rb_pro.py", line 56, in init
self.daily_bg = BarGenerator(
File "H:\veighnastudio\lib\site-packages\vnpy\trader\utility.py", line 209, in init
raise RuntimeError(
("合成日K线必须传入每日收盘时间"))
RuntimeError: 合成日K线必须传入每日收盘时间

Super Moderator
avatar
加入于:
帖子: 23
声望: 3

在VeighNa平台中,使用BarGenerator合成日K线时,必须传入每日收盘时间参数daily_end。这是因为日K线的合成需要明确每日的收盘时间,以便正确切分K线。

你遇到的错误是由于在初始化BarGenerator时,没有提供daily_end参数。以下是正确的初始化方式:

self.daily_bg = BarGenerator(
    on_bar=self.on_bar,  # 回调函数
    window=1,  # 窗口大小
    on_window_bar=self.on_daily_bar,  # 日K线回调函数
    interval=Interval.DAILY,  # 日K线
    daily_end=time(15, 0)  # 每日收盘时间,例如15:00
)

注意事项:

  1. daily_end参数:必须传入一个time对象,表示每日的收盘时间。例如,国内期货市场通常收盘时间为15:00,国债期货为15:15。
  2. 回调函数:确保on_baron_daily_bar函数已正确定义,用于处理K线数据。

如果你需要处理国债期货,收盘时间应设置为15:15:

self.daily_bg = BarGenerator(
    on_bar=self.on_bar,
    window=1,
    on_window_bar=self.on_daily_bar,
    interval=Interval.DAILY,
    daily_end=time(15, 15)  # 国债期货收盘时间
)

通过正确设置daily_end参数,可以避免上述报错并正常合成日K线。

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

沪公网安备 31011502017034号

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