错误、漏洞、问题 - 页 3131

 
x572intraday #:

我只能立即回答&=。

MQL5参考指南 / 语言基础知识 / 操作和表达式 / 赋值操作:

与累积变量y相类似。


但这是我第一次使用&=的经验,所以我可能是错的。

首先,所有的逻辑条件都在for 内部的h_plus中累加,得到的bool-sum被插入if 中,与内部for 无关。
但仍然是,更正确的做法不是
h_plus&=high[i]>high[i+increment];
,而是
h_plus = h_plus && high[i]>high[i+increment];
 
Alexey Viktorov #:

在你的案例中,情况并非如此,因为两个条件都必须满足。但如果你把这个

那么,是的。如果条件 "a "得到满足,第二个条件将不被检查。这已经争取了多年,而现在你建议我们回到上个世纪......

虽然......我的这种说法是错误的。显然,我不太明白这里写的是什么。

x572intraday#:

我不敢说这是个错误。这就是为什么我将简单地说,我注意到if 运算符的一个特殊性。我怀疑这可能与其他书面语言也有关。

如果a变成了真的,检查就会跳到Array[over_index],在这里终端开始崩溃,通过'数组超出范围'的部分,这是很真实的。但是如果a变成了假的,终端就不会检查Array[over_index]条件,因此也就不会检查索引冗余,如果 会进一步跳过,而编码者就不会知道在他的程序中存在一个索引不存在的数组......或者说是一个现有的但多余的。

也许应该有一个修复方法,以便对"数组超出范围" 的检查会进行到if 循环的最后,并输出相同的信息?或者它将大大降低操作者的速度?

即使&&条件和第一个条件没有 得到满足,第二个条件也不会被检查。所以,如果我误导了任何人,请原谅我......

 
x572intraday #:

我已经试过了断裂 和匆忙返回,但这只会让事情变得更糟。我会试着再简化一下代码,并重新考虑它的突破...

for(int i=start; i<rates_total-n && !IsStopped(); i++)
{
   for(int increment=1, bool h_plus=true ; h_plus && increment<=n ; increment++)
     h_plus =  high[i]>high[i+increment]; // можно не накапливать, вылетим из цикла на первом false

   if(h_plus) {...}
   ...
}

像这样。

 

当通过沿时间线移动鼠标来缩放图表时,图表会根据鼠标的方向向左或向右运行,因此,任何在用户视线焦点中的东西往往只是消失在图表的边界之外。这是很不方便的,因为这样你就必须寻找正确的地方,从我熟悉MT以来就一直是这样。

按理说,点击放大镜图标可能会将图表的比例重新调整到中心,但是没有,其行为与鼠标缩放相同--图表向左移动(压缩)或向右移动(扩展)。

亲爱的开发者们!我们恳请您改变图表的缩放行为,有必要将图表的中心留在中心位置。

每个和我讨论过这种用图表工作的不便的人都同意我的看法,所以我有很好的机会客观地看待这个问题。

14年来一直试图适应它--无法做到。

 
JRandomTrader #:
for(int i=start; i<rates_total-n && !IsStopped(); i++)
{
   for(int increment=1, bool h_plus=true ; h_plus && increment<=n ; increment++)
     h_plus = high[i]>high[i+increment]; // можно не накапливать, вылетим из цикла на первом false

   if(h_plus) {...}
   ...
}

那是类似的东西。

新鲜的想法,我可以试一试。

至于前一个选项。

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
     {
      h_plus&=high[i]>high[i+increment];
      if(!h_plus)break;
     }
   if(h_plus) {...}
   ...
}

甚至没有尝试,就已经很清楚了

if(!h_plus)break;

是在求和之后,这意味着终端会先看到前一行,并且会理解有一个索引过大的数组,并且会给出同样的'数组超出范围'信息。这是第二件事。首先,我们不应该检查!h_plus,而应该检查ArraySize(high)<=i+increment,并在索引被超过的情况下逃离循环。我昨天尝试了这一切,但在一些细微之处失败了。是的,没有消息,但指标也开始乱了。

 
x572intraday #:

至于前一个选项。

甚至没有尝试,就已经很清楚了

是在求和之后,这意味着终端会先看到前一行,并且会理解有一个索引过大的数组,并且会给出同样的'数组超出范围'信息。这是第二件事。首先,我们不应该检查!h_plus,而应该检查ArraySize(high)<=i+increment,并在索引被超过的情况下逃离循环。我昨天尝试了这一切,但在一些细微之处失败了。是的,信使走了,但指标也开始乱了。

因此,这里的麻烦是

i<rates_total-3
我写
i<rates_total-n
,是有原因的,提前踢出循环正是为了模拟if()的计算方式
 
x572intraday #:

我不敢说这是个错误。所以我只想说,我注意到if 语句的一个特殊性。我怀疑这可能也适用于其他语言。

如果a为真,检查跳到Array[over_index],这里终端开始崩溃,通过'数组超出范围'的部分,这是非常真实的。但是如果a变成了假的,终端就不会检查Array[over_index]的条件,因此也不会检查索引的冗余,如果 会进一步跳过,编码者就不会知道在他的程序中有一个不存在索引的数组......或者说是一个现有的但多余的。

也许应该有一个修复方法,以便对"数组超出范围"检查会进行到if 循环的最后,并输出相同的信息? 或者它将大大降低操作者的速度?


如果你把变量a设置为false,控制权就会被传递,并不影响数组或if后面括号里的代码,因为在你的例子中

if(a && Array[over_index]>val) {...}

只有当左部分(a)为真时,控制才会被传递到条件的右部分。

比如说,如果你做

if(check(over_index) && Array[over_index]>val) {...}

在check函数检查数组的地方,永远不会 得到 "数组超出范围"。 所以,你可以在一个if中检查数组索引并处理它。 但是,如果第一部分是假的,用&&操作符将控制权传递到if的第二部分,在现有的任何编程语言中都是不可能的...

 

有一个问题,它是随机和偶尔出现的。

当在测试器中用几种货币工作时出现了这种情况。

在每个周期中,我要求提供符号的实际价格。如果由于某种原因,测试者没有收到某个特定符号的报价,它就会使用先前获得的另一个符号的报价。

如果价格高于指定价格,我应该开仓。如果我从另一个符号得到错误的数据,我应该开仓。

如果价格高于1.45117,则欧元兑加元符号打开。1.74425>1.45117? 是的,它更高,但它是另一个符号的价格。

我们在500个订单中发现了7个错误的订单。

 
Yury Lemeshev #:

有一个问题,它是随机和偶尔出现的。

在测试器中使用几种货币时出现。

在每个周期中,我要求提供符号的实际价格。如果由于某种原因,测试者没有收到某个特定符号的报价,它就会使用先前获得的另一个符号的报价。

如果价格高于指定价格,我应该开仓。我在使用另一个符号的错误数据进行开盘。

欧元兑美元的符号,如果价格在1.45117以上,那么它就会打开。1.74425>1.45117? 是的,它更高,但它是另一个符号的价格。

我们在500个订单中发现了7个错误的订单。

问题出在代码中,但心灵感应者已经在庆祝了,当他们从睡眠中醒来时,他们会说错误在第123652行中

 
Alexey Viktorov #:

代码中有问题,但心灵感应者已经在庆祝了,当他们从狂欢中出来时,他们会说,错误在第123652行

代码中没有错误,代码被重写以消除错误,而且错误没有定期出现,完全是混乱的。