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 не инициализируются по умолчанию каким-либо значением, и это безусловно относится также и к массивам, которые назначаются индикаторным буферам функцией SetIndexBuffer(). Если массив является индикаторным буфером, то его размер в процессе работы будет зависеть от параметра rates_total в обработчике OnCalculate().
Может возникнуть соблазн инициализировать все индикаторные буферы пустым значением EMPTY_VALUE с помощью функции ArrayInitialize(), например, однократно в начале OnCalculate()
Уважаемый Rosh - я читал эту статью, но применить ее не смог, так как у меня используется вторая форма вызова OnCalculate, так как мне необходимо время каждого бара, а не только цена.
Причина действительно в том, что в буфере индикатора появляется хлам. И инициализация буфера пустыми значениями ничего не дает, так как в тестере при появлении новых данных буфер индикатора автоматически растет и в нем действительно вначале мусор, а если в индикаторе буфер не заполняется на каждом баре - то мусор так и остается там.
У меня советник работает по таймеру - так намного быстрее почему то, чем по функции OnTick(). Да и в выходные можно тестировать.
Сейчас пытаюсь выяснить что сидит в каждом индикаторном буфере. Сложность заключается еще в том, что один индикатор вызывает другой рассчитывается на основе его значений.
Попробую выделить четкий период и задать буферам размер. Определю причину ложных срабатываний тестера. Эх - жаль в тестере нет отладчика - а так все его ждали и ждут.
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
Были сделаны замеры времени тестирования при различных значениях параметра timer (периочность события Timer). На полученных данных построен график зависимости времени тестирования T от значения периодичности Period.
Хорошо видно, чем меньше параметр timer при инициализации таймера функцией EventSetTimer(timer), тем меньше период (Period) между вызовами обработчика OnTimer(), и тем больше время тестирования T при одних и тех же остальных условиях.
Потому что та инициализация, которая есть у Вас, не всегда срабатывает
Во-вторых, в основном цикле расчёта в самом его начале добавить инициализацию нулевых элементов массивов (так как при добавлении нового бара на графике автоматически увеличиваются и индикаторные массивы, и эти новые элементы никак не инициализируются, ни явно потому что prev_calculated>0, ни неявно)
Кроме этого в CustomOptimisation.mqh в классе TBalanceSlopeCriterion обязательно надо добавить деструктор (это на результат не влияет, но при тестировании получается утечка памяти)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Есть ссылка на правильное использование iCustom() с учетом этих нюансов ??? А то устал я его проверять и искать в чем же дело.
Посмотрите статью Индикатор от индикатора в MQL5:
Нужна ли инициализация индикаторных буферов?
Массивы в MQL5 не инициализируются по умолчанию каким-либо значением, и это безусловно относится также и к массивам, которые назначаются индикаторным буферам функцией SetIndexBuffer(). Если массив является индикаторным буфером, то его размер в процессе работы будет зависеть от параметра rates_total в обработчике OnCalculate().
Может возникнуть соблазн инициализировать все индикаторные буферы пустым значением EMPTY_VALUE с помощью функции ArrayInitialize(), например, однократно в начале OnCalculate()
...
Уважаемый Rosh - я читал эту статью, но применить ее не смог, так как у меня используется вторая форма вызова OnCalculate, так как мне необходимо время каждого бара, а не только цена.
Причина действительно в том, что в буфере индикатора появляется хлам. И инициализация буфера пустыми значениями ничего не дает, так как в тестере при появлении новых данных буфер индикатора автоматически растет и в нем действительно вначале мусор, а если в индикаторе буфер не заполняется на каждом баре - то мусор так и остается там.
У меня советник работает по таймеру - так намного быстрее почему то, чем по функции OnTick(). Да и в выходные можно тестировать.
Сейчас пытаюсь выяснить что сидит в каждом индикаторном буфере. Сложность заключается еще в том, что один индикатор вызывает другой рассчитывается на основе его значений.
Попробую выделить четкий период и задать буферам размер. Определю причину ложных срабатываний тестера. Эх - жаль в тестере нет отладчика - а так все его ждали и ждут.
У меня советник работает по таймеру - так намного быстрее почему то, чем по функции OnTick(). Да и в выходные можно тестировать.
Есть статья Основы тестирования в MetaTrader 5, где показано:
Были сделаны замеры времени тестирования при различных значениях параметра timer (периочность события Timer). На полученных данных построен график зависимости времени тестирования T от значения периодичности Period.

Хорошо видно, чем меньше параметр timer при инициализации таймера функцией EventSetTimer(timer), тем меньше период (Period) между вызовами обработчика OnTimer(), и тем больше время тестирования 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;
....
}
Сейчас проверяю на минутном графике. На часовом работает все как часики уже))) А на минутном есть вопросы еще у меня к работе советника.
Как и предполагалось - отсутствие инициализации. В индикаторе FB
Во-первых, в начале функции OnCalculate необходимо добавить инициализацию массивов
Потому что та инициализация, которая есть у Вас, не всегда срабатывает
Во-вторых, в основном цикле расчёта в самом его начале добавить инициализацию нулевых элементов массивов (так как при добавлении нового бара на графике автоматически увеличиваются и индикаторные массивы, и эти новые элементы никак не инициализируются, ни явно потому что prev_calculated>0, ни неявно)
Кроме этого в CustomOptimisation.mqh в классе TBalanceSlopeCriterion обязательно надо добавить деструктор (это на результат не влияет, но при тестировании получается утечка памяти)
~TBalanceSlopeCriterion() { delete(balance_Ptr); }У меня тоже было чудо с тестером.
Тестирую советник с одним именем: тестер рисует объекты
...сохранил и компильнул советник под другим именем::объектов не видно
но замечу что перебросил терминал на другой диск