开拓者期货期权程序化系统交易论坛

标题: 能否举例通俗的解释一下 SetGlobalVar和 GetGlobalVar? [打印本页]

作者: ddbq    时间: 2007-8-18 02:13:15     标题: 能否举例通俗的解释一下 SetGlobalVar和 GetGlobalVar?

我对编程不熟,对于变量的赋值和局部变量全局变量等东西,理解很粗浅.

我在看老师写海龟交易系统的公式的时候,发现要用到
SetGlobalVar  设置某个索引的全局变量值
GetGlobalVar  获取某个索引的全局变量值


能否请斑竹举个简单的例子,通俗的解释一下 SetGlobalVar和 GetGlobalVar是什么意思?
作者: ddbq    时间: 2007-8-18 03:13:09

在斑竹写的海龟交易系统中,第11楼有这样一段代码:

Begin
        N = XAverage(TrueRange,Length);
        TurtleUnits = (CurrentCapital()*0.01) /(N * BigPointValue());
        TurtleUnits = IntPart(TurtleUnits);
        
        DonchianHi = Highest(Close[1],Length);
        DonchianLo = Lowest(Close[1],Length);
        
        If(CrossOver(High,DonchianHi))
        {
                // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
                myEntryPrice = min(high,DonchianHi + PriceScale*MinMove);
                Buy(TurtleUnits,myEntryPrice);
                IsEntryThisBar = True;
                SetGlobalVar(0,myEntryPrice);                        // 保存第一次开仓的价格

这最后一句为什么要写? 前面不是已经对 myEntryPrice 进行赋值,并保存在变量 myEntryPrice 中了吗?在后面直接引用和重新赋值不就行了吗?为什么还要来一句:
    SetGlobalVar(0,myEntryPrice);                        // 保存第一次开仓的价格
作者: ddbq    时间: 2007-8-18 03:20:10

我不是很明白,举例说吧
if(------------)
{
   ------------;
   ------------;
   ------------;
  a = 123;
}
难道在  if 语句后面的大括号里面第一次申明和赋值的变量(例如 变量a)都是属于局部变量吗?离开这个大括号之后就不能引用了吗? 是否使用个SetGlobalVar就把像a这样的局部变量转换为了可以在 其他地方引用的全局变量?
作者: ddbq    时间: 2007-8-18 03:26:26

自己找了点资料,请斑竹帮我看下,这个说明是否正确?

局部变量是在只有在“{”和“}”中间定义并起作用的变量,在内存中基本上是一堆栈形式存放的变量,只有程序运行到“{”时出现,离开“}”后消失的变量。
全程变量是定义在“{”和“}”之前的变量,基本上是在整个“{”和“}”之间都起作用的,但是如果在“{”和“}”之间也定义与之相同的变量的话,则程序运行到“{”和“}”之间时用的是在“{”和“}”定义的局部变量
如:
int x;
main()
{
    ...//使用全局变量x
    if(...)
    {
        int x;
        ...;//使用局部变量x
    }
}
程序运行到不同的过程不同的边另起作用
形参是放在函数名后的括号里面的变量,供函数之间传递数值使用。
作者: nopain    时间: 2007-8-18 09:18:45

系统目前提供50个全局变量。这50个全局变量附着在超级图表上,即一个图表可以有50个全局变量。您可以通过这些全局变量在技术指标及交易指令中进行数据交换。关掉超级图表之后及全部删除,新建一个超级图表,新建出50个初值为无效值的变量。用户自行通过GetGlobalVar,SetGlobalVar进行保存及获取数据的操作。全局变量不会因为当前Bar的变化而变化。

2楼的意思是:把myEntryPrice这个值存放到第一个全局变量里面,在其他使用的时候可以来取。

您下面的理解都和这个全局变量没有关系。在括号里面写,只是因为属于条件分支的处理代码。
作者: dc32168    时间: 2007-10-20 10:23:47

好贴,好好学习!!!!!!
作者: jvya    时间: 2007-11-30 15:39:34

有点明白了。谢谢啦
作者: 孤舟骑浪    时间: 2007-12-1 10:19:50

其实很理解的,局部变量是只在一个K线上起作用的变量,出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了。。。。。。
而全局变量,就是系统本身只定义了一个GlobalVar全局变量(其他语言中是可以由用户定义的),这个全局变量一共有0到50共51个存储位置,你希望在第一个位置放进一个数据(在本软件中一般放下的是静态数据,不因K线的移动而改变),就用setglobalvar(0,你的数),放进第二个数又不希望覆盖第一个,就用setglobalvar(1,你的数),最多能放下共51个静态数据;然后是引用这些数据了,就用getglobalvar(存储位置)等等,这个全局变量最起码是生存于当前的程序模块中,比如用户函数、技术指标、K形态、特征走势、交易指令中。以上是我个人的理解。
但我同样有疑惑,就是这个全局变量最大生存级别是什么,即到什么程度数据才被初始化,如果是退出交易者软件平台时才被初始化的话,那么两个以上的程序模块就可以调用这个全局变量的值了,也即要进行一个帐户交易多个商品的设想,就很有可能有点突破口了。
作者: 孤舟骑浪    时间: 2007-12-1 10:39:41     标题: 补充点,说错了

上面第一段的解释是指series序列变量,如果是没有series的定义的,装的是静态数据(不随K的移动的改变),这两种定义就是所谓的局部变量,其生存期是在当前运行的程序模块中(一个程序模块是指只有一次参数、变量声明的程序块).
由此推断,全局变量的生存期肯定比局部变量高一级,即各程序模块间是可以读取全局变量中的数的,不知对不对,由nopain最后解释吧.
作者: 孤舟骑浪    时间: 2007-12-1 13:53:20

可惜,看了nopain的5楼回帖,全局变量的存活级别是一个超级图表(应用于这个超级图表的所有技术指标或交易指令都可以读取全局变量中的数,其他的图表就不能跨图读取了),这就意味着一个帐户管理多个品种在这里是行不通的。
在海龟交易中,如果有加仓操作,当然需要一个全局变量来存储每一次开仓价(因为随着条件的反复出现,myEntryprice是被赋了新的值的),如果没有加仓操作,即每一次开仓接着下一步只有平仓,那么就没有用全局变量的必要了。
作者: nopain    时间: 2007-12-1 17:00:51

共有三种数字型的变量。
Numeric,NumericSeries及全局变量。

Numeric定义的变量只能在当前Bar有效,出了这个Bar就没有了!
NumericSeries在0-N个Bar上都有效,通过 [nOffset]可以取前面的值。

全局变量不仅在0-N上有效,并且上次计算和下次计算都一直有效。
您可以把全局变量想象成一个箱子,新建一个图表的时候,每个技术指标分配有50个箱子。
所有的交易指令共有50个箱子。这些个箱子都放在那里,里面都是空的。

然后开始进行公式的计算。多个技术指标之间不能进行全局变量的交换,但一个图上的多个交易指令间是可以进行全局变量的交换的。
在第一次计算中,根据我们对TB公式的理解,假设图上有100根K线,大家应该知道公式共被调用了100遍, 如果其中调用了SetGlobarVar或GetGlobarVar,就是对这些箱子进行存放或读取的操作,后面放的东西会代替开始放的。
在执行完一次之后,公式会在行情刷新时再次执行公式,您在上次计算时最后Bar存放在箱子里的值,可以在第一个Bar上使用。
作者: 孤舟骑浪    时间: 2007-12-1 19:35:10

我总结一下:即Numeric只存活在一个bar上,Numercseries分别存活在每个bar上(其实是Numeric的扩冲),全局变量存活在一个图表上,应用于同一张图表上的每个技术指标都可以有一个全局变量,技术指标间不能互相读取数据,而所有应用于同一张图表的交易指令只共用一个全局变量,交易指令间是可以交互读取全局变量中的数据的(这里的全局变量的使用范围有点乱哦,和别的语言定义的全局变量不太同啦,同学死记硬背就好了)。
纠正两点:一,这里的全局变量可以用的存储位置是51个(0~50),不信点点手指;二,后面放的东西会代替开始放的,这点似乎有误,应该是存取在同一个存储位置(索引值相同)的两个数值,后面的才会代替前面的。
在海龟中,myEntryprice只在当前Bar被赋值,以后的Bar又变回初值了(除非被重新赋值),为了以后可以重新使用这个开仓价,所以就把它放到全局变量中了(不要被我以前的理解搞糊涂哦)。
这个帖子是非常有意义的,可以了解最基础性的东西,对于下一步的系统设计就会得心应手的。大家一定要多看看啊。
作者: nopain    时间: 2007-12-2 09:51:17

共有50个全局变量,索引为0-49
作者: 孤舟骑浪    时间: 2007-12-2 13:27:32

呵呵,这是扫读种下的恶果.
作者: jvya    时间: 2007-12-4 17:48:31

当满足条件时(Condition)
给引全局变量赋新值,
否则,还用原先的赋值。
应该怎么办啊。
作者: 孤舟骑浪    时间: 2007-12-4 19:25:44

if(condition)
{x=新的值;
setglobleval(0,x);}
就这么简单,条件没满足,当然还是原来的值了.
作者: jvya    时间: 2007-12-5 10:02:19

原帖由 孤舟骑浪 于 2007-12-4 19:25 发表
if(condition)
{x=新的值;
setglobleval(0,x);}
就这么简单,条件没满足,当然还是原来的值了.


已收到,我谢了
这个解释简单易懂。

[ 本帖最后由 jvya 于 2007-12-5 10:03 编辑 ]
作者: 捕快    时间: 2009-5-16 20:18:09

if(condition)
{x=新的值;
setglobleval(0,x);}
就这么简单,条件没满足,当然还是原来的值了
作者: 捕快    时间: 2009-7-9 06:21:56

其实很理解的,局部变量是只在一个K线上起作用的变量,出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了,如果有其他赋值条件,又装下新的值了,再出了这根K线,又变回初值了。。。。。。
而全局变量,就是系统本身只定义了一个GlobalVar全局变量(其他语言中是可以由用户定义的),这个全局变量一共有0到50共51个存储位置,你希望在第一个位置放进一个数据(在本软件中一般放下的是静态数据,不因K线的移动而改变),就用setglobalvar(0,你的数),放进第二个数又不希望覆盖第一个,就用setglobalvar(1,你的数),最多能放下共51个静态数据;然后是引用这些数据了,就用getglobalvar(存储位置)等等,这个全局变量最起码是生存于当前的程序模块中,比如用户函数、技术指标、K形态、特征走势、交易指令中。以上是我个人的理解。
\\\\
设置setglobalvar(0,你的数),setglobalvar(1,你的数),setglobalvar(2,你的数),setglobalvar(3,你的数),.....
setglobalvar(49,你的数).

调用
getglobalvar(0,你的数),getglobalvar(1,你的数),getglobalvar(2,你的数),getglobalvar(3,你的数),...
getglobalvar(49,你的数),
作者: nopain    时间: 2009-7-9 12:18:44     标题: 回复 #19 捕快 的帖子

解释得很好。tsj6

除了只有50个,不是51个全局变量之外。
作者: 捕快    时间: 2009-7-9 17:30:58

平生第一次挨夸,还是弄误会了。上面是引用
孤舟骑浪
的话
作者: jun1962    时间: 2011-1-7 10:04:00

谢谢上面的各位,我也学习到了一些东西
作者: zyloogle    时间: 2011-2-4 16:38:35

这么多人讨论全局变量,我也用用这个东西,看有没有帮助.
作者: wanyg    时间: 2011-8-7 22:01:51

好帖,对全局变量理解更进一步加深了,顶
作者: pepsi    时间: 2011-11-1 12:02:04

全局变量对含有加减仓的策略很有用。
作者: xiaoshansanzhi    时间: 2011-11-1 14:46:40

回复 8# 孤舟骑浪


    呜呜  我也是无法理解他们
作者: xiaoshansanzhi    时间: 2011-11-1 14:56:41

看完所有帖子,好像有点感觉了。呵呵我是从0开始,大家别笑话我
作者: 期货进行中    时间: 2011-11-3 07:27:34

是不是就是把产生在某个特定时候的值或状况记录下来,为了下个时刻用的时候取出来?只能在当天的策略中有效吗?
作者: evaner    时间: 2011-12-23 12:26:50

感谢扫盲贴
作者: zhen2710    时间: 2012-2-2 21:39:42

看完以后,有点明白了
作者: 高少游    时间: 2012-6-11 07:47:33

好贴,顶上
作者: 倔强    时间: 2012-8-1 07:34:49

学习中。。。。。
作者: 迎风尿十丈    时间: 2012-10-15 21:32:47

还是被怎么懂
作者: CenyLee    时间: 2012-10-19 11:13:26

学习了
作者: yanghui001    时间: 2013-3-19 17:40:21

正在学习全局变量,好帖,谢谢,受益匪浅!
作者: hepang    时间: 2013-4-13 21:05:05

好帖,谢谢
作者: bloodgod    时间: 2013-4-29 17:04:05

MARK
作者: 万里Ω    时间: 2013-5-10 15:19:01


作者: co8    时间: 2013-5-21 21:03:59

懂一些了
作者: bcqhsz    时间: 2013-11-13 10:24:24

全局变量SetGlobalVar和GetGlobalVar使用始终不太明白,它们有默认参数吗?

作者: ruyidao    时间: 2013-11-21 00:01:55


好帖,谢谢
作者: xiaoyuren    时间: 2015-7-27 16:59:02

好贴,顶起来,学习了
作者: sswywangyun    时间: 2016-8-2 19:17:44

孤舟骑浪 发表于 2007-12-1 13:53
可惜,看了nopain的5楼回帖,全局变量的存活级别是一个超级图表(应用于这个超级图表的所有技术指标或交易 ...

谢谢,管理员我不知道在说什么,是你教会了我
作者: sswywangyun    时间: 2016-8-2 19:18:38

捕快 发表于 2009-7-9 06:21
其实很理解的,局部变量是只在一个K线上起作用的变量,出了这根K线,又变回初值了,如果有其他赋值条件,又装下 ...

谢谢你教会了我




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2