本文讲解如何从任务基础周期聚合出更粗的窗口 K 线,并在窗口闭合时执行跨周期逻辑。
任务的基础周期由页面决定,例如 1 分钟。更粗的周期用下面的接口从基础 K 线聚合出来。多个股票或 ETF 把代码放进 symbols,回调里用 bar.symbol 区分。
subscribe_bars
从基础 K 线订阅一根更粗的窗口 K 线。
写在 __init__ 里。引擎启动后订阅表冻结,写在 on_start 无效。页面参数会作为构造参数传入,签名要接住:
from qmfquant import Strategy
class MyStrategy(Strategy):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.subscribe_bars(
"15min",
symbols=["000001.SZ", "600000.SH"],
session_windows=[("09:30", "11:30"), ("13:00", "15:00")],
)
self.subscribe_bars(
"1h",
symbols=["000001.SZ", "600000.SH"],
session_windows=[("09:30", "11:30"), ("13:00", "15:00")],
)
接口:subscribe_bars(freq, callback=None, symbols=None, *, session_windows=None)
| 参数 | 输入 | 限制 |
|---|---|---|
freq |
str,必填 |
只能是整数分钟 "Nmin"、整数小时 "Nh"、日线 "1d",如 "3min"、"5min"、"15min"、"30min"、"1h"。不支持秒、周、月。必须粗于任务基础周期,相同或更细会报 ValueError |
symbols |
list[str] 或省略 |
省略表示全部标的。填写则只聚合这些代码,如 "000001.SZ"、"600000.SH" |
session_windows |
list[tuple[str, str]] 或省略 |
每项为 ("09:30", "11:30") 这种开始、结束时间。A 股连续竞价传 [("09:30", "11:30"), ("13:00", "15:00")],窗口不跨午休。同一 freq、标的范围有重叠时,这个参数必须完全相同,否则 ValueError |
callback |
方法或省略 | 省略时,闭合后调用 on_window_bar(bar)。传入 callback=self.on_daily 后,只进这个方法 |
返回值:None。
on_window_bar
窗口闭合时由框架调用。策略里重写它。
from qmfquant import Strategy
class MyStrategy(Strategy):
def on_window_bar(self, bar) -> None:
if bar.freq != "15min":
return
closes = self.get_history(20, bar.symbol, "close")
| 参数 | 输入 | 说明 |
|---|---|---|
bar |
Bar |
bar.symbol 是标的,bar.freq 是 "15min" 这类周期,bar.timestamp 是这根窗口的结束时间 |
限制:
- 每个标的单独回调,用
bar.symbol分状态。 - 它发生在闭合该窗口的那根基础 K 线的
on_bar之后。下单写在on_bar。窗口 K 线不参与撮合。 - 卖出仍用
get_available_position(),T+1 不变。
get_history 的 freq
取某一窗口周期已经闭合的历史。
写在 on_window_bar 或 on_bar 里。该周期必须已经 subscribe_bars。
closes = self.get_history(20, "600000.SH", "close", freq="15min")
| 参数 | 输入 | 限制 |
|---|---|---|
freq |
str 或省略 |
取值必须是已订阅的窗口标签,如 "15min"、"1h"、"1d"。在对应的 on_window_bar 里可以省略。这不是双流接口里的 "bar" / "tick" |
current_window(symbol, freq) 读取尚未闭合的当前窗口,只能在行情回调里调用,不会再触发回调。symbol、freq 的限制与上表相同。
相关阅读

评论
登录后参与讨论,与站内账号体系共用。