错误、漏洞、问题 - 页 1343

 
StrategyTester:

你好。

关于MT5及其测试仪的问题。

我有一个自编的多货币专家顾问,它调用一个 自编的多货币指标,计算两个货币对之间的一些比率。在测试和调试过程中,我发现了一个问题:在终端中,在某个时刻,"A "行高于 "B "行,而在策略测试器中,在同一时刻,在相同的指标设置下,在可视化打开的情况下,"A "行低于 "B "行。总的来说:终端中的指标线的外观与策略测试器中的指标线有根本性的不同。问题:这是MT5测试仪的故障还是代码中的错误?


让我澄清一下:我看到的是指标的重绘。

 
Karputov Vladimir:
指示器总是以它在终端的方式绘制。也许在测试器中,你需要尝试几种模式(所有刻度线、数学价格等等)。
我尝试了 "所有点"、"M1上的OHLC"、"仅开盘价"。结果是一样的--指标被重新划定。选项"数学计算"未被激活,不可用。
 
StrategyTester:
尝试了 "所有点"、"M1上的OHLC"、"仅开盘价"。结果是一样的--指标重绘。选项"数学计算"未被激活,不可用。
在这种情况下,请向我提供代码。
 

向开发者提问:在什么情况下,符号的历史被认为是不同步的,即SeriesInfoInteger(symbol, period,SERIES_SYNCHRONIZED)返回错误?

问题是,我偶尔会遇到这样的情况:在所有的时间段里,某个符号都会返回错误的数值,即使这个符号有历史记录(Bars和其他函数返回非零值)。 原因是什么?

 

也有这样一个问题。当通过CopyTime、CopyClose 等读取指标中几个符号/时间段的历史记录时,指标经常闪动。这不是渲染的结果(没有重新计算条形图),而只是整个图像消失了几分之一秒,然后又出现了。 有时不是几分之一秒,而是整整几秒。 通常在图表滚动时观察到。如果请求的时间序列较小,则不会出现这种问题。

我想听听开发商的意见,这可能与此有关。

 
Karputov Vladimir:
在这种情况下,请提供代码。

我在此附上终端和测试器的差异说明以及指标的代码。

//+------------------------------------------------------------------+
//|                                             Indicator1_6test.mq5 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.6"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property  indicator_color1 SkyBlue
#property  indicator_color2 Yellow
#property  indicator_type1 DRAW_LINE
#property  indicator_type2 DRAW_LINE
//---
enum TT{_close=0,_open=1,_high=2,_low=3};
//---
input string activ1="GBPUSD",activ2="EURUSD";
input TT PriceType=_close;
input int Len=100;
//---
double ratio[],avr[];string NN[]={"rr1","rr2","aa1","aa2"};
//---
void setv(int i,double v){ObjectSetDouble(0,NN[i],OBJPROP_PRICE,v);}
//---
int OnInit()
{
   SetIndexBuffer(0,ratio);
   PlotIndexSetString(0,PLOT_LABEL,"Ratio");
   SetIndexBuffer(1,avr);
   PlotIndexSetString(1,PLOT_LABEL,"Avr");
   ArraySetAsSeries(ratio,1);
   ArraySetAsSeries(avr,1);
   for(int i=0;i<4;i++)ObjectCreate(0,NN[i],22,0,0,0);
return(INIT_SUCCEEDED);
}
//---
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
int limit=0;double zz[4];

  if(prev_calculated==0){limit=MathMin(Bars(activ1,0),Bars(activ2,0));limit--;}
  else limit=rates_total-prev_calculated;
  if(limit==0)limit=1;
  double Price1[],Price2[]; ArraySetAsSeries(Price1,1); ArraySetAsSeries(Price2,1);
  getV(Price1,Price2,limit);
  for(int i=0;i<limit;i++){if(Price1[i]>0&&Price2[i]>0)ratio[i]=Price1[i]/Price2[i];else ratio[i]=ratio[i+1];}
  
  double sred=0,sum=0; 
  for(int i=0;i<limit;i++)
      {
      sred=0;
      avr[i]=SimpleMA(i,Len,ratio);
      
      for(int j=i;j<i+Len;j++)
        {
        if(j>=ArraySize(ratio))break;
      if(ratio[j]==0||ratio[j]==EMPTY_VALUE){sred=0;break;}
      sred=1;
        }
      }
      
  if(prev_calculated!=0)for(int i=0;i<10;i++)if(ratio[i]==0)ratio[i]=ratio[i+1];
  
zz[0]=ratio[1];zz[1]=ratio[2]; zz[2]=avr[1];zz[3]=avr[2];
for(int i=0;i<4;i++)setv(i,zz[i]);
return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
{
if(PriceType==_close){CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_open){CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_high){CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_low){CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);}
}
//---
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
      //--- calculate value
      if(position+period+1>ArraySize(price))return(0);
      for(int i=0; i<period; i++) result+=price[position+i];
      result/=period;
   return(result);
  }
//---
 

一般来说,用函数

Copy

有其他问题。

我发现当这个函数被调用时,它可以 "冻结 "EA,我用大量的符号写了一个程序,并对每个符号的过去3天的历史进行了计算。

我曾经有一段时间,所有的东西都会挂起几分钟,我几乎没有发现是复制功能的问题。 这个功能可以安全地处理150-200个符号,然后挂起,在不同的符号上挂起......

悬挂时间从5秒到2-3分钟不等...。

 
EAs中的复制功能是同步的,如果没有数据,则期望进行分页。
 
StrategyTester:

我在此附上终端和测试器的不同之处的图示,以及指标的代码。

该函数中存在一个错误。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
  {
   if(PriceType==_close)
     {
      CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_open)
     {
      CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_high)
     {
      CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_low)
     {
      CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
  }

你正试图匆忙地复制另一个符号的数据。你不应该这样做。数据必须首先被下载、准备和检查...以下是描述:数据访问的组织

 
Karputov Vladimir:

该函数中存在一个错误。

你正试图匆忙地复制另一个角色的数据。这不是做这件事的方法。数据必须首先被加载,准备,确保...以下是描述:组织数据访问

谢谢你的提示。我会看看的。