错误、漏洞、问题 - 页 561

 

ArrayInitialize 不工作的代码附在后面,如果我们解开循环,一切正常。

而当在类中声明变量和在全局层面上声明相同名称的指标时,就会弹出警告。

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

周末,在没有刻度的情况下,我在模拟账户上调试了该指标,在MT5终端的两个实例中运行,但来自不同公司:MetaQuotes和EGlobal。各地的设置都是一样的。为了确定,我进行了离线检查,因此排除了勾股因素。

问题是,最简单的 "欠指标 "代码(更不用说成熟的、更复杂的指标)在不同公司的不同终端显示不同数量的结果。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

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[])
  {
   Print(1);

   return(rates_total);
  }

1.EGlobal。2.MetaQuotes荣格全球MetaQuotes

我完全卸载了这两个终端(用任务管理器按内存进程检查),再次加载它们并重新编译这两个代码,以防万一。最后--没有变化。

 
这并不奇怪,这就是它应该有的样子。
 

MathRound() 在4和5中的工作方式不同,应该是一样的。

4p的代码。

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

5秒代码。

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

MathRound()在4和5中的工作方式不同,应该是一样的。

4秒代码。

5秒代码。

问题出在这里。

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

这个值在4和5中的四舍五入是不同的。

 
Loky:
这一点并不奇怪,这就是它应该有的样子。
而更具体的是?
 

为什么MT5在测试中断时不保存订单历史 等?在MT4中,它被保存。

另外,从测试图表上看,订单历史中没有定位--通过点击图表查看大面积缩水区域的订单很方便。

 

晚上好。

你能解释一下吗,SLeep()方法是如何工作的?

它应该在一定时间内暂停专家顾问,还是我错了?


{for (int sleep=0;sleep<10000;sleep++)

如果(BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; }else Sleep(100);}

对于这段代码,我期望的结果是--如果某个指标的计算条数大于某个值,循环就会被打破;否则,在进一步的代码执行中会有100ms的延迟。可能的总延迟是100*10000ms....,这足够计算指标的时间了。那么,为什么代码继续运行呢? (它遵循这个循环)或者在测试器中,这个功能并不像我假设的那样工作。提前感谢您的澄清。

 
mi__x__an:

晚上好。

你能解释一下吗,SLeep()方法是如何工作的?

它应该在一定时间内暂停专家顾问,还是我错了?


{for (int sleep=0;sleep<10000;sleep++)

如果(BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; }else Sleep(100);}

对于这段代码,我期望的结果是--如果某个指标的计算条数大于某个值,循环就会被打破;否则,在进一步的代码执行中会有100ms的延迟。可能的总延迟是100*10000ms....,这足够计算指标的时间了。那么,为什么代码继续运行呢? (它遵循这个循环)或者在测试器中,这个功能并不像我假设的那样工作。提前感谢您的澄清。

睡眠 在指标中不起作用
 

例如,文档中的CopyBuffer 导致大脑震荡:"如果你想对指标值进行部分复制到另一个数组(不是指标缓冲区),你应该为此使用中间数组,在其中复制所需的值。并且已经从这个中间数组中执行逐个元素复制所需数量的值到接收数组的正确位置。"

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

如果buffer_num 被明确提及,当然意味着 必须通过SetIndexBuffer 将接收数组与一个或另一个序列号的指示器缓冲区初步绑定。但是,"如果我们想把指标的一些值复制到另一个数组(不是指标缓冲区)",我们不能谈论buffer_num,因为它不是指标,而且根据定义我们还没有把它和任何东西连接起来。

矛盾?

含糊不清?

或者,也许我完全是程序化的?

我试图找到指标缓冲区的明确定义,但没有成功。真的是通过SetIndexBuffer 链接的任何缓冲区吗,还是不够,它应该是一个带有INDICATOR_DATA 标识符的数组