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

标题: 策略单元中不同公式定义的全局变量是策略单元的全局变量 [打印本页]

作者: gwf_13380222    时间: 2019-9-24 13:05:08     标题: 策略单元中不同公式定义的全局变量是策略单元的全局变量

全局变量是一类较为特殊的数值型变量,保存的变量值不会因为Bar的改变而消失,它的作用范围是策略单元,
我的问题是:策略单元内不同的公式中定义的全局变量,均为策略全局变量吗?
也就是策略中其它公式应用和函数都可以互相访问全局变量。对吗?
只有关掉策略单元后,策略单元中不同公式定义的全局变量所有保存的值才会消失。
作者: 小米    时间: 2019-9-24 13:49:07

不,仅在当前策略范围内有效
作者: gwf_13380222    时间: 2019-9-24 15:58:52

我用同一个公式,里面有全局变量,存储用来划线和交易的数值,当策略单元包括一只股票时,结果正常;
当策略单元包含五只股票时,全局变量存储的结果好像是最后一只股票的计算结果,测试结果也只有最后一只是正常的,其余前面四只股票都不正常,用的是最后一只股票的计算结果进行划线和交易
存在bug
作者: 小米    时间: 2019-9-24 16:30:34

gwf_13380222 发表于 2019-9-24 15:58
我用同一个公式,里面有全局变量,存储用来划线和交易的数值,当策略单元包括一只股票时,结果正常;
当策 ...

您的第一个问题,可能我之前的回复是不够严谨的。
想再确认一下,你所说的全局变量,是哪种方式的?代码是怎么写的?

你前面提问的是策略单元内的不同公式。
现在的问题是同策略单元里用的一个公式,但是有多个数据图层。
这两者是不太一样的吧,请将您的用法以及代码的写法贴一下,才好分析问题。

作者: gwf_13380222    时间: 2019-9-24 17:17:58

TBQ的计算机制?
1)五只股票,从第一个bar开始计算,把五只都计算完,才开始计算第二个bar,所以全局变量每次存储的是第五个股票的结果
还是应该这样
2)五只股票,从第一个bar开始计算,把第一只bar都计算完;再开始计算第二个股票,这样全局变量每次存储的是相应股票的结果,才能得到正确的结果
作者: gwf_13380222    时间: 2019-9-25 10:04:24

代码如下,全局变量似乎只保存了最后一支股票的结果
           Global Numeric buynot;
           Global Numeric sellnot;
    Global Numeric downnot;
    Global Numeric upnot;           
    Bool Buycondition;
    Bool Sellcondition;
