[后退] [返回首页] 复盘侠MTCommander(MTDriver)用户手册 [切换到电脑版] [复制网址]

在复盘中,由于时间是允许倒退,并且每次更换时间之后,MT4中的数据会重新初始化.这些是跟实盘MT4不同的地方.

实盘时间不会后退,数据也不存在初始化的问题.这就必须在大家在指标中使用数组的时候,要注意对数组的缓存进行重新初始化.
//---- buffers
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:当时间后退的时候,缓存中的数据,也可能发生不同导致缓存数据还在.可能的解决办法如下.
string pre_key="";
datetime time_has_do=0;
bool doing=false;
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");  
  
   bool needReset=false;  

   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];

   doing=false;

}




比如如果的语句,在Bars重新初始化之后,其值可能不同,int i,j,limit,counted_bars=IndicatorCounted();导致计算的结果不同.

以上可能的情况仅供参考,不同的指标逻辑,采用不同的缓存算法,并不一定就会出现以上说的问题.仅供参考.



[后退] [返回首页] 复盘侠MTCommander(MTDriver)用户手册 [切换到电脑版] [复制网址]