Чудеса с тестером. - страница 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(). Если массив является индикаторным буфером, то его размер в процессе работы будет зависеть от параметра rates_total в обработчике OnCalculate(). 

Может возникнуть соблазн инициализировать все индикаторные буферы пустым значением EMPTY_VALUE с помощью функции ArrayInitialize(), например, однократно в начале OnCalculate()

...

 

Уважаемый Rosh - я читал эту статью, но применить ее не смог, так как у меня используется вторая форма вызова OnCalculate, так как мне необходимо время каждого бара, а не только цена.

Причина действительно в том, что в буфере индикатора появляется хлам. И инициализация буфера пустыми значениями ничего не дает, так как в тестере при появлении новых данных буфер индикатора автоматически растет и в нем действительно вначале мусор, а если в индикаторе буфер не заполняется на каждом баре - то мусор так и остается там.

У меня советник работает по таймеру - так намного быстрее почему то, чем по функции OnTick(). Да и в выходные можно тестировать.

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

Попробую выделить четкий период и задать буферам размер. Определю причину ложных срабатываний тестера. Эх - жаль в тестере нет отладчика - а так все его ждали и ждут.

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

У меня советник работает по таймеру - так намного быстрее почему то, чем по функции OnTick(). Да и в выходные можно тестировать.

Есть статья Основы тестирования в MetaTrader 5, где показано:

Были сделаны замеры времени тестирования при различных значениях параметра timer (периочность события Timer). На полученных данных построен график зависимости времени тестирования T от значения периодичности Period.


Хорошо видно, чем меньше параметр timer при инициализации таймера функцией EventSetTimer(timer), тем меньше период (Period) между вызовами обработчика OnTimer(), и  тем больше время тестирования 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;

               ....

     }

Сейчас проверяю на минутном графике. На часовом работает все как часики уже))) А на минутном есть вопросы еще у меня к работе советника.

 

Как и предполагалось - отсутствие инициализации. В индикаторе 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); }
 
Спасибо всем. Буду тестировать дальше.
 

У меня тоже было чудо с тестером.

Тестирую советник с одним именем: тестер рисует объекты

...сохранил и компильнул советник под другим именем::объектов не видно

но замечу что перебросил терминал на другой диск 

 
Не совпадают результаты проходов при оптимизации и одиночном проходе (сервис-деск - #329165 + советник там-же)