设为首页收藏本站

 找回密码
 注册
查看: 3422|回复: 6
打印 上一主题 下一主题

关于全局变量的一个意见 [复制链接]

Rank: 2

精华
0
UID
207304
积分
54
帖子
34
主题
13
阅读权限
30
注册时间
2015-4-17
最后登录
2020-5-21
跳转到指定楼层
1#
发表于 2015-5-24 15:13:36 |只看该作者 |倒序浏览
在整个的TBL中,要想像在C语言中那样方便的使用一个变量非常困难。
在C 或者C++中,只要你定义了一个变量,这个变量会始终保持最后一次的赋值,并且定义和使用非常方便。但是在TBL中,要想只用使用变量非常的麻烦。普通变量和序列变量,每个tick之后都会重新自动由程序将其变回初始值,所以根本不可能实现c语言中的特性,要想变量始终保持最后的赋值不变更,只能求助于全局变量。而说到全局变量的使用,我觉得非常的不方便,你只能通过SETGLOBALVAR和GETBLOBALVAR来赋值和取值,这样在引用和 参与运算时非常的不方便和不直观,你不能直观的知道每个全局变量表示的是什么意思。TBL的开发者们,你们能够感觉到这些弊端吗?请求你们改变或者增加一个类似于C语言中变量的功能,求你们了,你们的这种变量的定义和引用实在是太让人难以接受了。你们可以保留你们原来的所有的规则,但是无论如何求求你们增加一个类似C语言变量的使用功能吧。

Rank: 2

精华
0
UID
210252
积分
68
帖子
45
主题
11
阅读权限
30
注册时间
2015-6-1
最后登录
2015-8-20
2#
发表于 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); }
根本控制不住重复发单  初始值就不知道放在那里才能不被初始化

使用道具 举报

Rank: 4

精华
0
UID
208790
积分
269
帖子
187
主题
35
阅读权限
50
注册时间
2015-5-12
最后登录
2015-9-9
3#
发表于 2015-6-28 11:22:39 |只看该作者
自己命名一下就直观了的,只是稍微绕一点儿,但也是能够接受的呀。像你这样使用,都乱不清谁是谁,当然不行。

使用道具 举报

Rank: 2

精华
0
UID
213293
积分
97
帖子
85
主题
5
阅读权限
30
注册时间
2015-7-9
最后登录
2017-3-13
4#
发表于 2015-7-26 09:03:28 |只看该作者
本来TB的回测程序的思路就是每一个Bar重新循环一下,这已经非常方便了。 全局变量的使用自己把每个变量记下来就行了。 不能要求太多。

使用道具 举报

Rank: 1

精华
0
UID
221796
积分
3
帖子
3
主题
0
阅读权限
10
注册时间
2015-10-22
最后登录
2016-11-6
5#
发表于 2015-10-29 11:37:55 |只看该作者
我发现有楼主要求的童靴,都是准备开发高级策略的

使用道具 举报

Rank: 1

精华
0
UID
229881
积分
1
帖子
1
主题
0
阅读权限
10
注册时间
2016-3-13
最后登录
2016-3-16
6#
发表于 2016-3-16 22:41:49 |只看该作者
同意楼主的观点,没有全局变量没办法存储一段时间(多个bar时间内)计算得出的值的存放位置,全局变量倒是有函数,全局数组没办法实现。这一点真是憋屈死了,复杂一点点的策略没办法实现,语言设计上有严重的缺陷

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
7#
发表于 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
当然,前后两段如用函数的话,程序会更简洁。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-17 12:33

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部