错误、漏洞、问题 - 页 307

 
Jager:

当试图在usdjpy上测试时,我得到这样的信息。

而且似乎无限期地进行下去,当它达到3000时,我就把它关掉了。测试试图在2010.10.01-2010.10.10切换,只有开盘价

图片401

也无法让另一个远程代理启动,这里是日志。

昨天也观察到一个类似的模式...看起来整个故事是超载了,显然这样做有一些问题。

我似乎等到了进程结束,或者重新启动了终端。

昨天发现了一个有趣的事情。在重新编译EA之后,在测试器中的变化并不奏效,直到你重新启动终端--这就是锡!!!。

 
Im_hungry:
完全支持 - 也许是服务性的?(关闭一百次)
他们都很清楚......。
 

从昨天开始,专家们已经开始了他们的数字生活。

测试时,它给出了一个随机的焦点...它以某种神奇的方式跳过OnInit()函数,然后在DeInit()函数中产生错误数组超出范围。


问题是,在相同的参数下,它可能启动并运行整个测试,也可能崩溃。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Im_hungry:

这里的挑战是:使指标参数动态化,当你平仓时,你会改变指标的一个参数,所以这就是挑战。

现在我的解决方案。

我可以说这段代码是有效的,因为测试显示了不同的结果,但不清楚为什么它能工作t.s.偶尔,我看了一下日志--1周一切工作正常,然后它循环并在缓冲区输出相同的值,尽管这是不可能的(2周测试者日志中的相同值),如果不循环,那么只是写一个错误。

通过警报的信息

据我所知,专家顾问在新条形图出现时,会创建某个指标的句柄,同时要求复制该指标的缓冲区。但这并不能解决可能需要一些时间来计算指标缓冲区 的情况。换句话说,指标句柄可能被成功创建,但指标缓冲区还没有被计算。
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
Yedelkin:
据我所知,专家顾问在出现新条形图时,会创建一些指标句柄,同时要求复制该指标的缓冲区。但情况并不理想,当计算指标缓冲区 可能需要一些时间。换句话说,指标句柄可能被成功创建,但指标缓冲区还没有被计算。

是的,我同意 - 这就是为什么我尝试这种设计。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
   if (isNewBar()==true && proverkaHANDLA()==true)
     {
      if (!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
         {
          BSOpen();
         }
     }    
}
//+==================================================================+
bool proverkaHANDLA()
{
  ArraySetAsSeries(Sp1Buffer,true);
  ArraySetAsSeries(Sp2Buffer,true);
//----------------------
  vhandle=iCustom(NULL,0,"МТ5",Symbol1,100,Lots,1,Close());
  if(vhandle<0)
    {
     Alert("Ошибка при создании индиката: ",GetLastError());
     return(0);
    }
  if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
    {
     Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
     return(0);
    }
  return (true);
}

暂时还能用!谢谢您的帮助

 

但每隔一段时间,它就会失效。

Alert: Ошибка копирования буферов индикатора номер ошибки:4806
 
Im_hungry:

是的,我同意 - 这就是为什么我尝试这种设计。

到目前为止,它是有效的!谢谢您的帮助

这样的结构跳过了 "句柄已被创建,但指标缓冲区 尚未被计算 "的情况。由于构造本身在每个时期被调用一次,你可以尝试多次调用CopyBuffer() 函数。也就是说,如果CopyBuffer()<0,那么就重复调用该函数,只要所选时间段允许(在所选时间段内)。
 
Im_hungry:

但每隔一段时间就会这样。

嗯,这就对了。你的函数proverkaHANDLA()是独立的块,它在内部只引用了一次CopyBuffer() 相应地, 如果不计算缓冲区,它总是会再次弹出。到目前为止,你的函数proverkaHANDLA()并没有处理 "句柄已创建,但指标缓冲区 尚未计算 "的情况,而是忽略了它。

 
Yedelkin:
这种结构跳过了 "手柄已经创建,但指标缓冲区 尚未计算 "的情况。由于构造本身每期被调用一次,你可以尝试重复调用CopyBuffer() 函数。也就是说,如果CopyBuffer()<0,则重复调用该函数,只要所选时间段允许(在所选时间段内)。

也就是说,当CopyBuffer>0时,我们计算它,而新的参数(Close()

在关闭头寸时出现。也就是说,我们需要通过While进行循环。结果是这样的。

if(!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
  {
   While (vhandle>0)
    {
     if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
      {
       Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
       return(0);
      }
    }
  }
 
试着阅读帮助中的BarsCalculated,顺便说一下,它给出了正确的例子。
原因: