账户与股票池

程序化策略上实盘后,你要面对的不只是「什么时候开平仓」,还有「账户里有多少钱」「持仓了哪些品种」「怎么批量管理」。 本章讲金字塔的账户查询、股票池和模组管理。

一、账户资金查询 TACCOUNT

TACCOUNT(N) 读取当前登录账户的各项属性(只在最新 K 线有效):

N返回值
1账号 ID(字符串)
3资金余额
4浮动盈亏
6动态权益 / 资产值
19当前可用资金
28占用保证金(期货)/ 证券市值
29可取资金
30平仓盈亏
31手续费
IF NOT(ISLASTBAR) THEN EXIT;        { 账户函数只在最新 K 线有效 }
可用 := TACCOUNT(19);               { 当前可用资金 }
权益 := TACCOUNT(6);                { 动态权益 }

下单前先查可用资金,按比例计算下单手数,避免资金不足导致拒单。例如用可用资金的 50% 开仓。

二、多账户管理

一个金字塔实例可以同时登录多个账户(期货多账户、或期货 + 股票),用以下函数遍历:

函数含义
TACCOUNTCOUNT登录的账户总数(含无效)
TACCOUNTINDEX(N)第 N 个账户的 ID
TACCOUNT2(属性, 账号)查指定账户的某项属性

下单函数也支持指定账户:

TBUY(条件, 1, MKT, 0, 0, '账号A');    { 第 6 个参数指定账号 }

三、持仓查询

后台持仓查询在交易控制函数里介绍了 THOLDING/TBUYHOLDING/TSELLHOLDING,这里补充按账户和品种精确查询的版本:

函数含义
TBUYHOLDINGEX(账号, 代码, N)指定账户品种的多头持仓(N: 0 今可用/1 总可用/2 含未成交)
TSELLHOLDINGEX(账号, 代码, N)指定账户品种的空头持仓
THOLDCOUNT(账号)该账户持有的品种数量
THOLDINDEXLABEL(序号, 账号)持仓列表中第 N 个品种的代码

一个实用技巧——一键平掉账户所有持仓,遍历持仓列表逐个平仓:

IF NOT(ISLASTBAR) THEN EXIT;
HC := THOLDCOUNT('');
FOR I = 1 TO HC DO BEGIN
    代码 := THOLDINDEXLABEL(I, '');
    多仓 := TBUYHOLDINGEX('', 代码, 1);
    TSELL(多仓>0, 多仓, MKT, 0, 0, '', 代码), ALLOWREPEAT;
END

四、股票池

股票池是金字塔里的「品种筛选与管理」机制——一个池子包含多个状态池,符合条件(用公式定义)的品种自动进入对应状态。程序化策略可以读取股票池来决定交易哪些品种:

函数含义
TSTOCKPOOLCOUNT(池, 状态)某状态池里的品种数量
TSTOCKPOOLINXLABEL(池, 状态, N)池中第 N 个品种的代码
TSTOCKPOOLBARS(池, 状态)当前品种进入该池子几根 K 线了
FIRESTOCKPOOL(池, 状态)强制触发某状态池

典型用法——遍历股票池逐个交易:

FOR I = 1 TO TSTOCKPOOLCOUNT('我的池', 1) DO BEGIN
    代码 := TSTOCKPOOLINXLABEL('我的池', 1, I);
    { 对每个品种执行策略逻辑 }
END

股票池适合「多品种轮动」「板块择股」类策略——先用公式把符合条件的品种选进池子,再用后台策略批量执行。

五、模组管理

模组是金字塔的子账户管理单元,适合把大账户拆成多个独立子策略各自管理:

函数含义
GROUPCOUNT配置的模组总数
GROUPINDEX(N)第 N 个模组的 ID
GROUPINFO(2, ID)模组状态(0 未登录 / 1 登录 / 2 断开)
GROUPHOLDCOUNT(ID)该模组持有的品种数
GROUPHOLDING(ID, 代码, N, M)模组持仓(N: 0 买/1 卖/2 净,M: 1 总/2 今可用)

小结

  • TACCOUNT 查资金与权益,下单前先确认可用资金。
  • 多账户用 TACCOUNTCOUNT/TACCOUNTINDEX 遍历,下单函数可指定账号。
  • THOLDCOUNT + THOLDINDEXLABEL 遍历持仓实现一键全平。
  • 股票池做多品种轮动,模组做子账户隔离。

实盘管理之外,还有一类进阶函数——除权与期权,最后一章见 除权与期权函数