错误、漏洞、问题 - 页 3151

 
Artyom Trishkin #:

一直有一个检查:如果(limit>1)limit=rates_total-1。这是针对在计算中没有i+something的情况。如果有,那么这些 "多少多少 "必须包含在结构中:limit=rates_total-1-some-something。

没有它,总是会有一个阵列超限。因为Rates_total除了Bars()之外没有别的东西。相应地,如果有5000个柱子,而我们的索引是5000,我们将落在阵列的限制之外(柱子的计算从零开始)。

在你的例子中,限额的计算是错误的。

它应该是这样的。

并在其之后检查限制是否>1

如果limit大于1,那么limit = rates_total-1

谢谢你,Artem!对你的大惊小怪感到抱歉。
对了,应该有一个检查,我只是忘了这个问题。
我在代码中仍有一个注释
//检查并计算计算条数。
显然,复制粘贴造成了我的误解。
一切都在检查中正常运行。谢谢你。

 
Roman #:

谢谢Artem!
对了,应该有一个检查,我已经忘记了。
一切都在检查中正常运行。谢谢你。

不客气。修复计算。这是不正确的--我在上面强调了这一点。

int limit = rates_total-1-prev_calculated;

-1不应该出现在这里

如果rate_total是5000,并且在之前调用OnCalculate()计算的条形图也是5000(prev_calculated),那么限制将等于-1。因此,该循环将完全不被执行。

如果你想选择读取指标的方式(通过零点栏的刻度或仅在新栏开启时),那么输入一个变量,指定如何做。

int end = (every tick ? WRONG_VALUE : 0);

循环将如下: for(int i=limit; i>end; i--) { //...。}

而极限计算将是正确的,并且循环将是你想要的样子。

 

正确的代码。

i>=0的每个刻度

i>0为新栏

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{
   ArraySetAsSeries(price, true);
   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Расчёт и проверка количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if(limit>1) 
      limit = rates_total-1;
   

   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {

      IndBuff[i] = price[i]; 

   }
   

   return(rates_total);
}
 
Nikolai Semko #:

你甚至没有问该怎么做...心灵感应者放假回来了吗?;)

 
Roman #:

正确的代码。

i>=0的每个刻度

i>0为一个新酒吧

ArraySetAsSeries(IndBuff, true);

这最好移到OnInit()中。

 
Artyom Trishkin #:

你甚至没有问该怎么做...心灵感应者放假回来了吗?;)

:)
Artem,你不需要成为心灵感应者,就能看到这个人几分钟前注册,他看到的第一件事就是 "虫子,虫子,问题"
很明显,他在问是否能得到一些免费的钱,不要制造太多的麻烦...

 
Nikolai Semko #:

:)
Artem,你不需要成为心灵感应者就能看出,这个人几分钟前注册,他看到的第一件事就是 "错误、错误、问题"
很明显,他在问是否能免费得到一些钱,而且不要太努力......

也许他决定通过投资做家教来为宾利赚点外快?:)

 
Artyom Trishkin #:

也许他决定通过投资家教,通过艰苦的程序员工作,为他的宾利车赚点钱。:)

我不这么认为,Artem。
如果他有程序员的潜力,他就不会允许有模糊性和不确定性。
:)
 
Roman #:

你知道什么是最令人讨厌的吗?任何行为都是默默地被欺骗,没有任何警告。
然后人们就会受到伤害。我受够了这个metatrader。

指标周期的设计只是不假思索地从过去的复制粘贴法(和歪曲的自动完成法)中借来的。

在目前的界面上,一切都很简单。

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

在这种情况下,如果你需要在每次调用时重新计算最后一根柱子,就需要用prev_calculated-1推送。

 
Maxim Kuznetsov #:

只是,指标周期的设计是从过去的复制粘贴(和歪歪扭扭的自动完成)中不假思索地拿过来的。

在目前的界面上,一切都很简单。

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

在这种情况下,如果你需要在每次调用时重新计算最后一根柱子,就需要用prev_calculated-1进行拥挤计算。

是的,我的发言有点激动。
就在某些东西过去能用而现在不能用的时候,紧张的抽搐开始了 ))
而你开始仔细检查一切,毫无根据地指责崩溃,忘记了一些你当然不记得的特殊性。
而复制粘贴是咎由自取。我想很多人都面临这个问题。

我想建议开发者为指标和EA制作自定义模板
他们将能够在向导中选择它们。

m

一些C/C++编辑器有这个功能。
添加基本模板非常方便,你主要用这些模板工作,然后你在向导中加载它们。
标准的MQL模板根本就不太一样。
很明显,我们可以说,我们可以编写模板,然后复制它们。
我们再次回到 "复制-粘贴 "这个阴险的词。而我们可以将其自动化并使程序员的生活更轻松的事实却没有被考虑到。

原因: