请问一下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);
}
}
你应该是对全局变量什么意思有误解
如果不能确定数据结构的特点建议视频区看看零基础视频
而且用close判断信号...实盘是会闪烁的
全部变量 globle在bar、域、图层之间是继承的,natural 在bar、域之间是继承的。
我这个只是回测也不用于实盘,实盘我会加入其他条件,代码只有一个onbar域,用到globle的只是参数没有修改,明显是natural在bar之间传递错误。下面代码您可以运行一下看一下,沪铜2014年1月8号和2014年1月9号,前一根全部运行完的数据和后一根k线开始运行的数据不同。
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月。
一个数据源
多个数据源