Home >  > 极智实盘测试

极智实盘测试

一、关于handledata的执行周期
日志输出如下:

[2026\7\31 21.57.25] [INFO][59]: 当前触发时间:20260731 220000
[2026\7\31 21.57.25] [INFO][59]: 60分钟线 - 时间: 20260731 15.000000 开盘: 2989.00 收盘: 2987.00
[2026\7\31 21.57.25] [INFO][59]: 日线 - 时间: 20260731 0.000000 开盘: 2997.00 收盘: 2987.00
[2026\7\31 21.59.4] [INFO][59]: 当前触发时间:20260731 220000
[2026\7\31 21.59.4] [INFO][59]: 60分钟线 - 时间: 20260731 15.000000 开盘: 2989.00 收盘: 2987.00
[2026\7\31 21.59.4] [INFO][59]: 日线 - 时间: 20260731 0.000000 开盘: 2997.00 收盘: 2987.00
[2026\7\31 22.0.1] [INFO][59]: 当前触发时间:20260731 230000
[2026\7\31 22.0.1] [INFO][59]: 60分钟线 - 时间: 20260803 22.000000 开盘: 2991.00 收盘: 2972.00
[2026\7\31 22.0.1] [INFO][59]: 日线 - 时间: 20260731 0.000000 开盘: 2997.00 收盘: 2987.00
[2026\7\31 22.0.3] [INFO][59]: 当前触发时间:20260731 230000
[2026\7\31 22.0.3] [INFO][59]: 60分钟线 - 时间: 20260803 22.000000 开盘: 2991.00 收盘: 2972.00
[2026\7\31 22.0.3] [INFO][59]: 日线 - 时间: 20260731 0.000000 开盘: 2997.00 收盘: 2987.00

结论:
1.handledata按tick执行。
2.60m的按60m执行
查看极智回测显示的k线,(2989.00 2987.00),(2991.00 2972.00)就是rb2609的1小时k线的数据。
(开盘: 2997.00 收盘: 2987.00)就是日线的数据。
3.当前触发时间:20260731 220000后来显示23:00,因为context.dateTimeStamp() 返回的是触发本次 handle_data 执行的那个事件所对应的时间戳,本例中就是60m。

测试代码

import talib

def initialize(context):
    context.contract = Symbol()
    SetBarInterval(context.contract, 'M', 60, 'A')
    SetBarInterval(context.contract, 'D', 1, 'A')      
    # 设置实盘运行
    SetActual()   
    SetTriggerType(5)    

def handle_data(context):
    contract = context.contract

    # ---------- 获取数据数组 ----------
    open_240_arr = Open(contract, 'M', 60)
    close_240_arr = Close(contract, 'M', 60)
    open_D_arr = Open(contract, 'D', 1)
    close_D_arr = Close(contract, 'D', 1)

    # 检查数据长度是否至少为2(确保存在上一根K线)
    if len(open_240_arr) < 2 or len(open_D_arr) < 2:
        LogInfo("数据不足,240分钟线数量:%d,日线数量:%d" % (len(open_240_arr), len(open_D_arr)))
        return

    # ---------- 打印当前触发时间 ----------
    ts = context.dateTimeStamp()  #根据极智量化 API 手册(第 129 页),context.dateTimeStamp() 返回的是触发本次 handle_data 执行的那个事件所对应的时间戳。
    ts_str = str(ts)
    date_str = ts_str[:8]
    time_str = ts_str[8:14]
    LogInfo("当前触发时间:%s %s" % (date_str, time_str))

    # ---------- 获取上一根240分钟K线的价格和时间 ----------
    open_240 = open_240_arr[-2]
    close_240 = close_240_arr[-2]

    # 使用 HisBarsInfo 获取最近2根K线的详细信息,取索引 -2 为上一根
    bars_240 = HisBarsInfo(contract, 'M', 60, 2)
    if len(bars_240) >= 2:
        prev_240 = bars_240[-2]
        date_240 = prev_240['TradeDate']                 # 整数日期,如 20260731
        dt_240 = str(prev_240['DateTimeStamp'])          # 字符串,如 "20260731113000000"
        # 提取时间部分 HHMMSS
        if len(dt_240) >= 14:
            time_240_str = dt_240[8:14]                  # "113000"
            time_240 = float(time_240_str[:2] + "." + time_240_str[2:4] + time_240_str[4:6])  # 转为 0.113000
        else:
            time_240 = 0.0
    else:
        date_240 = 0
        time_240 = 0.0

    LogInfo("60分钟线 - 时间: %d %.6f  开盘: %.2f  收盘: %.2f" % (date_240, time_240, open_240, close_240))

    # ---------- 获取上一根日线的价格和时间 ----------
    open_D = open_D_arr[-2]
    close_D = close_D_arr[-2]

    bars_D = HisBarsInfo(contract, 'D', 1, 2)
    if len(bars_D) >= 2:
        prev_D = bars_D[-2]
        date_D = prev_D['TradeDate']
        dt_D = str(prev_D['DateTimeStamp'])
        if len(dt_D) >= 14:
            time_D_str = dt_D[8:14]
            time_D = float(time_D_str[:2] + "." + time_D_str[2:4] + time_D_str[4:6])
        else:
            time_D = 0.0
    else:
        date_D = 0
        time_D = 0.0

    LogInfo("日线 - 时间: %d %.6f  开盘: %.2f  收盘: %.2f" % (date_D, time_D, open_D, close_D))

存在的问题:handledata还是每一个tick触发一次。
原因:
极智量化的实盘运行机制如下:

在实盘中,SetTriggerType(5) 代表“K线数据变化触发”。

行情每来一个 Tick(分笔),当前这根 60 分钟 K 线的高开低收等数据就会实时更新(即“数据发生变化”)。

由于您没有设置发单方式,系统默认使用了“实时发单”模式(等同于 SetOrderWay(1))。在该模式下,每一个 Tick 的更新都会触发策略执行 handle_data。

解决方案:
现状:SetTriggerType(5) + 默认实时发单 = 每个 Tick 触发。

修正:SetTriggerType(5) + SetOrderWay(2) = 每根 K 线收盘后触发一次。

添加下面的代码:

    # 添加这一行:设置 K 线稳定后发单(实盘下 K 线走完才触发一次)
    SetOrderWay(2) 

暧昧帖

本文暂无标签