行情与交易函数

策略的本质是「读行情 → 做判断 → 下单」。本章把 TBQuant 里最常用的行情数据和交易函数讲清楚, 掌握这些就能写出能跑的双均线级别的策略。

Bar 行情数据

OnBar 里可以直接引用当前 K 线(Bar)的行情数据,它们都是序列,可用 [N] 回溯:

数据含义
Open开盘价
High最高价
Low最低价
Close收盘价
Vol成交量
OpenInt持仓量(期货)
Time当前 Bar 时间
Date当前 Bar 日期
CurrentBar当前 Bar 序号(从 0 开始)
Numeric yestClose = Close[1];     // 上一根 Bar 的收盘价
Numeric barIdx    = CurrentBar;   // 当前是第几根 K 线

OnBar 中,Close 指当前这根 K 线的收盘价。历史回测时它已确定;实盘的最后一根 Bar 上它随行情变动—— 因此用 CrossOver(Close, ...) 判断穿越要小心信号闪烁,官方建议改用 High/Low 判断突破。

实时盘口函数(Q_ 系列)

实盘或看盘时,要取实时盘口数据(非 K 线),用 Q_ 前缀函数:

函数含义
Q_Last最新价
Q_AskPrice / Q_AskVol卖一价 / 卖一量
Q_BidPrice / Q_BidVol买一价 / 买一量
Q_UpperLimit / Q_LowerLimit涨停价 / 跌停价
Q_TotalVol / Q_TurnOver当日成交量 / 成交额
Q_OpenInt当日持仓量

Q_ 系列是实时快照,回测(历史 Bar)里通常没有意义,主要用于 OnTick 或实盘精细下单。

四个交易函数

TBQuant 用四个函数覆盖期货的「开多/平多/开空/平空」:

函数动作持仓变化
Buy(Share, Price)多头建仓(买开)持仓 → 多
Sell(Share, Price)多头平仓(卖平)多 → 平
SellShort(Share, Price)空头建仓(卖开)持仓 → 空
BuyToCover(Share, Price)空头平仓(买平)空 → 平

函数签名(四个一致):

Bool Buy(Numeric Share=0, Numeric Price=0, Integer signalFlag=0)
  • Share:手数。0 表示用系统设置的手数;Sell/BuyToCover 省略时平掉全部该方向持仓。
  • Price:委托价。0 表示现价(历史 Bar 上取 Close);填 Open/Close 用对应价。
  • 返回 Bool,执行成功为 True
Buy(1, Open);          // 用开盘价买开 1 手
Sell(0, Close);        // 用收盘价平掉所有多头
SellShort(2, 4000);    // 用 4000 的价格卖开 2 手
BuyToCover(1, 0);      // 用现价买平 1 手

智能切换:若当前持空仓时调用 Buy,平台会先平掉所有空仓再开多(除非设置了允许双向持仓)。

持仓状态 MarketPosition

MarketPosition 表示当前持仓方向,是判断「该不该开/平仓」的关键:

含义
1持有多头仓位
0空仓(持平)
-1持有空头仓位

典型用法——只在空仓时开仓,避免重复加仓:

If (MarketPosition != 1 && CrossOver(maFast, maSlow))
    Buy(1, Open);

配套的还有 Position(持仓结构体,含手数、均价、盈亏等),在 OnPosition 事件里更新。

账户资金函数

需要查账户资金时用 A_ 前缀函数:

函数含义
A_FreeMargin可用资金
A_CurrentEquity动态权益
A_TotalMargin占用保证金
A_ProfitLoss浮动盈亏(按结算价)

这些函数按账户返回,多账户时配合 A_AccountID 等指定账户。

完整示例:双均线策略

Params
    Numeric FastLen(5);
    Numeric SlowLen(20);
    Numeric Lots(1);
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(Lots, Open);                 // 金叉买开
        If (MarketPosition == 1 && CrossUnder(maFast, maSlow))
            Sell(0, Open);                   // 死叉全平
    }

小结

  • 行情用 Open/High/Low/Close/Vol(Bar 数据),实时盘口用 Q_ 系列。
  • 四个交易函数:Buy(买开)、Sell(卖平)、SellShort(卖开)、BuyToCover(买平)。
  • MarketPosition 判断持仓方向,避免重复开仓;账户资金用 A_ 系列。

下一步

策略里除了行情和交易,还需要统计指标(均线、标准差、交叉判断)来做决策信号: 统计与指标函数