错误、漏洞、问题 - 页 249

 


alexluek:

没有失去沟通,透支小费,而且TF越大越稀少。

以及从开始日期到结束日期的计算方法(我发现有3种),没有

可能会发生(它重新计算所有的条形图),但它还不准确,我不知道如何检查。

但这只是一个想法 - 让我们检查一下...

也许有另一种方法来避免它...


耶德尔金

当然,有一种方法。如果(prev_calculated==0),我们对所有 条形进行初始计算。随后,对于每一个新的刻度线(如果0 < prev_calculated < rates_total),我们进行计算,如for(int i=prev_calculated-1;i<rates_total;i++)只对最后出现的柱子进行计算。


仍在重画。以这种方式实施。


int calculated1=BarsCalculated(StdDev1Handle)。

...................

如果(CopyBuffer(StdDev1Handle,0,0,to_copy,ExtStdDev1Buffer)<to_copy)返回(0)。

......................

int data1=CopyOpen(Symbol1,0,0,rate_total,Open1Buffer)。

.....................

for(int i=rates_total-2; i>=0; i--)
{
if(time[i] >=DateStart)

{


它先重画然后不重画,但也许这与代码工作的正确性有关

但不是在终端(但至少现在不那么明显了......)。

有刻度或无刻度仍可重画。

给人的印象是,没有连贯性(因果关系)。

唯一能想到的是一个弱的处理器或一个挂起的东西。

唯一能想到的是弱的处理器或终端冻结(MT5)。

 

alexluek:

...................

它一会儿重绘,一会儿不重绘,但这都是关于代码的正确性。

而不是在终端(但至少现在不那么明显了......)。

向Desk发送请求,并附上源代码,我们会想办法解决。
 

有谁使用过ChartGetInteger 函数的第二个版本

2. Возвращает true или false в зависимости от успешности выполнения функции.
В случае успеха значение свойства помещается в приемную переменную, 
передаваемую по ссылке последним параметром.

bool  ChartGetInteger(
   long    chart_id,        // идентификатор графика
   int     prop_id,         // идентификатор свойства
   int     sub_window,      // номер подокна
   long&   long_var         // сюда примем значение свойства
   );

?似乎属性的值没有传递给接收变量。至少,这种行为在使用结构体时被注意到了

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))
该函数返回真,但变量windows包含在初始化该变量时获得的值。在这种情况下,函数的第一个版本输出了一个正确的值。(还有一件微不足道的事情:如果获取的变量被声明为长类型,编译器会产生一个警告)。
 
Yedelkin:

有谁使用过ChartGetInteger 函数的第二个版本

?似乎属性的值没有传递给接收变量。至少,这种行为在使用结构体时被注意到了

该函数返回真,但变量windows包含在初始化该变量时获得的值。在这种情况下,函数的第一个版本输出了一个正确的值。(还有一件微不足道的事情:如果获取的变量被声明为长类型,编译器会产生一个警告)。
是的,有这样一个东西。只是我想要求的是背景颜色。我想给servicedesk写信,但忘了。
 
Lizar:
是的,有这样一个东西。只有我试图要求背景颜色。我本想给servicedesk写信,但我忘了。
好的,我会的。
 
Yedelkin:

有谁使用过ChartGetInteger 函数的第二个版本

?似乎属性的值没有传递给接收变量。至少在使用结构体时可以观察到这种行为

该函数返回真,但接收的windows变量包含在初始化该变量时获得的值。在这种情况下,第一个版本的函数输出的是正确的值。(还有一件小事:如果接收变量是以长类型 声明的,编译器会产生一个警告)。

看起来你使用的是一个错误的函数。这是该函数的第一个变体(有三个参数)。它没有返回真(如你所想),但参数的值

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))

我没有看到你的代码,但它似乎是正确的。

long Chart=0,windows;
if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,0,windows))
  {
   //--- всё плохо
  }
 
uncleVic:

你似乎使用了错误的功能。这是该函数的第一个版本(有三个参数)。它没有返回真(如你所想),但参数的值

我没有看到你的代码,但它似乎是正确的。

嗯......,是的,我有这个确切的错误--看了我的旧代码,我试图使用这个函数。
 
uncleVic:

