在复盘中,由于时间是允许倒退,并且每次更换时间之后,MT4中的数据会重新初始化.这些是跟实盘MT4不同的地方.
实盘时间不会后退,数据也不存在初始化的问题.这就必须在大家在指标中使用数组的时候,要注意对数组的缓存进行重新初始化. doing=false; }
比如,上面的代码,是很多指标都会用到的数组代码.
double ExtMapBuffer1[];
double
ExtMapBuffer2[];
int
init()
{
ArrayInitialize(ExtMapBuffer1,NULL);
ArrayInitialize(ExtMapBuffer2,NULL);
SetIndexStyle(0,DRAW_LINE,EMPTY,1);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE,EMPTY,1);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(0,
NULL);
SetIndexEmptyValue(1,
NULL);
return(0);
}
情况1:当复盘中,大家切换了开始播放的时间,数据会重新初始化,这时候Bars的值就发生了改变,同时历史数据,第一根k的时间Time[Bars-1]也发生改变.这个时候就必须在指标中进行判断,增加验证.防止初始化后第一根时间不同,导致缓存中的值,混乱情况的发生.
情况2:当时间后退的时候,缓存中的数据,也可能发生不同导致缓存数据还在.可能的解决办法如下.
datetime
time_has_do=0;
int start()
{
if(doing){
return
(0);
}
doing=true;
int
timefrom=Time[0]-计算最近几日内的*24*60*60;
timefrom=StringToTime(TimeToString(timefrom,TIME_DATE)+"
00:00:00");
datetime
now_str_date=StringToTime(TimeToString(Time[0],TIME_DATE)+"
00:00:00");
string
key=Period()+","+Symbol()+","+Time[Bars-1];//Alert(key);
if(pre_key!=key){//key不同(周期切换了或者新的一天)
-----此处为情况1的解决办法,关键地方就是Time[Bars-1]值的不同即可判断是否重新初始化了数据
needReset=true;
pre_key=key;
}
if(Time[0]<time_has_do){//复盘时间后退了,数组重新初始化 ---------此处为情况2时间倒退时候的判断
needReset=true;
}
if(needReset){//需要重新开始计算
ArrayInitialize(ExtMapBuffer1,NULL);//初始化数组缓存
ArrayInitialize(ExtMapBuffer2,NULL);//初始化数组缓存
....此处为具体的业务逻辑代码,省略.
}
time_has_do=Time[0];
比如如果的语句,在Bars重新初始化之后,其值可能不同,int
i,j,limit,counted_bars=IndicatorCounted();导致计算的结果不同.
以上可能的情况仅供参考,不同的指标逻辑,采用不同的缓存算法,并不一定就会出现以上说的问题.仅供参考.