Events

    onBar(ArrayRef<Integer> indexs)
    {   
         
     Range[0:4]
        {
            k=CurrentBar;
            Commentary("k="+Text(CurrentBar));
            Length=NDay*n0;//NDay内的分钟线的个数                                       
            NumPos=1;                                                       
            aa=(1+a0/100);
            bb=(1-a0/100);                               
        mytime0=0.0930;
            TT=Time();
            If(TT== mytime0)  //更新计算
            {               
                    mmax=High[1];        
                    mmin=Low[1];
                    If(mmax==mmin) Return;               
                    for i=1 To Length       
                    {  
                            mmax=Max(High[i+1],mmax);
                            mmin=Min(Low[i+1],mmin);
                    }         
                    buynot=aa*mmax;        
                    sellnot=bb*mmin;               
            downnot=buynot*0.97;
            upnot= sellnot*1.03;                          
            }
    /////////////////////////////////////////////////////////////////////////////////////
             If(k < Length) Return;                        
             Commentary("buynot="+Text(buynot));
            Commentary("sellnot="+Text(sellnot));                   
        Commentary("afa="+Text(afa));             
        Commentary("upnot="+Text(upnot));       
        Commentary("downnot="+Text(downnot));      
            PlotNumeric("1",buynot);
            PlotNumeric("2",sellnot);   
    //入场条件                                 
            //////////////////////////////////////////////////////////////
            BuyCondition= Close[1]>buynot ;//建多
            SellCondition = Close[1]<sellnot ;//建空
    // 系统进场
            If(MarketPosition == 0)// 当前无仓位
            {

                    If(Buycondition AND Close[1]>downnot) // 开多仓   
                    {
                            Buy(NumPos,Open);
                           
                    }Else If(SellCondition AND Close[1]<upnot) // 开空仓   
                    {
                            SellShort(NumPos,Open);                                                                                               
                    }                 
            }
         // 系统出场
         //处理多仓           
         If(MarketPosition == 1 )         // 已经开多仓,判断是否止损
         {               
                    If(downnot>1) PlotNumeric("L",downnot);                       
                    If(Close[1] <downnot  )  //止损
                    {
                            Sell(0,Open);               
                    }
                    Else If(Sellcondition)
                    {
                            Sell(0,Open);                                               
                    }
            }
            //处理空仓
            If(MarketPosition == -1)// 当前有空仓
            {
                    If(upnot<1000000) PlotNumeric("H",upnot);       
                    If(Close[1] >upnot  )  //止损
                    {
                            BuyToCover(0, Open);       
                    }
                    Else         If(Buycondition)
                    {
                            BuyToCover(0, Open);//平多开空
                    }
             }
    }
作者: gwf_13380222    时间: 2019-9-25 10:13:32

Range[0:0] 是正常的
Range[0:4] 就不对了,结果显示为最后一支股票的计算结果

作者: gwf_13380222    时间: 2019-9-25 10:33:45


如果我将全局变量换成序列变量,也是对的
为什么全局变量就不对呀

作者: 小米    时间: 2019-9-25 10:40:55

gwf_13380222 发表于 2019-9-25 10:04
代码如下,全局变量似乎只保存了最后一支股票的结果
           Global Numeric buynot;
           Global Numeric selln ...

如何判断只保留最后一个股票的值的?
你对四个变量的赋值 是放在了range[0:4]条件下的,这样这四个变量是分别在不同的数据图层分别赋值 运算的。。不存在只保留最的一个合约数据的说法呢。。
如你的写法,在K线图的5个数据图层中,是可以看这几个变量在不同的图层中有不同的值的(除非计算结果本身就是一样的)。

ps:至于TBQ的运算机制,您可以看一下相关的文档。
      软件导航页---TB量化学院---TBL语言---01TB公式运行机制---002多数据源的Onbar运行机制
作者: gwf_13380222    时间: 2019-9-25 12:27:24

从图里可以看出浦发银行(第一支)显示的是南方航空(第五只)的全局变量的计算结果
作者: gwf_13380222    时间: 2019-9-25 12:35:59

你对四个变量的赋值 是放在了range[0:4]条件下的,这样这四个变量是分别在不同的数据图层分别赋值 运算的。。
这个对于局部变量都是没有问题的,
但是:
是不是因为全局变量的定义没有包含在range[0:4]条件下,所以出现了混乱的情况
作者: gwf_13380222    时间: 2019-9-26 10:40:43

小米 发表于 2019-9-25 10:40
如何判断只保留最后一个股票的值的?
你对四个变量的赋值 是放在了range[0:4]条件下的,这样这四个变量是 ...

软件导航页---TB量化学院---TBL语言---01TB公式运行机制---002多数据源的Onbar运行机制

当只有一个数据源时,公式依赖于data0 这唯一的数据源运行。这体现在除了全局变量其余
的局部变量都是依赖于data0 的数据源的。
当有多个数据源时,公式会在每个数据源都建立一套机制,对应的除了全局变量其余的局部
变量在每个数据源都有自己独立的存在。
以上对局部变量说明的很清楚。
我的问题是:全局变量是怎么处理的?
作者: gwf_13380222    时间: 2019-9-26 11:26:24

小米 发表于 2019-9-25 10:40
如何判断只保留最后一个股票的值的?
你对四个变量的赋值 是放在了range[0:4]条件下的,这样这四个变量是 ...

1、全局变量和普通变量(数据源变量和公式内全局变量)的区

TB 公式的执行机制是行情驱动,从左至右、从上至下的,即程序在图表中执行不仅仅运行
一次,而是多次执行(历史行情中每一个Bar 都会触发程序,实时行情中每一个Tick 都会
触发)。此时,程序每运行一次,都会对普通变量重新分配内存,进行初始化操作,所以普
通变量无法保存上一个Bar 中程序运行的结果;而全局变量是附着于策略单元的,它的内存
全局分配,程序运行时不重新分配,它的值不会因为某次程序运行结束而消失,只有关闭公
式加载的策略单元时,全局变量才清除。

按照这个理解:策略单元公式中定义的全局变量,公式在rang[0:4]中数据源依次运行时,会改变公式中全局变量内存的值,因此在回测显示时,只能按照最后一个数据源的全局变量的计算值进行显示,从而出现显示不对的情况
我的理解不知道对不对?
作者: gwf_13380222    时间: 2019-9-26 11:49:43

每个数据源局部变量在回测时都会存储显示相应的交易信号(局部序列变量各自独立存在),但如果交易信号涉及全局变量,则在回测时交易信号就乱了
估计这套TBQ这套机制时无法改变啦
只能在编写公式时小心处理,避免这样的情况出现!

关于全局和局部变量这个问题,大神估计也只能这样回答了


作者: 小米    时间: 2019-9-26 13:52:13

gwf_13380222 发表于 2019-9-26 11:49
每个数据源局部变量在回测时都会存储显示相应的交易信号(局部序列变量各自独立存在),但如果交易信号涉及 ...

确认了一下,全局变量确实如你所说的,是当前策略内全局,不分图层的。
至于您说的乱是具体怎么样乱的呢?方便将您的代码(可以去除核心交易思想,但需保留测试相关内容)整个发过来给我们测试一下吗?前面给的并没有变量参数等信息,我自己代入了变量的测试 ,结果有偏差。
所以想要了解您说乱的问题,还需要你的代码发来看一下。
作者: gwf_13380222    时间: 2019-9-27 09:19:30

(1)再请教一下:同一个公式,两个参数分别用在同一品种的分钟周期和日周期上,怎么个方式实现较好

(2)上面代码如下,代码中九点半更新的数据放在全局变量中供公式其他时刻使用,在策略单元内加载板块股票进行计算测试,首先交易次数异常,查看k线图上的交易信号和输出数值,是不对的
注:如果将全局变量改为序列变量(局部变量),结果就正常了

Params
        Numeric Length(1500);     
Vars
     Numeric NumPos(1);
     Series<Numeric> mprice;
     Numeric m;
     Numeric i;
     Numeric j;
     Numeric k;
     Numeric temp;
     Numeric mytime0;
     Numeric TT;
     Numeric mmax;
     Numeric mmin;       
     
           Global Numeric buynot;
           Global Numeric sellnot;
    Global Numeric downnot;
    Global Numeric upnot;   

        /*        
           Series<Numeric> buynot;
    Series<Numeric> sellnot;
    Series<Numeric> downnot;
    Series<Numeric> upnot;     
    */
    Bool Buycondition;//开多
    Bool Sellcondition;//平多
Events

    onBar(ArrayRef<Integer> indexs)
    {   
         
     Range[0:4]
        {
            k=CurrentBar;
            Commentary("k="+Text(CurrentBar));                       
            NumPos=1;                                                                               
        mytime0=0.0930;
            TT=Time();
            If(TT== mytime0)  //更新计算
            {               
                    mmax=High[1];        
                    mmin=Low[1];
                    If(mmax==mmin) Return;               
                    for i=1 To Length       
                    {  
                            mmax=Max(High[i+1],mmax);
                            mmin=Min(Low[i+1],mmin);
                    }         
                    buynot=mmax;        
                    sellnot=mmin;               
            downnot=buynot*0.97;
            upnot= sellnot*1.03;                          
            }
    /////////////////////////////////////////////////////////////////////////////////////
             If(k < Length) Return;                        
             Commentary("buynot="+Text(buynot));
            Commentary("sellnot="+Text(sellnot));                              
        Commentary("upnot="+Text(upnot));       
        Commentary("downnot="+Text(downnot));      
            PlotNumeric("1",buynot);
            PlotNumeric("2",sellnot);   
    //入场条件                                 
            //////////////////////////////////////////////////////////////
            BuyCondition= Close[1]>buynot ;//建多
            SellCondition = Close[1]<sellnot ;//建空
    // 系统进场
            If(MarketPosition == 0)// 当前无仓位
            {

                    If(Buycondition) // 开多仓   
                    {
                            Buy(NumPos,Open);
                           
                    }Else If(SellCondition) // 开空仓   
                    {
                            SellShort(NumPos,Open);                                                                                               
                    }                 
            }
         // 系统出场
         //处理多仓           
         If(MarketPosition == 1 )         // 已经开多仓,判断是否止损
         {               
                    If(downnot>1) PlotNumeric("L",downnot);                       
                    If(Close[1] <downnot  )  //止损
                    {
                            Sell(0,Open);               
                    }
                    Else If(Sellcondition)
                    {
                            Sell(0,Open);                                               
                    }
            }
            //处理空仓
            If(MarketPosition == -1)// 当前有空仓
            {
                    If(upnot<1000000) PlotNumeric("H",upnot);       
                    If(Close[1] >upnot  )  //止损
                    {
                            BuyToCover(0, Open);       
                    }
                    Else         If(Buycondition)
                    {
                            BuyToCover(0, Open);//平多开空
                    }
             }
    }
}

作者: ICMA2020    时间: 2021-1-4 17:33:00

gwf_13380222 发表于 2019-9-25 12:35
你对四个变量的赋值 是放在了range[0:4]条件下的,这样这四个变量是分别在不同的数据图层分别赋值 运算的。 ...

冠通期货,超高返佣,加qq541948253




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