pro111 发表于 2015-5-24 15:13:36

关于全局变量的一个意见

在整个的TBL中,要想像在C语言中那样方便的使用一个变量非常困难。
在C 或者C++中,只要你定义了一个变量,这个变量会始终保持最后一次的赋值,并且定义和使用非常方便。但是在TBL中,要想只用使用变量非常的麻烦。普通变量和序列变量,每个tick之后都会重新自动由程序将其变回初始值,所以根本不可能实现c语言中的特性,要想变量始终保持最后的赋值不变更,只能求助于全局变量。而说到全局变量的使用,我觉得非常的不方便,你只能通过SETGLOBALVAR和GETBLOBALVAR来赋值和取值,这样在引用和 参与运算时非常的不方便和不直观,你不能直观的知道每个全局变量表示的是什么意思。TBL的开发者们,你们能够感觉到这些弊端吗?请求你们改变或者增加一个类似于C语言中变量的功能,求你们了,你们的这种变量的定义和引用实在是太让人难以接受了。你们可以保留你们原来的所有的规则,但是无论如何求求你们增加一个类似C语言变量的使用功能吧。

a894554096 发表于 2015-6-23 17:49:24

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); }
根本控制不住重复发单  初始值就不知道放在那里才能不被初始化

edwardkm 发表于 2015-6-28 11:22:39

自己命名一下就直观了的,只是稍微绕一点儿,但也是能够接受的呀。像你这样使用,都乱不清谁是谁,当然不行。

BennyHuang 发表于 2015-7-26 09:03:28

本来TB的回测程序的思路就是每一个Bar重新循环一下,这已经非常方便了。 全局变量的使用自己把每个变量记下来就行了。 不能要求太多。

waveplayer 发表于 2015-10-29 11:37:55

我发现有楼主要求的童靴,都是准备开发高级策略的

ninibay1 发表于 2016-3-16 22:41:49

同意楼主的观点,没有全局变量没办法存储一段时间(多个bar时间内)计算得出的值的存放位置,全局变量倒是有函数,全局数组没办法实现。这一点真是憋屈死了,复杂一点点的策略没办法实现,语言设计上有严重的缺陷

efrog 发表于 2016-3-19 17:47:42

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]
查看完整版本: 关于全局变量的一个意见