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:可调参数(回测/实盘时能改),给了默认值 520
  • Vars:策略里用的变量,每根 K 线重新计算。
  • Events 里的 OnBar:每根 K 线闭合时执行——算均线、判断交叉、决定是否下单。
  • MarketPosition 表示当前持仓方向(1=多头),用它避免重复开仓。
  • Buy / Sell 是交易动作,CrossOver / CrossUnder 判断交叉。

公式思维 vs 事件思维

公式语言(麦语言/通达信)TBQuant 事件驱动
代码组织一整段顺序公式按事件分的回调函数
触发方式每根 K 线整体重算指定事件发生时回调
表达力相对简单强(可写复杂控制流、对象)
适合场景指标、简单模型复杂策略、多品种组合

小结

  • 事件驱动 = 「某件事发生时,执行一段逻辑」,你写的是回调,不是整段公式。
  • 新手主战场是 OnBar:每根 K 线闭合时跑一遍你的策略;OnInit/OnReady 负责一次性准备。
  • Params 设参数、Vars 声明变量、Events 写事件,三者构成一个策略的骨架。
  • 想看完整平台介绍,回 TBQuant 总览

下一步

理解了事件驱动,接下来系统学习 TB 语言的数据类型与变量声明: TB语言类型与变量