关于全局变量的一个意见
在整个的TBL中,要想像在C语言中那样方便的使用一个变量非常困难。在C 或者C++中,只要你定义了一个变量,这个变量会始终保持最后一次的赋值,并且定义和使用非常方便。但是在TBL中,要想只用使用变量非常的麻烦。普通变量和序列变量,每个tick之后都会重新自动由程序将其变回初始值,所以根本不可能实现c语言中的特性,要想变量始终保持最后的赋值不变更,只能求助于全局变量。而说到全局变量的使用,我觉得非常的不方便,你只能通过SETGLOBALVAR和GETBLOBALVAR来赋值和取值,这样在引用和 参与运算时非常的不方便和不直观,你不能直观的知道每个全局变量表示的是什么意思。TBL的开发者们,你们能够感觉到这些弊端吗?请求你们改变或者增加一个类似于C语言中变量的功能,求你们了,你们的这种变量的定义和引用实在是太让人难以接受了。你们可以保留你们原来的所有的规则,但是无论如何求求你们增加一个类似C语言变量的使用功能吧。 Params
Vars
NumericSeries SX;
NumericSeries DP;
NumericSeries KP;
//(CurrentTime-A_OrderTime)//平台时间-委托单时间
Begin
SX=20150701;
If(Date>=SX){setglobalvar(8,81);}
Else{setglobalvar(8,80);}
if(Getglobalvar(8)==80&&A_BuyPosition==0&&A_SellPosition==0&&(CurrentTime-A_OrderTime)>0.000020) //赋予初始值
{setglobalvar(0,0);
setglobalvar(1,10);
setglobalvar(2,20);
setglobalvar(3,30);
setglobalvar(4,40);
setglobalvar(5,50);}
If(A_BuyPosition==0&&A_SellPosition==0&&Getglobalvar(0)==0)
{ A_SendOrder(Enum_Buy, Enum_Entry, 1 ,Q_AskPrice ); //多头开仓
A_SendOrder(Enum_Sell, Enum_Entry,1 ,Q_BidPrice); //空头开仓
setglobalvar(0,1); }
根本控制不住重复发单 初始值就不知道放在那里才能不被初始化 自己命名一下就直观了的,只是稍微绕一点儿,但也是能够接受的呀。像你这样使用,都乱不清谁是谁,当然不行。 本来TB的回测程序的思路就是每一个Bar重新循环一下,这已经非常方便了。 全局变量的使用自己把每个变量记下来就行了。 不能要求太多。
我发现有楼主要求的童靴,都是准备开发高级策略的 同意楼主的观点,没有全局变量没办法存储一段时间(多个bar时间内)计算得出的值的存放位置,全局变量倒是有函数,全局数组没办法实现。这一点真是憋屈死了,复杂一点点的策略没办法实现,语言设计上有严重的缺陷 TB新增的数组可以作为变量传递给函数,可以解决全局数组的问题。
本人原来使用很多函数变量,现在改成数组传递后,函数的描述变得很简单。
关于TB不采用传统计算机语言的变量方式,是有其交易计算方式的特性决定的,变量每个Bar或Tick都要从头计算一遍。
当然,如果TB将公共变量的定义方式在改进一下,让其更直观,那就更好。
为解决公共变量读程序困难的问题(我曾经最多使用过50多个公共变量),我建议大家这样使用:
Vars
Numeric gPriceEnter;
Numeric gPriceExit;
Numeric gTopBott;
Numeric nSignal;
Begin
If (BarStatus==0 && GetGlobalVar(30)==InvalidNumeric) //初始化公共变量
{
SetGlobalVar(30,0); SetGlobalVar(31,0); SetGlobalVar(32,0);
}
gPriceEnter= GetGlobalVar(30); gPriceExit= GetGlobalVar(31); gTopBott = GetGlobalVar(32);
程序主体
SetGlobalVar(30,gPriceEnter); SetGlobalVar(31,gPriceExit); SetGlobalVar(32,gTopBott);
End
当然,前后两段如用函数的话,程序会更简洁。
页:
[1]