- UID
- 2
- 积分
- 2892617
- 威望
- 1396340 布
- 龙e币
- 1496277 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
再谈TB信号丢失
- 之前博文“我对关于TB交易信号丢失的理解”中谈到由于没有处理到一根bar上最后一个tick数据,从而丢失了图表交易信号。最近在TB开发的过程发现,导致图表交易信号丢失还不止这个原因,有时莫名其妙的也会丢失,本文不再讨论其原因,因为牵扯TB内部机制的原因不好去探究,也没有太大必要,我仅讨论一下信号丢失后会出现的一些问题。
- 之前,我还是说说TB提供给用户的接口分图表接口和交易接口(我自己命名的,不知道准确不)。图表接口就是和超级图表相关联的系统变量,函数等等,比如buy(),MarketPosition,EntryTime等。而交易接口就是单纯相关于账户的交易的一些函数,就是我们通常所说的A_开头的函数,比如A_SendOrder,A_OrderBuyOrSell,A_OpenOrderTime等。图表接口和交易接口其实是相关联的,我理解的是图表接口将交易接口封装其内,包括了:1,某些逻辑控制;2,调用交易接口进行交易;3,绘图等步骤。举个例子,buy函数内部可能就做了以下操作:
- Bool Buy(Numeric Share=0,Numeric Price=0)
- {
- //逻辑控制:
- 1.每根Bar上只进行一次交易
- 2.MarketPosition = 0 时,该函数按照参数进行多头建仓。
- 如果当前持仓状态为空仓,即MarketPosition = -1 时,该函数平掉所有空仓,同时按照参数进行建 仓,两个动作同时发出。
- 如果当前持仓状态为多仓,即MarketPosition = 1 时,该函数将继续建仓,但具体是否能够成功建仓要取决于系统中关于连续建仓的设置,以及资金,最大持仓量等限制。
- 当委托价格超出k线的有效范围,在历史数据上,将会取最接近的有效价格发单;在实盘中,将会按照实际委托价格发单。
- //调用交易接口:
- A_SendOrder(Enum_Buy,Enum_Entry,Share,Price)
- //绘制交易信号,盈亏连线等
- }
- 而A_开头的交易接口则直接与交易平台接口相关联,对于其调用,功能相对独立,没有封装太多的处理,封装的部分也仅仅和交易所回报相关。
- 因此,图表接口用于历史回测,交易接口用于实盘交易。虽然这句话反复的在各个TB教程里提及,不过很多使用者仍没有好好理解,因此在程序开发的过程中出现问题,特别就是前面所提及的信号丢失的问题,下面我们就来讨论。
- 举个例子,MarketPosition,每个人都知道,当MarketPosition值为-1时,当前位置为持空仓;0,当前位置为持平;1,当前位置为持多仓。 有很多示例代码也这样表示:
- If(MarketPosition==1) // 有多仓的情况
- {
- if(满足策略条件)
- {
- sell();//平仓
- }
- }
- 这种代码片段乍一看一点问题也没有,不过在交易信号丢失的时候,问题就大了。我们知道,在实盘中,最后一根bar上的每一个tick信号到来时,程序都将执行一次,这时如果触发了buy函数,他还是会调用交易接口去交易的,只是交易成功后,后面的tick数据再触发buy函数时,由于上文讨论到的内部封装的逻辑控制“每根Bar上只进行一次交易”,因此不会重复发单而已。然后,当最后一个tick到来形成最后一根bar时,不论是什么原因只要是造成了交易信号丢失,那么就算是之前你buy成功了,也就是说持仓是多仓,MarketPosition仍然为0,因为MarketPosition是图表接口的变量,他的值取决于图表上的信号。
- 这样的话,你已经持有多仓,结果If(MarketPosition==1)永远不能满足,你的平仓条件就设为虚有了。
- 总之,图表接口只用于历史回测,以及在实盘中基于图表数据的一些策略编写,交易策略以及执行,必须用A_函数自行控制。比如上述代码段改为:
- LastIndex=A_GetLastOrderIndex(Enum_Buy,Enum_Entry);//获取上一个开多仓的报单索引
- if(A_OrderStatus(LastIndex)==Enum_Filled)//报单已经成交,也就是说开多仓成功的情况
- {
- if(满足策略条件)
- {
- //平仓
- }
- }
复制代码 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|