用测试器创造奇迹。 - 页 2

 
尝试了不同的方法--和
ArrayInitialize
и
Циклом 
// ===Если это первый запуск обнулим все буферы:)
if(prev_calculated <= 0)// проверка на первый старт расчёта индикатора
{
for(int i=0;i<=rates_total-1;i++)
{
eeee[i]=EMPTY_VALUE;
}
//Print("!!!Обнулили все буферные массивы!!!");
}

Запускаю первый тест - выдает фигню, второй раз - еще фигню, с третьего раза начинает выдавать правдивый результат уже постоянно.
Не могу понять в чем дело.

Тестировал сегодня с 13.02.12 - 25.02.12 - всего один сигнал на продажу и один сигнал на закрытие продажи.
Как и говорил - с третьего раза начинает постоянно выдавать уже правдивый результат - а до этого ерунду выдает.
А теперь представьте, что вы запускаете оптимизацию - я же не могу по три раза оптимизацию запускать, - короче я не знаю что делать.
Могу конечно код индюка вставить в советник - но вызывать его удобнее из другого индюка.
Кто еще что скажет.

Выкладываю исходники - они уже настроены. 
Запустите тест на ЕвроБакс с 13.02.12 - 25.02.12 - правильный результат -35.20. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.

附加的文件:
MQL5.zip  269 kb
 
1CMaster:
是否有一个链接来正确使用iCustom()并考虑到这些细微差别?因为我已经厌倦了检查它和寻找问题所在。

请看看MQL5中逐个指标的 文章。

有必要初始化指标缓冲区吗?

MQL5中的数组默认不以任何值初始化,这当然适用于使用SetIndexBuffer()分配给指标缓冲区的数组。如果一个数组是一个指标缓冲区,其大小将取决于OnCalculate()处理程序中的rate_total 参数。

可能有一种诱惑,即使用ArrayInitialize() 函数用空的EMPTY_VALUE值初始化所有指标缓冲区,例如,在OnCalculate()的开头一次。

...

 

亲爱的Rosh - 我读了这篇文章,但无法应用它,因为我使用OnCalculate调用的第二种形式,因为我需要每个柱状的时间,而不仅仅是价格。

原因其实是指标缓冲区里有垃圾。用空值初始化缓冲区没有任何效果,因为在测试器中,当新数据出现时,指标缓冲区会自动增长,在开始时它确实包含垃圾,如果缓冲区没有在每个条形上被填充,垃圾就会留在那里。

我的EA在定时器上运行--由于某些原因,它比OnTick()快得多。而且我可以在周末测试它。

我正试图找出每个指标缓冲区 中的内容。其复杂性在于,一个指标根据其数值调用另一个指标。

我将尝试选择一个清晰的时期并设置缓冲区的大小。我将确定测试器中出现假阳性的原因。诶--可惜测试器没有调试器--大家都在等它。

Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
1CMaster:

我有一个在定时器上运行的EA,由于某些原因,它比OnTick()快很多。你也可以在周末进行测试。

在MetaTrader 5中,有一篇文章测试者基础知识,其中显示。

我们测量了不同的定时器参数值(定时器事件周期)下的测试时间。在获得的数据上绘制了一个显示测试时间T对周期性值的依赖性的图表。


很明显,在EventSetTimer(timer)函数初始化定时器时,定时器参数越小,OnTimer()处理程序调用之间的周期(Period)就越小,在同样和相同的条件下测试时间T就越长。
 
1CMaster:

如果真正的垃圾出现在iCustom()中,问题肯定在初始化中。

用零而不是Empty_Value 来初始化缓冲区。 当每个新的条形图出现时,别忘了将相应的缓冲区单元归零。

 
MoneyJinn:

如果真正的垃圾出现在iCustom()中,问题肯定在初始化中。

用零而不是Empty_Value 来初始化缓冲区。 当每个新的条形图出现时,不要忘记将相应的缓冲区单元归零。

是的,我做到了。在每一个指标中,我确保首先将数值清零--帮助摆脱垃圾。

for(i=first;i<rates_total-1 && !IsStopped(); i++)

{
EnterBuffer[i]=0。
EditBuffer[i]=0。

ExitBuffer[i]=0。

....

}

现在我在分钟图上测试它。在小时图上,一切都在像时钟一样工作))))。我对1分钟图上的EA确实有一些疑问。

 

正如预期的那样--没有初始化。在FB指标中。

首先,在OnCalculate函数的 开头,我们应该添加数组的初始化。

   if(prev_calculated==0)
     {
      ArrayInitialize(SignalBuyBuffer,0);
      ArrayInitialize(SignalSellBuffer,0);
      ArrayInitialize(HighBuffer,0);
      ArrayInitialize(LowBuffer,0);
      ArrayInitialize(OpenBuffer,0);
      ArrayInitialize(CloseBuffer,0);
      ArrayInitialize(ColorBuffer,0);
      ArrayInitialize(TrendBuffer,0);
     }

因为你所拥有的初始化,并不总是有效的

第二,在主计算周期中,在周期的最开始,增加对数组零元素的初始化(因为当一个新的条形图被添加到图表中时,指标数组会自动增加,这些新元素没有以任何方式被初始化,既不是明确的因为prev_calculated>0,也不是隐含的)

//---- основной цикл расчета
   for(i=first; i<rates_total && !IsStopped(); i++)
     {     
       SignalBuyBuffer[i]=0;
        SignalSellBuffer[i]=0;
        HighBuffer[i]=0;
        LowBuffer[i]=0;
        OpenBuffer[i]=0;
        CloseBuffer[i]=0;
        ColorBuffer[i]=0;
        TrendBuffer[i]=0;

        if(i == 88366 )
        {
         Print(""+DoubleToString(maxHigh,5)+": "+DoubleToString(minLow,5));
        }

        maxHigh=high[iHighest(high,period,i-1)];
        minLow=low[iLowest(low,period,i-1)];        
        if(open[i-1] > close[i-1]) {

此外,在CustomOptimisation.mqh的TBalanceSlopeCriterion类中,必须添加一个析构器(它不影响结果,但在测试期间会导致内存泄漏)。

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
谢谢大家。我将会进一步测试。
 

我和试验者也创造了奇迹。

我测试一个EA,只有一个名字:测试者绘制对象

...我在另一个名字下保存并编译了EA::没有对象

但我注意到,我已经把终端移到了另一个驱动器上

 
优化和单次通过的结果不匹配(服务台 - #329165 + EA有)。