分享

【大智慧】如何正解理解和掌握大智慧之全局、局部变量详解(含数组,教课书上都没有的内容)

 powerbaby 2015-04-03

如何正解理解和掌握大智慧之全局、局部变量详解(含数组,教课书上都没有的内容) 融胜资讯官方群

来自:理想论坛() 作者:只为答题 浏览:16431 回复:34

大智慧公式中的变量,分为局部变量和全局变量。如不有效掌握变量的级别属性,在具体编程过程中,将会产生许多莫名其妙或意想不到的结果。下面,通过具体的案例来说明如何理解和运用变量特性。
    一、什么是全局变量和局部变量:
    全局变量,就是在公式运行前提前进行类型说明和赋值的变量,其结果可以带入到下一次隐含的循环中。
    隐含循环,就是大智慧主程序在运行过程当中,从数据库中从前至后依次提取K线直至最后一根,每提取一次K线,进行一次公式的运算。
    如果用C语言来讲,大智慧软件是一个主函数(void main),而公式则是子函数。理解了主、子函数的关系,就可以明白什么是全局变量。全局变量是级别高于子函数(也就是公式)中定义和使用的变量,每次循环后将返回全局变量值供下一次循环使用。
    局部变量,则是在公式(即子函数)中定义、赋值、运算,其结果仅供本次循环使用,其值是不能传入到下一个循环当中使用的。
    全局变量包括变量和数组(大智慧目前仅支持一维数组,从1开始最大不能超过65534)。
    二、如何定义和使用全局变量和局部变量:
    全局变量通过Variable:语句来定义(这条语句必须放在除INUPUT语句外的最前面,),如:variable : X=0,Y[65534]=0,Z=1;
    数组仅能作为全局变量,其使用采取[N]下标的方法使用,如:Y[1]:=X;
    局部变量则无需提前声明,在公式中可以直接赋值和使用。
    需要特别注意的是,赋值有二种方法,即“:=”和“=”。前一种是仅赋值且不在K线图上显示;后一种则除赋值功效外,还将会在K线图上显示结果。如除去显示特性,“:=”和“=”是二个完全不同的赋值语句。“:=”针对全局变量赋值和对局部变量声明和赋值,而“=”仅对已经声明过的局部变量赋值(试图通过“=”对全局变量赋值则只会显示一条零水平线,而不会进行任何计算)。如 Z:=Z+1;Z; 和Z=Z+1; 完全不是一个含义。前者是对全局变量赋值(后面的Z;是为达到显示效果);而后者仅会是在K线图上显示一条零轴水平线的无效语句。
    三、数组的强制类型转换:
    普通的全局变量,是可以通过“:=”来获取局部变量数值的,如:X:=C;X; 这条语句可以在K线图上显示收盘曲线;但数组变量却无法通过此条语句进行重复赋值,如:Y[1]:=C;Y[1]; 这条语句将只会画第一条K线收盘价的平行线,其结果明显是错误的。
    为什么呢?这就是数组变量与普通全局变量的区别,这也从侧面说明了数组变量比普通全局变量有更高的级别。其实variable对数组的赋值,严格上来讲是声明类型和初始值,在进入公式第一次运算前仍属于空置状态。在空置状态下的数组变量,可以获得第一次的局部变量传导来的数值。但是,在非空置状态下(即已经赋过一次值后),任何局部变量值都没有权限重写数组变量内容,除非通过一个已经使用的全局变量进行转换。如:X:=1;X:=C;Y[1]:=X;Y[1];
    不过请特别注意的是,如果一个全局变量没有激活全局属性(给全局变量赋常数值或用另外的全局变量赋值则会激活变量的全局属性),直接用函数的返回值或其他局部变量给全局变量赋值时,则这个全局变量将会降级为局部变量使用(如果在编程中这样使用的话,完全没有必要将这个变量设为全局变量)。比如我们如果删除前面的X:=1语句,结果将重蹈前面的错误。
    另外还要注意的一点是,如果我们把前述语句精简为:X:=0;Y[1]=X+C;Y[1];我们发现运行的结果仍然产生和前述一样的错误结果。但如果我们写成X:=X;Y[1]:=X+C;Y[1];却得出了正确的结果。这是大智慧一个比较有意思的问题。我们暂且把他称之为变量类型强制转换的特殊要求吧。即如果通过全局变量加局部变量进行混合运算,可以将数值类型强制转换为全局变量得以给数组赋值,但这个起强制类型转换作用的全局变量,其激活方式不得是通过赋常数值的方法激活。   

      四、外挂函数的返回值
    外挂函数返回的值也是局部变量,其使用同样适用前述要求。不过需要注意的是,外挂函数返回的值,可以正确显示在K线图中,但无论通过何种方法(包括转换为其他各种全局类型变量),都不能正确显示在图形左上角的数据区内,其显示值为调用这个函数的实参的数值。如下面返回后面K线某数值的refx.dll外挂程序:
#define  refx(X,Y)  "
[email=REFX@REFX]REFX@REFX"(X,Y[/email]);
明日收盘:refx(c,1);
    其结果显示正确的次日的K线收盘曲线,但左上角显示的“明日收盘”值仍然是当天的收盘价。这是外挂程序的通病。个人认为显示在左上角的数据,会自动被大智慧主程序赋值给隐含的某变量计算使用,目的是计算参数值的增减变化(大家可以通过紧跟在数值后的↑↓二个箭头来体会我说的这层含义)。但由于外挂程序不具备向这个隐含的变量回传数值的功能(也许是众多的外挂程序开发者疏忽了),所以造成了这个特殊的现象,即外挂程序接口只向调用函数的公式返回了计算值,而没有向公式以外的主程序返回函数值,主程序在没有获取返回值的情况取实参值作为值(形参和实参,是C语言中的编程概念,简单地说实参就是调用程序传给函数要计算的数据,而形参则是编写函数时用于接受实参的变量名),所以造成了二个数据不匹配的问题。在此我们也不必深究,我们一般使用外挂程序,只是用于数据比对运算,属于中间变量,大可不必显示变量结果。当然,也可以通过DRAWTEXT等绘图函数将变量值显示在需要的地方即可。

    追求完美的开发者,也可以加入这样一条语句:“test:=BACKSET(1,1);”即可实现左上角变量值显示正确,达到左上角变量值与图形显示值完美匹配的境界。BACKSET函数语句本来是用于向前赋值的,但运行这条语句时,会重载除数组外的所有变量,这时主程序隐含的用于计算左上角数据的函数将直接重载引用外挂程序的计算值,故显示得以正常。
    全文完。
    (在此对REFX外挂函数的开发者表示感谢。正是对REFX使用过程中进一步了解和掌握了前述要点,大智慧之全局、局部变量自此不在存疑)。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多