龙听期货论坛's Archiver

龙听 发表于 2017-11-1 15:38

再谈TB信号丢失

[code]
  之前博文“我对关于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(满足策略条件)
    {
    //平仓
    }
}
[/code]

页: [1]