龙听期货论坛's Archiver

C
+
+


 微信: QQ:

龙听 发表于 2017-11-1 16:27

深刻理解TB的执行流程(转)

[p=21, 2, left]断断续续接触TB一个多月了,乍看之下,TB似乎比较简单,就是一个Bar一个Bar地去运行自己编写的公式。
通过模拟帐户测试了一段时间,才发现有很多东西需要进一步去弄清楚。

问题:TB在历史数据测试中的运行机制和交易时间的运行机制有何区别?
下面是我的理解,请大家来不断修改和完善。我认为,很多交易程序中的问题,都是由于对TB的运行机理不清楚而埋下了隐患。

[b]【在历史数据测试时】[/b]假设商品样本中有2000条K线,TB的执行过程是:
1、先显示出2000条K线。此时,由于有历史数据,[b]每根K线的数据都是现成的[/b]。最后一根K线,也是历史数据。[b]所有的数据都是静止的,也没有新的数据进来[/b]。
2、从第一条K线开始(最左边的一条),[b]开始执行交易公式,读取参数值。然后,初始化局部变量[/b],执行begin和end之间的代码。
3、然后,[b]进入下一根K线(Bar),再初始化局部变量[/b],执行begin和end之间的代码。
4、依次处理所有的K线。
5、在某根K线上,[b]发现符合开仓条件,于是在超级图表上显示出开仓标识,并修改marketposition的值[/b]。
6、继续运行下面的K线。
7、在某根K线上,发现符合平仓条件,于是在超级图表上显示出平仓标识,并在开仓和平仓价之间画出连线。若该笔交易盈利,则用红色连线,若该笔交易亏损,则用绿色连线。
8、继续运行后面的K线,直到最后一条。[/p][p=21, 2, left]
值得注意的是:
1、由于是历史数据,[b]每根Bar都是现成的,是没有Tick的概念的[/b]。交易代码,在每根bar上运行一遍。
2、由于参数是不能动态改变的,所以,虽然也是程序代码的一部分,但[b]没有必要在每根Bar上都读取一次[/b]。[b][color=#ED1C24]只在第一根Bar上读取参数,以后共用即可。
[/color][/b]3、由于是历史数据,不会再发生改变,所以,不会出现信号时有时无的现象。
4、由于是历史数据,[b]没有买卖盘的动态数据,所以,不会出现滑点,也不会出现成交不了的现象[/b]。
[/p][p=21, 2, left] [/p][p=21, 2, left]
[b]【在交易时间前启动自动交易】[/b]假设商品样本中有200条数据,假设在开盘前2分钟启动TB的自动交易,TB的执行过程是:
1、[b]对于已经存在的200条K线,第一根的BarStatus是0,中间的是1,最后面一根是2[/b]。对于BarStatus小于2的K线,只在每根Bar上运行一次交易代码。
2、从第一根K线,直到第200根K线,在每根K线上运行一次交易代码。如果发现某些K线符合开仓或平仓条件,[b]只是显示标识符号,但不实际发出交易指令,因为还没开盘。
[/b]3、[b]开盘后,分笔交易数据(tick)开始传过来。[color=#ED1C24]为了保持实时性,TB就必须对每个tick做出响应,就是在每个tick都运行一次程序代码。
[/color][/b]由此可见,[b]交易时间里,每根最新的Bar上,程序代码都被多次执行。这一点,和历史数据测试时明显不同[/b]。
4、[b]由于在最新的一根bar上,交易代码反复被Tick数据触发,而此时下一根bar还没出现,这条Bar的数据中,除了开盘价之外,其他的比如:收盘价、最高价、最低价都在随着每个Tick的变动而变动[/b]。当下一根K线出现的瞬间,这条Bar的所有数据才能被确定下来。
如果交易代码中的开平仓条件中,用到了close、high、low,则有可能使信号时有时无。同样的一根Bar上,[b]由于主力的拉升,价格突然走高,符合了买入条件,该Tick出现后,交易代码执行一次,发现符合买入条件,就发出买入指令。下一笔,价格又被打压下来,再次执行交易代码,买入条件又不符合了,但刚才的买入指令已经发出去了,甚至已经成交了。价格如此反复几次,就会在该Bar上反复买入多次[/b]。从而形成反复开仓。如果该Bar最终定型时,价格被打压回来了,超级图表上在该Bar上是不会显示任何交易信号的,[b]但实际上,却在该Bar上买入了多次。[/b][/p][p=21, 2, left] [/p][p=21, 2, left][b] [/b][/p][p=21, 2, left]

[b]【在交易时间内启动自动交易】[/b]假设商品样本中有200条数据,假设在开盘后2分钟启动TB的自动交易,TB的执行过程是:
1、[b]读取出200条Bar,其中,有2条还是开盘后刚产生的[/b]。
2、在前199根Bar上,每根Bar上执行一次交易代码。如果发现某些Bar上符合开平仓条件,仅仅显示交易信号,[b]但不实际发出交易指令。因为你迟到了,刚才的行情已经成为历史了[/b]。
3、在新的Bar上,依据Tick去运行交易代码。
[b][color=#ED1C24]由此可见,TB的交易指令,应该只能在Barstauts=2且有行情数据时才能发出。这一点,应该是TB内部的运行机制,不需要我们在TB代码中去再写一遍。
[/color][/b]
根据以上的分析,可得知:
1、如果交易代码中,在开平仓指令外假如if(barstatus==2),则在历史数据测试中,就不会显示出交易信号。因为除了最后一根bar之外,前面的Bar都不复合条件。但这样的代码,在交易开始后,是可以正常运作的。
问题是,加上这个条件有什么用呢?
在历史数据测试中,加上显示不了信号;在交易时间,TB又仅仅处理最新的一根Bar中的Tick,加了也没用。经常看到别人在代码中加上barstatus==2,不知道是想干什么用。
2、使用最新Bar的数据去做判断(Open除外),容易引发误开仓或反复开仓。要消除,在买卖条件中,就只能用前面K线的数据去做判断,或使用high>high[1],low<low[1]之类的判断。

上面是我对TB运行机制的一些粗浅理解,望高手对其中的错误之处给与纠正。谢谢![/p][p=21, 2, left][/p]关于MarketPosition实盘中的执行描述的对话[color=#323e32][font=simsun][table]
[tr][td][p=18, 2, left]回复海风 9:08:30
请教个问题,marketposition,在我开平仓后,下一个Tick过来的时候是不是它的值就改变了,还是要等K线走完?
回复交易开拓者 9:13:28
TB的公式是从上向下算的。并且每一个TICK去运算一次
回复海风 9:13:41
这个我明白
回复交易开拓者 9:14:01
这样一来。[b]MARKETPOSITION在某一个TICK发出了信号了,改变之后,可是下一个TICK来了,整个公式还会从头算起。
[/b]回复海风 9:14:44
那此时它是多少呢,假设原来是0,我现在开仓,它变成1,后一个tick来的时候它是多少呢?
回复交易开拓者 9:17:31
你的公式一开始还是这个BAR最开始的那个初始值的状态为0,
回复交易开拓者 9:17:46
然后算到开仓的部分,他就改变为1。
回复交易开拓者 9:18:04
下一个TICK来了,他还是从0开始计算。
回复海风 9:18:45
[b]这样是不是说,如果想盘中开仓,一定要自己用全局变量来控制,否则就会重复发单?
回复交易开拓者 9:18:52
不会
[/b]回复交易开拓者 9:19:06
机制有控制的。
回复海风 9:20:01
[b]就是说,在这个tick开了仓,下个tick过来的时候再次执行到开仓位置会先判断是不是已经开过仓了?
回复交易开拓者 9:20:09
如果你的上一个TICK是有发过单的,该TICK满足了条件便不会再发单的
[/b]回复交易开拓者 9:20:26
所以说你要保证信号不消失不反复就不会重复发单了。
回复海风 9:20:34
空上明白了
回复海风 9:20:38
这个
回复交易开拓者 9:21:28
[b]但是如果你的公式写法有信号消失的问题。那么某个TICK上发过单了,但是中间有几个TICK信号是消失了。然后再出来的TICK有信号了,他就不会记得之前有开过仓,于是再次发单[/b],
[/p][p=18, 2, left]回复海风 9:22:31
了解了,谢谢.另外一个问题.
同一个Tick里marcketpostion会不会即时更新,如
if(marketposition==1)
sell;
if(marketposition==1)
sell;
这样会不会在一个tick里平两次?(假设我有我余的持仓)
回复交易开拓者 9:22:49
不会
回复交易开拓者 9:23:18
除非你分别写两个平仓语句。
回复海风 9:23:49
分别写两个平仓语句是什么意思
回复交易开拓者 9:25:02
比如你现在有两个手多仓
if(condition1)
{
sell(1,close);
}
if(condition2)
{
sell(1,close);
}
这样就可能在同一个BAR上平两个仓
回复海风 9:26:06
如果我开仓时是buy(1);并且帐户上有多余的多单,会怎么样?
回复海风 9:26:28
这两个平仓条件里我都会加入marketposition==1的判断.
回复交易开拓者 9:27:41
只有一手的话,没法出两个平仓单的
回复海风 9:28:30
即使有多余持仓也不会平出?
回复交易开拓者 9:28:37
是的
回复海风 9:28:58
[b]这样就是说模型只会计算自己的持仓情况了.
回复交易开拓者 9:29:23
是的,他只看图表上的信号来计算,不会知道你的交易帐户里有多少的持仓
[/b]回复海风 9:29:49
非常感谢,越来越佩服TB的机制了[/p][/td][/tr]
[/table][/font][/color]

页: [1]