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. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
是否有一个链接来正确使用iCustom()并考虑到这些细微差别?因为我已经厌倦了检查它和寻找问题所在。
请看看MQL5中逐个指标的 文章。
有必要初始化指标缓冲区吗?
MQL5中的数组默认不以任何值初始化,这当然适用于使用SetIndexBuffer()分配给指标缓冲区的数组。如果一个数组是一个指标缓冲区,其大小将取决于OnCalculate()处理程序中的rate_total 参数。
可能有一种诱惑,即使用ArrayInitialize() 函数用空的EMPTY_VALUE值初始化所有指标缓冲区,例如,在OnCalculate()的开头一次。
...
亲爱的Rosh - 我读了这篇文章,但无法应用它,因为我使用OnCalculate调用的第二种形式,因为我需要每个柱状的时间,而不仅仅是价格。
原因其实是指标缓冲区里有垃圾。用空值初始化缓冲区没有任何效果,因为在测试器中,当新数据出现时,指标缓冲区会自动增长,在开始时它确实包含垃圾,如果缓冲区没有在每个条形上被填充,垃圾就会留在那里。
我的EA在定时器上运行--由于某些原因,它比OnTick()快得多。而且我可以在周末测试它。
我正试图找出每个指标缓冲区 中的内容。其复杂性在于,一个指标根据其数值调用另一个指标。
我将尝试选择一个清晰的时期并设置缓冲区的大小。我将确定测试器中出现假阳性的原因。诶--可惜测试器没有调试器--大家都在等它。
我有一个在定时器上运行的EA,由于某些原因,它比OnTick()快很多。你也可以在周末进行测试。
在MetaTrader 5中,有一篇文章测试者基础知识,其中显示。
我们测量了不同的定时器参数值(定时器事件周期)下的测试时间。在获得的数据上绘制了一个显示测试时间T对周期性值的依赖性的图表。
![](https://c.mql5.com/3/32/Time_Dependence_rus.png)
很明显,在EventSetTimer(timer)函数初始化定时器时,定时器参数越小,OnTimer()处理程序调用之间的周期(Period)就越小,在同样和相同的条件下测试时间T就越长。如果真正的垃圾出现在iCustom()中,问题肯定在初始化中。
用零而不是Empty_Value 来初始化缓冲区。 当每个新的条形图出现时,别忘了将相应的缓冲区单元归零。
如果真正的垃圾出现在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函数的 开头,我们应该添加数组的初始化。
因为你所拥有的初始化,并不总是有效的
第二,在主计算周期中,在周期的最开始,增加对数组零元素的初始化(因为当一个新的条形图被添加到图表中时,指标数组会自动增加,这些新元素没有以任何方式被初始化,既不是明确的因为prev_calculated>0,也不是隐含的)
此外,在CustomOptimisation.mqh的TBalanceSlopeCriterion类中,必须添加一个析构器(它不影响结果,但在测试期间会导致内存泄漏)。
我和试验者也创造了奇迹。
我测试一个EA,只有一个名字:测试者绘制对象
...我在另一个名字下保存并编译了EA::没有对象
但我注意到,我已经把终端移到了另一个驱动器上