Нулевые результаты оптимизации в тестере
Всем привет.
Такая проблема. В результатах оптимизации присутствуют нулевые результаты:
Все бы ничего, но когда вручную ставишь этот результат и прогоняешь его, результат перестает быть нулевым.
Что я только не делал, где только не искал. Поставил запись сообщений в файл из основных функций в OnTesterPass(), думал че интересное увижу, но при нулевых результатах он ничего не записывает. Такое чувство, что при нулевом результате его нигде нет: ни в OnInit, ни в OnTick, ни в OnTester, ни в OnTesterPass. Что тестер просто каким то образом обходит все процедуры и ставит результат ноль.
В чем может быть дело?
нужно смотреть закономерность переменных при нулевых и ненулевых и по ним искать в коде
нужно смотреть закономерность переменных при нулевых и ненулевых и по ним искать в коде
не понял...
*закономерность перебираемых параметров при нулевых и ненулевых разультатах
Первое, что я бы сделал - убедился, что в нулевых результатах действительно вызываются все указаные функции.
Сделал бы это через особый результат OnTester() - если нужная функция не вызывалась - возвращаем это самое значение (и включаем кастомный критерий в тестере). Скорее всего - таких значений не будет, эти функции вызываются.
Значит, дальше - уже по коду смотрим, где идет анализ и принятие решения - опять же, там, где сделки должны происходить, но не происходят - выставляем особый флаг возврата, и смотрим по результатам.
Процедура, конечно, довольно муторная, но если и правда, в одиночном проходе сделки есть, а в тестерном - их нет, то другого ничего и не придумаешь для локализации проблемы.
Такая проблема. В результатах оптимизации присутствуют нулевые результаты:
Все бы ничего, но когда вручную ставишь этот результат и прогоняешь его, результат перестает быть нулевым.
Масса вариантов. Например, считывается файл, который не на всех агентах одинаковый.
Отрубите все агенты, оставив один. Скорее всего, ситуация изменится.
Думаю все проще, не все переменные инициализируете в OnInit. Получается если первый раз запустили - переменные обнулены, если оптимизация - переменные не сбрасываются.
Разработчики писали, что при оптимизации все переменные обнуляются.
@George Merts , спасибо за мысль, помогло.
В итоге, нашел причину, в коде в OnTick() стоит
if(Bars(Symbol(),Period())> glb_MaxIndicatorPeriod){
glb_MaxIndicatorPeriod часто особенно в первых прогонах тестера возвращает вот что (первые две строки):
такое чувство, что в glb_MaxIndicatorPeriod попадают случайные значения из памяти, но высчитывается он правильно:
struct ParametersOfIndicators
{
int ZigZagPeriod;
int ZigZagBackStep;
string NameOfIndicator;
int Parameter_1;
int Parameter_2;
int Parameter_3;
double KoefSigmoid;
double AlphaSigmoid;
int ParametersQuantity;
};
//+------------------------------------------------------------------+
//| class CommitteeOfNeuroExperts |
//+------------------------------------------------------------------+
class CommitteeOfNeuroExperts
{
// тут были конструктор, деструктор и т.д.....
void InitializationParametersOfIndicators(void);
int CalculateMaxParameterOfIndicators(void);
ParametersOfIndicators cone_ParametersOfIndicators[];
};
// Это есть в конструкторе, который тут опущен: ArrayResize(cone_ParametersOfIndicators,arg_NeuralNetworkQuantity);
//+------------------------------------------------------------------+
//|на всякий случай добавил процедуру инициализации: |
//+------------------------------------------------------------------+
void CommitteeOfNeuroExperts::InitializationParametersOfIndicators(void)
{
for (int i=0;i<cone_NeuralNetworkQuantity;++i)
{
cone_ParametersOfIndicators[i].ZigZagPeriod = 0;
cone_ParametersOfIndicators[i].ZigZagBackStep = 0;
cone_ParametersOfIndicators[i].NameOfIndicator = "";
cone_ParametersOfIndicators[i].Parameter_1 = 0;
cone_ParametersOfIndicators[i].Parameter_2 = 0;
cone_ParametersOfIndicators[i].Parameter_3 = 0;
cone_ParametersOfIndicators[i].KoefSigmoid = 0.0;
cone_ParametersOfIndicators[i].AlphaSigmoid = 0.0;
cone_ParametersOfIndicators[i].ParametersQuantity = 0;
}
}
//потом массив cone_ParametersOfIndicators[i] заполняется input параметрами...
//+------------------------------------------------------------------+
//| расчет максимального параметра: |
//+------------------------------------------------------------------+
int CommitteeOfNeuroExperts::CalculateMaxParameterOfIndicators(void)
{
int MaxParameter = 0;
for (int i=0;i<cone_NeuralNetworkQuantity;++i)
{
if (cone_NeuroExperts[i].dt_Use == false)
continue;
if (cone_ParametersOfIndicators[i].ZigZagPeriod > MaxParameter)
MaxParameter = cone_ParametersOfIndicators[i].ZigZagPeriod;
else if (cone_ParametersOfIndicators[i].ZigZagBackStep > MaxParameter)
MaxParameter = cone_ParametersOfIndicators[i].ZigZagBackStep;
else if (cone_ParametersOfIndicators[i].Parameter_1 > MaxParameter)
MaxParameter = cone_ParametersOfIndicators[i].Parameter_1;
else if (cone_ParametersOfIndicators[i].Parameter_2 > MaxParameter)
MaxParameter = cone_ParametersOfIndicators[i].Parameter_2;
else if (cone_ParametersOfIndicators[i].Parameter_3 > MaxParameter)
MaxParameter = cone_ParametersOfIndicators[i].Parameter_3;
}
return MaxParameter;
}
и разве не должны в тестере прогоны идти по порядку, а не 5,15,10,16,0 (из 20) ? (при полном переборе параметров, медленная оптимизация)
Если сделаю вот так:
if(Bars(Symbol(),Period())>110){
то все пучком:
@fxsaber , данные из файлов не читаю.
@Aleksei Radchenko , glb_MaxIndicatorPeriod инициализируется в OnInit()
glb_MaxIndicatorPeriod = glb_CommitteeOfNeuroExperts.CalculateMaxParameterOfIndicators();
объявлена эта переменная на глобальном уровне.
И возникает все это именно при оптимизации, при ручных прогонах нулевые результаты исчезают.
@Nikolay Gaylis, оптимизируется параметр пустышка, который в коде ничего не делает. То есть советник грузится всегда с одними и теми же параметрами.
Масса вариантов. Например, считывается файл, который не на всех агентах одинаковый.
Отрубите все агенты, оставив один. Скорее всего, ситуация изменится.
На одном агенте, при (то есть когда есть нулевые результаты в тестере)
if(Bars(Symbol(),Period())> glb_MaxIndicatorPeriod){
получилось все нормально:
и проходы идут по порядку,а не так, как выше. И в чем может быть дело? как теперь остальные агенты (3 шт) включить так, чтоб все нормально тестировалось?
Вообщем, почистил Roaming\MetaQuotes\Terminal\Tester, почистил C:\Program Files\Alfa-Forex MetaTrader 5\Tester, перезагрузился, активировал все агенты, запустил оптимизацию, все прошло хорошо. При этом, папка tester в Roaming\MetaQuotes\Terminal не создалась, создалась только в диске C:\Program Files\Alfa-Forex MetaTrader 5.
То есть у агентов кеш разъехался? Часть агентов работало из Roaming, часть из Program Files ? и один из агентов косячил.... Я как раз на той неделе сделал так, чтоб каталог данных терминала всегда был равен каталогу установки, а не так, чтоб он создавался в Roaming\MetaQuotes\Terminal. (здесь описание https://www.metatrader5.com/ru/terminal/help/start_advanced/start)
Может тогда что-то слетело у агентов....

- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет.
Такая проблема. В результатах оптимизации присутствуют нулевые результаты:
Все бы ничего, но когда вручную ставишь этот результат и прогоняешь его, результат перестает быть нулевым.
Что я только не делал, где только не искал. Поставил запись сообщений в файл из основных функций в OnTesterPass(), думал че интересное увижу, но при нулевых результатах он ничего не записывает. Такое чувство, что при нулевом результате его нигде нет: ни в OnInit, ни в OnTick, ни в OnTester, ни в OnTesterPass. Что тестер просто каким то образом обходит все процедуры и ставит результат ноль.
В чем может быть дело?