你似乎使用了错误的功能。这是该函数的第一个版本(有三个参数)。它没有返回真(如你所想),但参数的值

好的。让我们研究一下。

1.该函数被用于 "那个",因为你引用了一个与你的例子同名的函数。这只能是该函数的哪个版本(第一或第二)被使用的问题。

2.事实上,从形式上看,函数的第一个变体有三个参数,而第二个变体有四个。然而,在对sub_window 参数的描述中(该参数在两种调用的变体中都有),明确指出 "大多数属性不需要subwindow号码"。问题来了:对于CHART_WINDOWS_TOTAL(包括指标子窗口在内的图表窗口总数)这样的属性,是否有必要或不需要指出窗口编号

3 符合逻辑的是,为了获得总的窗口/子窗口数量,不需要单独指定图表的窗口/子窗口数量。这一结论得到了直接来自《手册》本身(图表属性 部分)的例子的支持。

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);

类似的方法在图表操作/ChartWindowOnDropped 部分有概述。

从这些例子可以看出,《手册》作者的立场是,没有必要为获得图表中的窗口/子窗口总数而单独指定一个子窗口编号。当然,这些例子使用的是函数的第一种变体,但由于我们讨论的是同一个属性(即CHART_WINDOWS_TOTAL),因此可以合乎逻辑地认为,同样的结论对函数的第二种变体也是成立的。特别是如果你考虑到《手册》中没有任何关于必须为函数的第二个变体指定零子窗口数的保留意见。

4.你的例子表明,第三个参数(sub_window)应该总是为函数的第二个变体指定,即使属性本身不需要指定一个子窗口号码。也就是说,与该函数的第一个变体(既可以用两个参数,也可以用三个参数)不同,该函数的第二个变体总是 需要全部四个参数。对吗?

5.如果正确的话,我们已经确定了两件事。首先,我对这个问题的最初版本被证明是错误的。其次,造成这种错误版本的原因是《手册》中的信息不完整。因此,我建议在《手册》中澄清:"第二个选项没有默认值,所以必须始终指定子窗口编号。对于大多数不需要子窗口号的属性,需要指定0(主图表窗口)"。或者类似这样的事情。

谢谢你的例子。它很短,而且直奔主题。

 
Yedelkin:
在函数的第一个变体中,intsub_window=0 有一个默认值,所以它可以被省略;在第二个变体中,没有这样的默认值,所以必须指定它

 
Yedelkin:

好的。让我们把它整理出来。

1.使用的函数是 "那个",因为你引用了一个与你的例子同名的函数。这只能是该函数的哪个版本(第一或第二)被使用的问题。

2.事实上,从形式上看,函数的第一个变体有三个参数,而第二个变体有四个。然而,在对sub_window 参数的描述中(该参数在两种调用的变体中都存在),明确指出 "大多数属性不需要subwindow号码"。问题来了:对于CHART_WINDOWS_TOTAL(包括指标子窗口在内的图表窗口总数)这样的属性,是否有必要或不需要指出窗口编号

3 符合逻辑的是,为了获得总的窗口/子窗口数量,不需要单独指定图表的窗口/子窗口数量。这个结论得到了直接来自《参考手册》本身(图表属性 一节)的例子的支持。


1.如果我们考虑到这个函数实际上是重载的,我们可以说它不是(虽然,你可以想象,这是有争议的)。

2.这才是重点。如果我对MQL5中函数重载的逻辑理解正确,第一个选项可以使用2或3个参数,而第二个选项只能使用4个参数。

也就是说,如果一个函数收到两个或三个参数,MQL5将使用第一个选项,而如果收到4个参数,它将始终使用第二个选项。

问题是,如果我们使用参数数不等于4的第二种变体,编译器在调用时就会感到困惑。

3.在《参考》中,有一个小小的不准确之处(或者说是一个稍微错误的措辞)。一般意义如下--大多数属性不需要窗口号 这类属性第一个选项中,可以省略窗口号(在第二个选项中 必须指定,但会被忽略)。

4.从上面可以看出,对于这个例子,编译器会选择函数的第一个变体。

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);
编译器会做出这样的结论,依据是第一个变体中的第三个参数可以省略,而在第二个变体中,它必须存在!!!。