Natural 修饰的变量

请问一下vars下定义的Natural修饰的变量在多数据源情况下,是每个数据源都定义了一个变量吗?下面的代码在一个数据源运行没问题,但多个数据源会出问题,请老师帮忙看一下。

Params

Integer hlin_params(66);

Vars

Global Array<Integer> avgin_params;

Numeric  ATR1;

Natural Numeric  highin;

Natural Numeric  lowin;                  

Natural Array<numeric>  avgout;

Natural Array<numeric>  MarketPosition_num;

Events

OnInit()

{

SubscribeBar(\"cu888.SHFE\",\"1d\",20100104,0,Enum_Data_ActivePeriod);

/* SubscribeBar(\"p9888.DCE\",\"1D\",20100104,0,Enum_Data_ActivePeriod);

SubscribeBar(\"TA888.CZCE\",\"1D\",20100104,0,Enum_Data_ActivePeriod); */

avgin_params = [42,48,54,60,66,72,78];

Integer i = 0;

Range[i=0:DataCount-1]

{


//=========数据源相关设置==============

AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权


AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格


SetBeginBarMaxCount(30); //设置最大起始bar数为10

SetBackBarMaxCount(100); //设置最大回溯bar数为10

//=========交易相关设置==============

SetInitCapital(10000000); //设置初始资金为100万

}

}

OnBar(ArrayRef<Integer> indexs)

{

Integer i = 0;

Range[i=0:DataSourceSize() - 1]

{

Integer j = 0;

For j = 0 To GetArraySize(avgin_params)-1

{

Avgout[j] = Average(close,avgin_params[j]);

                       

 

if( MarketPosition_num[j] < 1 And Close > avgout[j] && Close > highin && Data[i].CurrentBar>=78)

{

Buy(1,Close);  

MarketPosition_num[j] = 1;

}

if( MarketPosition_num[j] > -1 && Close < avgout[j] && Close < lowin && Data[i].CurrentBar>=78)    

{

SellShort(1,Close);

MarketPosition_num[j] = -1;

}    


Commentary(\"avgout[j]\"+Text(avgout[j])) ;

Commentary(\"data[1].avgout[j]\"+Text(data[1].avgout[j])) ;

Commentary(\"MarketPosition_num[j]\"+TextArray(MarketPosition_num));

Commentary(\"Avgout\"+TextArray(Avgout));

if(MarketPosition_num[j]==1 And close < avgout[j])  

{

Sell(1,Close) ;

MarketPosition_num[j] = 0;

Commentary(\"平多1\");

}


If( MarketPosition_num[j] == -1 And Close > Avgout[j])

{

BuyToCover(1,Close) ;

MarketPosition_num[j] = 0;

}

}

Print(\"MarketPosition_num\"+TextArray(MarketPosition_num));

Print(\"Avgout\"+TextArray(Avgout));

Print(\"data[1].Avgout\"+TextArray(data[1].Avgout));      

highin = Highest(Close,hlin_params);

lowin = Lowest(Close,hlin_params);    

}

}          



关于Natural 和Series<Numeric>的区别
Natural数据传递
OnInit() 和OnReady()除了说明书说的区别外还有什么特点?
普通变量 与 临时变量的区别
全局变量的使用疑问
变量的问题
序列变量在tick中应用
关于新建变量的问题
关于序列变量的问题
关于变量内存的主动释放

你应该是对全局变量什么意思有误解

如果不能确定数据结构的特点建议视频区看看零基础视频

而且用close判断信号...实盘是会闪烁的

全部变量 globle在bar、域、图层之间是继承的,natural 在bar、域之间是继承的。

我这个只是回测也不用于实盘,实盘我会加入其他条件,代码只有一个onbar域,用到globle的只是参数没有修改,明显是natural在bar之间传递错误。下面代码您可以运行一下看一下,沪铜2014年1月8号和2014年1月9号,前一根全部运行完的数据和后一根k线开始运行的数据不同。

data-href=data-href=

Params

Integer hlin_params(66);

Vars

Global Array<Integer> avgin_params;

Numeric  ATR1;

Natural Numeric  highin;

Natural Numeric  lowin;                  

Natural Array<numeric>  avgout;

Natural Array<numeric>  MarketPosition_num;

Events

OnInit()

{

SubscribeBar(cu888.SHFE,1d,20100104,0,Enum_Data_ActivePeriod);

SubscribeBar(p9888.DCE,1D,20100104,0,Enum_Data_ActivePeriod);

SubscribeBar(TA888.CZCE,1D,20100104,0,Enum_Data_ActivePeriod);

avgin_params = [42,48,54,60,66,72,78];

Integer i = 0;

Range[i=0:DataCount-1]

{

//=========数据源相关设置==============

AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权

AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格


SetBeginBarMaxCount(30); //设置最大起始bar数为10

SetBackBarMaxCount(100); //设置最大回溯bar数为10

//=========交易相关设置==============

SetInitCapital(10000000); //设置初始资金为100万

}

}

OnBar(ArrayRef<Integer> indexs)

{

Data[0].Commentary(MarketPosition_num开始+TextArray(Data[0].MarketPosition_num));

Integer i = 0;

Range[i=0:DataSourceSize() - 1]

{

Commentary(MarketPosition_num开始+TextArray(MarketPosition_num));

Integer j = 0;

For j = 0 To GetArraySize(avgin_params)-1

{

Avgout[j] = Average(close,avgin_params[j]);

                       

 

if( MarketPosition_num[j] < 1 And Close > avgout[j] && Close > highin && Data[i].CurrentBar>=78)

{

Buy(1,Close);  

MarketPosition_num[j] = 1;

}

if( MarketPosition_num[j] > -1 && Close < avgout[j] && Close < lowin && Data[i].CurrentBar>=78)    

{

SellShort(1,Close);

MarketPosition_num[j] = -1;

}    

if(MarketPosition_num[j]==1 And close < avgout[j])  

{

Sell(1,Close) ;

MarketPosition_num[j] = 0;

Commentary(平多1);

}


If( MarketPosition_num[j] == -1 And Close > Avgout[j])

{

BuyToCover(1,Close) ;

MarketPosition_num[j] = 0;

}

}

highin = Highest(Close,hlin_params);

lowin = Lowest(Close,hlin_params);

Commentary(MarketPosition_num结束+TextArray(MarketPosition_num));    

}

Data[0].Commentary(MarketPosition_num结束+TextArray(Data[0].MarketPosition_num));

}          



natural是图层全局变量

和global 这种全局的区别在于,global无论多少个图层都是只有一个地址

而natural是有多少个图层就有多少个地址,每个图层上的nataral变量虽然名字一样,但是指向的内存地址都不一样

我是这么理解的,但上面的代码在一个数据源时,信号是正确的,但多数据源时信号错误。用series信号正确,沪铜连续2014年3月。

一个数据源

data-href=

多个数据源

data-href=