TBQuant 事件驱动模型入门
如果你从文华麦语言或通达信公式过来,第一道坎是思维方式的转变: 公式语言是「逐 K 线、自上而下跑一遍公式」,而 TBQuant 的策略是事件驱动—— 你写的不是一整段公式,而是「当某件事发生时,要做什么」的回调函数。 理解了事件,TBQuant 就顺了。
什么是事件驱动
平台在不断产生「事件」:一根新 K 线闭合了、一个新的逐笔 Tick 来了、一笔委托成交了…… 你不用主动去查,而是把逻辑挂到对应的事件上,事件发生时平台自动调用你的代码。
类比:公式语言像「每节课都从头讲一遍」,事件驱动像「铃响了(事件)才去做对应的事」。
几个核心事件
| 事件 | 何时触发 | 典型用途 |
|---|---|---|
OnInit | 策略启动、初始化时(只一次) | 订阅数据源、设定时器 |
OnReady | 数据源准备完成后(只一次) | 对各数据源做设置、数据预处理 |
OnBar | 一根 K 线闭合时 | 主战场:绝大多数策略逻辑写在这里 |
OnBarOpen | 一根新 K 线刚开始时 | 在 K 线起点抢先发单 |
OnTick | 每来一个逐笔行情时 | 高频/精细化逻辑 |
OnOrder | 委托状态变化时 | 跟踪委托、撤单补单 |
OnFill | 委托成交时 | 记录成交、更新持仓 |
OnPosition | 持仓更新时 | 同步持仓、风控检查 |
OnTimer | 定时器到点时 | 周期性任务、定时撤单 |
新手 90% 的时间只需要关心 OnBar:每根 K 线走完,把你的策略逻辑在 OnBar 里跑一遍。
执行流程
策略启动 → OnInit(订阅数据/初始化)→ OnReady(数据就绪、设置)
↓
行情推动 → 每根 K 线闭合 → OnBar(你的策略逻辑)
↓
(期间若有逐笔)→ OnTick
↓
下单后 → OnOrder / OnFill / OnPosition(回报)
↓
策略退出 → OnExit
关键是:OnBar 会被反复调用,每次调用代表「一根新 K 线」。
所以你在 OnBar 里写的代码,语义就是「站在当前这根 K 线的角度,该怎么决策」。
一个最小策略
Params
Numeric FastLen(5);
Numeric SlowLen(20);
Vars
Numeric maFast;
Numeric maSlow;
Events
OnBar(ArrayRef<Integer> indexs)
{
maFast = AverageFC(Close, FastLen); // 计算快慢均线
maSlow = AverageFC(Close, SlowLen);
If (MarketPosition != 1 && CrossOver(maFast, maSlow))
Buy(1, Open); // 金叉买开
If (MarketPosition == 1 && CrossUnder(maFast, maSlow))
Sell(0, Open); // 死叉卖平
}
逐段读:
Params:可调参数(回测/实盘时能改),给了默认值5、20。Vars:策略里用的变量,每根 K 线重新计算。Events里的OnBar:每根 K 线闭合时执行——算均线、判断交叉、决定是否下单。MarketPosition表示当前持仓方向(1=多头),用它避免重复开仓。Buy / Sell是交易动作,CrossOver / CrossUnder判断交叉。
公式思维 vs 事件思维
| 公式语言(麦语言/通达信) | TBQuant 事件驱动 | |
|---|---|---|
| 代码组织 | 一整段顺序公式 | 按事件分的回调函数 |
| 触发方式 | 每根 K 线整体重算 | 指定事件发生时回调 |
| 表达力 | 相对简单 | 强(可写复杂控制流、对象) |
| 适合场景 | 指标、简单模型 | 复杂策略、多品种组合 |
小结
- 事件驱动 = 「某件事发生时,执行一段逻辑」,你写的是回调,不是整段公式。
- 新手主战场是
OnBar:每根 K 线闭合时跑一遍你的策略;OnInit/OnReady负责一次性准备。 Params设参数、Vars声明变量、Events写事件,三者构成一个策略的骨架。- 想看完整平台介绍,回 TBQuant 总览。
下一步
理解了事件驱动,接下来系统学习 TB 语言的数据类型与变量声明: TB语言类型与变量。