Библиотеки: TesterCache - страница 7

 
Edgar Akhmadeev:
Сразу внёс добавление. В функцию поиска свежего кеша передаю время/дату, новее которого интересует файл. Время запоминаю перед запуском очередной оптимизации из мультитестера.
Кроме того, в обеих библиотеках (.opt и .tst) будут полезны 2 функции загрузки, средствами MQL и WinAPI. Не считая загрузки из массива. Для полноты, сам-то я сделал чтение извне в массив.

Не понял эти предложения.

 
fxsaber:

Не понял эти предложения.

1. При поиске последнего кеша убеждаюсь, что он был изменён после начала оптимизации. При пакетной оптимизации иногда случаются сбои, случайные нажатия и т.д., оптимизация не выполнена, а мультитестер может перейти на следующий этап и взять уже обработанный кеш. Такая защита.

2. В библиотеке функция загрузки файла работает средствами mql и берет файлы из песочницы, куда надо вручную копировать. Я работаю с папкой tester/Cache, и здесь нужна аналогичная функция с WinAPI. Такая загрузка кеша у Вас где-то в коде есть (возможно, в скрипте, я пишу с телефона, на память), осталось только добавить ее в класс.
 

Edgar Akhmadeev:
1. При поиске последнего кеша убеждаюсь, что он был изменён после начала оптимизации. При пакетной оптимизации иногда случаются сбои, случайные нажатия и т.д., оптимизация не выполнена, а мультитестер может перейти на следующий этап и взять уже обработанный кеш. Такая защита.

Проблема взятия не того кеша мне знакома. Но хорошо бы сценарий расписать подробнее.
2. В библиотеке функция загрузки файла работает средствами mql и берет файлы из песочницы, куда надо вручную копировать. Я работаю с папкой tester/Cache, и здесь нужна аналогичная функция с WinAPI. Такая загрузка кеша у Вас где-то в коде есть (возможно, в скрипте, я пишу с телефона, на память), осталось только добавить ее в класс.

Именно по этой причине сделаны

bool Load( const uchar &Bytes[] );
TESTERCACHE( const uchar &Bytes[] );

Т.е. добавляйте файл в виде массива байтов. Соответственно, получение этого массива (через WinAPI или другим способом) - это уже задача вне библиотеки. Т.е. библиотека не требует добавки для работы с файлами не из песочницы.

 
fxsaber:
Проблема взятия не того кеша мне знакома. Но хорошо бы сценарий расписать подробнее.


const string Dir = "c:/Programs/MT5/Tester/cache/";
const int TZ = 3;



{
        string Mask = StringFormat("%s.%s.M1.%s.%s.*.*.opt", Expert, Sym, From, To);

        datetime Time = TimeLocal();
        CTester::Run();
        string name = GetFreshFileName(Dir, Mask, Time);        // Must be newer than Time
        if (name == NULL) {
                // No new cache file
        }

        // Process cache
        ...
}



string 
GetFreshFileName(const string dir, const string mask, datetime time) {
        string s = NULL;
        FIND_DATAW findData;
        const HANDLE handle = kernel32::FindFirstFileW(dir + mask, findData);
        if (handle != INVALID_HANDLE) {
                ulong maxTime = 0;
                
                do {
                        const ulong tempTime = ((ulong)findData.ftLastWriteTime.dwHighDateTime << 32) + findData.ftLastWriteTime.dwLowDateTime;
                        datetime t = WinTime2datetime(tempTime);
                        if (tempTime > maxTime && t > time) {
                                maxTime = tempTime;
                                s = ShortArrayToString(findData.cFileName);
                        }
                }
                while (kernel32::FindNextFileW(handle, findData));
                
                kernel32::FindClose(handle);
        }
        
        return s;
}



datetime
WinTime2datetime(ulong time) {
        ulong diff = ulong(((1970 - 1601) * 365 + 89)) * SecsPerDay;
        return datetime(time / 10000000 - diff) + TZ * SecsPerHour;
}

 
Edgar Akhmadeev:

Спасибо, хорошее решение.

 

Как в этой функции отбирать только проходы последней оптимизации? Т.е. я не могу найти в кеше информацию "<поколение>,<экземпляр>" и его пустое значение означало бы прошлые проходы.

        template <typename T> int GetBestPos(const TESTERCACHE<T>& cache) {
                int idx = 0;
                double best = -DBL_MAX;
                
                for (int i = cache.GetAmount() - 1; i >= 0; i--) {
                        double t = cache[i].TesterStatistics(STAT_CUSTOM_ONTESTER);
                        if (best < t) {
                                best = t;
                                idx = i;
                        }
                }
                
                return idx;
        }
 
Edgar Akhmadeev:

Как в этой функции отбирать только проходы последней оптимизации? Т.е. я не могу найти в кеше информацию "<поколение>,<экземпляр>" и его пустое значение означало бы прошлые проходы.

Эта информация не хранится в кеше, а только отображается в GUI.

Можете запоминать количество проходов в opt-файле до Оптимизации. А после Оптимизации смотреть новые проходы там, начиная с записанного ранее.

 
fxsaber:

Эта информация не хранится в кеше, а только отображается в GUI.

Я так и думал

fxsaber:

Можете запоминать количество проходов в opt-файле до Оптимизации. А после Оптимизации смотреть новые проходы там, начиная с записанного ранее.

А точно новые оптимизации добавляются в конец? Нигде порядок не меняется?

Тогда это было бы решением. Пока удаляю кеш каждый раз.


 
Edgar Akhmadeev:

А точно новые оптимизации добавляются в конец? Нигде порядок не меняется?

Неточно. Нужно проверять.

 
fxsaber:

Неточно. Нужно проверять.

Проверил на десятках ген. оптимизаций. Всё ок.

Причина обращения: