nopain 发表于 2011-3-1 16:01:37

TBV4公式升级说明

经过很长一段时间的开发和调试工作,TBV4终于快要正式发布了,感谢各位朋友一路以来的关注和支持,这次升级主要是公式平台的升级,修改可谓天翻地覆,杯具的就是,由于改动太多,没法直接兼容TBV3的公式以及导入导出文件,请大家谅解!

一、公式升级取消的功能点:
1、内建平仓指令:
    已删除8个内建平仓函数,准备等新版本稳定后以用户函数的形式提供类似功能。
2、保证金不足强平机制:
    旧版公式在测试和实际交易中,如果出现保证金不足的情况,会产生强制平仓的指令。考虑到保证金不足是以虚拟资金计算,如果设置不正确可能会导致实盘平仓的严重后果,所以取消该功能。
3、延迟发单机制:
    旧版通过交易函数中使用delay参数达到延迟到下一个Bar开盘发单的效果,在实际应用中,通过Delay参数只能使用NextOpen等未来函数来获取价格,整个设计过于复杂。考虑到可以通过获取上一个Bar的条件值来进行判断,在当前Bar开盘交易这种方法替代延迟发单的机制,决定取消该功能。
4、公式类型调整:
    用户字段,技术指标,K线型态,特征走势,交易指令这5种类型公式统一为公式应用,公式应用既可以输出线条,也可以进行交易。
5、公式的条件表达式取消无效值传递机制:
    旧版本中,如果 a = 无效值 , b = 100, 则 a + b = 无效值。+-*/等数学运算及> < 等逻辑运算表达式都支持无效值传递机制。
    新版本中,如果 a = 无效值,b = 100,则 a + b <> 无效值。所以不能再用旧版本的方法来进行无效值判断。
   进行这种调整是因为旧版本对所有的运算符进行了重载,但这种重载浪费大量的计算时间,导致公式执行效率低下,为了提高公式的运行效率,决定取消这种机制。
   在旧版本系统中,可能有以下类似的写法:
   bInBoardRange = (Open < Q_LowerLimit + 10*MinMove*PriceScale) Or (Open > Q_UpperLimit - 10*MinMove*PriceScale);
   在不是当天的Bar上,因为Q_LowerLimit和Q_UpperLimit是无效值,因此整个表达式都是无效值。bInBoardRange的值为False,所以能够正常使用。
   同样的代码,在新版中,由于没有无效值的传递机制,在不是当天的Bar上,bInBoardRange的值可能是True,系统不能正常的运行。
   为了处理这种情况,需要进行有效性判断,大致代码如下:
   bInBoardRange  = false;
   If(Q_UpperLimit != InvalidNumeric && Q_LowerLimit != InvalidNumeric)
   {
      bInBoardRange = (Open < Q_LowerLimit + 10*MinMove*PriceScale) Or (Open > Q_UpperLimit - 10*MinMove*PriceScale);
  }

二、公式升级增加的功能点:
1、叠加商品可以进行交易和测试:
    旧版本只能使用Buy(1,MyPrice);这样的语句进行交易,新版本可以使用Data1.Buy(1,MyPrice),以及Data1.MarketPosition这样的函数获取交易状态。大部分函数都支持使用Data#.前缀进行调用。
   这样可以方便的实现多个商品的,单个系统的组合测试,可以测试套利和对冲系统。
2、PlotNumeric,PlotString,PlotBool画线输出函数增加定位点参数:
    以PlotNumeric距离,其他类似,PlotNumeric的前两个参数保持不变,第三个参数修改为定位点参数,默认参数为0,其他的参数和旧版一致。
    当我们使用定位点函数时,对于PlotNumeric,将输出一条线段,连接定位点和输出值的点;PlotBool和PlotString将在指位置画出相应的内容。
3、增加投资组合函数:
    增加portfolio_XXX类型的函数,用户获取当前图表,当前公式应用对应的投资组合的状态和性能信息,原CurrentCapital用Portfolio_CurrentCapital代替。
4、序列变量自动传递最新值:【new】
     旧版本中为了序列变量的上一个Bar值,需要编写语句 MyVar = MyVar;
     新版本中变为自动传递,即可以省略这条语句,但随之带来的变化就是,序列变量的默认值,只会在第一个Bar有效。
5、Bar数据和序列变量在回溯越界时取值调整:【new】
     旧版本中,Bar数据和序列变量,序列参数等值,当回溯的索引越界是,即Value的nOffset > CurrentBar时,会是无效值。
     新版本中,这种情况下会用该数据源的第1个值代替。
6、叠加数据时补齐数据方式:【new】
     多个商品进行叠加时,可能在数据的前段出现某个商品有数据,但其他商品无数据,旧版本会使用无效值填充。
     新版本使用第一个有效的Bar的Open填充高开低收,成交量设置为0,持仓量设置为第一个有效Bar的持仓量。
7、公式应用全局变量扩容:
    单个公式应用的全局变量从50个扩充500个。
8、单个图表内多个公式之间的相关性:
   旧版本中,单个图表中的多个交易指令会相互影响,形成干扰。虽然利于将开平仓等指令进行模块化,但不利于利用资源。
   新版本中,单个图表中的多个公式应用就像以前的多个技术指标一样,不再有相关性。这样就可以很容易的单个图表驱动多个交易系统,节省电脑资源。
9、公式编译提速:
   调整旧版本所有公式联编的架构,客户修改用户函数时,需要重新编译所有的自定义公式应用,编译公式应用时,只需要编译当前公式应用即可。
   如果客户完全了解用户函数和公式应用的调用关系,在开发调试用户函数过程中先选择单独编译用户函数,等用户函数算法稳定之后,再全部编译一次,这样可以大幅提升系统开发速度。
10、交易策略参数优化提速:
   通过调整价格,公式运行速度得到近10倍的提升,并增加了多线程测试,在性能强劲的电脑上,可以达到旧版本几十倍的测试速度。可以考虑攒钱买32核电脑进行测试了。
   另外,交易策略的参数优化增加了参数淘汰率,要使用淘汰算法,需要将重要的参数放在前面,测试完一个参数之后,按比例淘汰较差的参数。提升测试效率。
11、投资组合测试报告:
   单个图表可以支持多个交易系统的执行,同时我们增加了对多个交易系统的测试报告组合分析。方便评估多个系统的组合效果。
12、公式导入导出中增加无源码模式:
    对于用户的公式应用,考虑到安全问题,我们增加了无源码加密的方式,将执行文件直接导入导出,方便交易系统的应用。为了控制时间和权限,用户可以在公式代码中增加时间验证和账户验证,这样编译后的公式在应用过程中再无后顾之忧。
13、讯号消失的处理机制调整:
    旧版本中,如果出现系统的讯号消失,会反复开仓,导致头寸完全混乱,并可能出现巨大的亏损。
    新版本中,对于用户操作失误写出的讯号消失的系统,第一次发单之后,不在重复发单,当出现讯号消失时,还会弹出提示,提醒用户修改系统代码。
14、循环代码体内调用序列函数的支持:
    函数代码内有使用序列变量或序列参数进行计算的称为序列函数,旧版本中在循环体内调用序列函数会出现计算出错的问题,新版本对于这种情况进行了修复。
    但要确保这种写法的正确执行,必须保证每个Bar,这个循环体的执行次数都是一样的。否则仍然会出现错误。同样的原理,If条件语句里面不能使用序列函数进行计算。
   下面是一个错误写法的例子:
   If(MarketPosition!=1 && CrossOver(Avg1,Avg2))
   {
       Buy....   
   }
   因为MarketPosition在等于1的情况下,会导致后面的语句不被执行,这样,就不是每个Bar都调用了该序列函数。就会出现数据计算出错。
   正确的写法如下:
    MyBuyCondition = CrossOver(Avg1,Avg2);
   If(MarketPosition!=1 && MyBuyCondition )
   {
      Buy...
   }
15、函数序列参数的输入值验证:
     旧版本中,CrossOver这样的函数,因为两个参数都是序列参数,只能使用两个序列变量,比如Avg1,Avg2作为参数进行传入。不能使用CrossOver(Close,1000)这样的写法。为此,旧版本中还增加了CrossOverHor这样的函数来处理这种情况。
     新版本中,可以直接传入普通值进行计算,甚至传入数据的回溯值。旧版本中CrossOver(Close,Avg1);这样的写法是正确的,但CrossOver(Close,Avg1)则是错误的,新版本则可以支持后面的写法。
16、用户函数中可以使用所有系统函数:
    这样可以很方便的封装交易指令和算法。
17、讯号发生的时间如果不在图表最后Bar时间的附近,将会被忽略。
    日线及以上周期要求讯号发生的日期和最后Bar的日期相同;
    1分钟及以上周期要求讯号发生的时间和最后Bar的时间误差不超过5分钟。
    Tick和10秒周期要求讯号发生的时间和最后Bar的时间误差不超过1分钟。
     通过这个时间限定,防止最后Bar上较早前的讯号在重新启动时发单。
18、使用引用参数的函数【new】
    旧版本在使用引用参数时可以传入序列变量,普通变量和引用参数值。
    新版本在使用引用参数时只能传入普通变量和引用参数值。
   

公式升级,改动较多,未能一一列出,等待继续完善!

dengwu 发表于 2011-3-1 16:17:26

好期待新版本啊  ,

yml0396 发表于 2011-3-1 17:09:46

非常需要:
1、叠加商品可以进行交易和测试:
    旧版本只能使用Buy(1,MyPrice);这样的语句进行交易,新版本可以使用Data1.Buy(1,MyPrice),以及Data1.MarketPosition这样的函数获取交易状态。大部分函数都支持使用Data#.前缀进行调用。这样可以方便的实现多个商品的,单个系统的组合测试,可以测试套利和对冲系统。
3、增加投资组合函数:
    增加portfolio_XXX类型的函数,用户获取当前图表,当前公式应用对应的投资组合的状态和性能信息。
只是希望TBV4比以前的版本皮实点,总感觉TB很好甚至是精美,可有点脆弱不皮实,也可能精美复杂的东西都不皮实,是我的要求太高了吧。

CFXQM 发表于 2011-3-1 17:43:05

期待新版本。
“最终目标文件编译错误”这个问题有没有解决?

nopain 发表于 2011-3-1 17:49:34

回复 4# CFXQM

应该是解决了

sq1974 发表于 2011-3-1 21:54:28

升级后,老版本的开拓者还能用吗

liq77 发表于 2011-3-2 11:19:16

本帖最后由 liq77 于 2011-3-2 11:20 编辑

请问在超级图表的贴页面设置中增添“线标序号”了吗?
即当前这根K线是从头数过来的第几根?——与当前K线的最高价最低价等并列显示在图表上方...

zhaopengtao 发表于 2011-3-2 13:14:24

什么时候发布啊?

nopain 发表于 2011-3-2 14:30:20

回复 7# liq77

没有增加这样的功能,如果需要,您可以在公式中添加一行
Commentary("Bar索引="+Text(CurrentBar));

CFXQM 发表于 2011-3-2 14:56:21

希望正式版出来时,能有一个完整的公式升级说明。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: TBV4公式升级说明