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

问题描述:
使用多周期策略,比如15分钟、1小时多周期MA均线,建立2个BarGenerator的实例,建立2个ArrayManager的实例,但MA计算数值比实际值偏小。
代码如下:
class XXXStrategy(CtaTemplate):
...
def init(self, cta_engine, strategy_name, vt_symbol, setting):
....
self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar) # 15分钟K线生成器
self.bg_1h = BarGenerator(self.on_bar, 60, self.on_1hour_bar) # 1小时K线生成器

       self.am = ArrayManager(28) # 15分钟K线数据管理器
       self.am_1h = ArrayManager(28)  # 1小时K线数据管理器

.....
def on_init(self):
self.load_bar(14)

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

....
def on_1hour_bar(self, bar: BarData):
"""
"""
self.am_1h.update_bar(bar)
.....

def on_15min_bar(self, bar: BarData):
....
       self.am.update_bar(bar)
....
def on_tick(self, tick: TickData):
    ....
      self.bg.update_tick(tick)  # 更新15分钟K线
      self.bg_1h.update_tick(tick)  # 更新1小时K线

.....

使用 h1_fast_ma = self.am_1h.sma(self.fast_window, array=True)
h1_slow_ma = self.am_1h.sma(self.slow_window, array=True)
fast_ma = self.am.sma(self.fast_window, array=True)
计数MA均线,但MA计算数值比实际小。
请帮忙,谢谢了。

Member
avatar
加入于:
帖子: 1870
声望: 142

请打印一下您的am_1h中的close价格数据,以及对应您预期正确的均线计算结果?

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

期货市场的非连续交易时段的小时K线聚合。需要按09:00-10:00 10:00-11:15 11:15-14:15 14:15-15:00 21:00-22:00 22:00-23:00 的时间间隔分别聚合成1小时线,如下代码可解决问题:
def update_bar_hour_window(self, bar: BarData) -> None:
"""处理期货市场的非连续交易时段的小时K线聚合"""

    # 定义交易时段分割点(分钟数)和对应的开始时间
    SESSION_BOUNDARIES = {
        # 日盘
        (9*60, 10*60): (9, 0),    # 09:00-10:00
        (10*60, 11*60+15): (10, 0),  # 10:00-11:15
        (11*60+15, 14*60+15): (11, 15),  # 11:15-14:15
        (14*60+15, 15*60): (14, 15),  # 14:15-15:00
        # 夜盘
        (21*60, 22*60): (21, 0),  # 21:00-22:00
        (22*60, 23*60): (22, 0)   # 22:00-23:00
    }

    current_minutes = bar.datetime.hour * 60 + bar.datetime.minute

    # 确定当前属于哪个交易时段
    current_session = None
    for (start, end), (session_hour, session_minute) in SESSION_BOUNDARIES.items():
        if start <= current_minutes < end:
            current_session = (start, end, session_hour, session_minute)
            break

    # 如果不是交易时段,忽略该数据
    if not current_session:
        return

    start_min, end_min, session_hour, session_min = current_session

    # 如果没有小时K线或已进入新交易时段,创建新K线
    if not self.hour_bar or current_minutes == start_min:
        dt = bar.datetime.replace(
            hour=session_hour,
            minute=session_min,
            second=0,
            microsecond=0
        )

        self.hour_bar = BarData(
            symbol=bar.symbol,
            exchange=bar.exchange,
            datetime=dt,
            gateway_name=bar.gateway_name,
            open_price=bar.open_price,
            high_price=bar.high_price,
            low_price=bar.low_price,
            close_price=bar.close_price,
            volume=bar.volume,
            turnover=bar.turnover,
            open_interest=bar.open_interest
        )
    else:
        # 更新当前小时K线的数据
        self.hour_bar.high_price = max(self.hour_bar.high_price, bar.high_price)
        self.hour_bar.low_price = min(self.hour_bar.low_price, bar.low_price)
        self.hour_bar.close_price = bar.close_price
        self.hour_bar.volume += bar.volume
        self.hour_bar.turnover += bar.turnover
        self.hour_bar.open_interest = bar.open_interest

    # 检查是否到达交易时段结束点
    if current_minutes == end_min - 1:  # 处理最后一分钟的数据
        # 完成当前小时K线并调用处理函数
        finished_bar = self.hour_bar
        self.on_hour_bar(finished_bar)

        # 重置小时K线
        self.hour_bar = None
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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