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

 

У меня на данный момент вместо

        if (this.Header.snapshot_size)
          this.UnknownNum = ::FileReadInteger(handle);

        const bool Offset = this.Header.record_size - this.Header.opt_params_size - sizeof(T) == 8;

        for (int i = 0; i < Size; i++)
        {
          ::FileReadStruct(handle, this.Record[i].Result);

          ::FileReadArray(handle, this.Record[i].OptBuffer, 0, this.Header.opt_params_size);

          if (Offset)
            ::FileReadArray(handle, this.Record[i].Genetic, 0, sizeof(long) + this.Header.dwords_cnt * sizeof(int));
          else
            ::FileReadArray(handle, this.Record[i].Genetic, 0, this.Header.dwords_cnt * sizeof(int));
        }

выглядит

    if (this.Header.opt_mode == 0)
      this.UnknownNum = ::FileReadInteger(handle);

    for (int i = 0; i < Size; i++)
    {
      ::FileReadStruct(handle, this.Record[i].Result);

      ::FileReadArray(handle, this.Record[i].OptBuffer, 0, this.Header.opt_params_size);

      if (this.Header.dwords_cnt > 1)
        ::FileReadArray(handle, this.Record[i].Genetic, 0, this.Header.dwords_cnt * sizeof(int));
      else if (this.Header.opt_mode == 1)
        ::FileReadArray(handle, this.Record[i].Genetic, 0, sizeof(long));
    }

И аналогично вместо

        if (this.Header.snapshot_size)
        {
          this.UnknownNum = _R(Bytes)[Pos];

          Pos += sizeof(this.UnknownNum);
        }

        const bool Offset = this.Header.record_size - this.Header.opt_params_size - sizeof(T) == sizeof(long);

        for (int i = 0; i < Size; i++)
        {
          T Result[1];

          Pos += ::_ArrayCopy(Result, Bytes, 0, Pos, sizeof(T));
          this.Record[i].Result = Result[0];

          Pos += ::_ArrayCopy(this.Record[i].OptBuffer, Bytes, 0, Pos, this.Header.opt_params_size);

          if (Offset)
            Pos += ::_ArrayCopy(this.Record[i].Genetic, Bytes, 0, Pos, sizeof(long) + this.Header.dwords_cnt * sizeof(int));
          else
            Pos += ::_ArrayCopy(this.Record[i].Genetic, Bytes, 0, Pos, this.Header.dwords_cnt * sizeof(int));
        }

сейчас

    if (this.Header.opt_mode == 0)
    {
      this.UnknownNum = _R(Bytes)[Pos];

      Pos += sizeof(this.UnknownNum);
    }

    for (int i = 0; i < Size; i++)
    {
      T Result[1];

      Pos += ::_ArrayCopy(Result, Bytes, 0, Pos, sizeof(T));
      this.Record[i].Result = Result[0];

      Pos += ::_ArrayCopy(this.Record[i].OptBuffer, Bytes, 0, Pos, this.Header.opt_params_size);

      if (this.Header.dwords_cnt > 1)
        Pos += ::_ArrayCopy(this.Record[i].Genetic, Bytes, 0, Pos, this.Header.dwords_cnt * sizeof(int));
      else if (this.Header.opt_mode == 1)
        Pos += ::_ArrayCopy(this.Record[i].Genetic, Bytes, 0, Pos, sizeof(long));
    }

Почему в новой весии были изменения на оффсет и перевязка на snapshot_size с opt_mode == 0, не совсем понимаю. Судя по изначальному посту https://www.mql5.com/ru/forum/1111/page2440#comment_11395809 исходный вариант был правильный. Так что я себе его оставил. Тем более, на моих тестах он работает.

P.S. Сохранением не пользуюсь, не проверял.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2019.04.19
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
fxsaber:

К сожалению или к счастью, КБ-работы почти не используются, несмотря на написание статьи. Видимо, не зашло. 

Лично я очень благодарен за MultiTester. Идея кликера дала толчок для своего помощника оптимизации. Именно низкоуровневые функции. Я даже выкладывал добавления.
Про библиотеку MT4 я и не говорю.
TesterCache тоже ценная вещь, но я уже реализовал фреймы и закрыл свои потребности.
И Tester полезна, не помню сейчас, что оттуда использую.
 
traveller00:

Почему в новой весии были изменения на оффсет и перевязка на snapshot_size с opt_mode == 0, не совсем понимаю.

В этом причина.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: TesterCache

fxsaber, 2019.12.16 19:06

В смысл некоторых полей не смог въехать, поэтому такая гадость в коде создалась. Отлаживал методом тыка и имеющихся opt-файлах. Там же должно работать для Математического и ВсеСимвольного режимов Оптимизации.

Не работал исходный вариант на всем множестве opt-файлов, что сгенерировал. Где-то что-то отваливалось постоянно. Думаю, если сгенерируете много opt-файлов из разных режимов Оптимизации, то наткнетесь на случай, когда Ваш вариант реализации споткнется.


Мне было очень неприятно фактически подбирать логику (потому что она совсем не стала ясна при проверке на opt-файлах), чтобы она универсально заработала во всех случаях, что сумел создать. В данный момент только помню, что убил уйму времени на это. И очень надеюсь, что текущая реализация не даст сбой.

 
Edgar Akhmadeev:
Лично я очень благодарен за MultiTester. Идея кликера дала толчок для своего помощника оптимизации. Именно низкоуровневые функции. Я даже выкладывал добавления.
Про библиотеку MT4 я и не говорю.
TesterCache тоже ценная вещь, но я уже реализовал фреймы и закрыл свои потребности.
И Tester полезна, не помню сейчас, что оттуда использую.

Спасибо за отзыв. Сценарии использования TesterCache не пересекаются со фреймами.

Как-нибудь выложу реализации, как использую.


Было бы интересно узнать, как кто видит полезным для себя использование opt-файлов и tst-файлов

 
fxsaber:

Не работал исходный вариант на всем множестве opt-файлов, что сгенерировал. Где-то что-то отваливалось постоянно. Думаю, если сгенерируете много opt-файлов из разных режимов Оптимизации, то наткнетесь на случай, когда Ваш вариант реализации споткнется.

Пока не споткнулась. Да и вроде следует официальной (хоть и устаревшей) версии формата файла. Если что найдёте-кидайте, самому будет интересно глянуть.

P.S. Использую в 99% генетику, в оставшихся 1% полный перебор. Парсинг как opt, так и разовых проходов tst, что выкладывал ранее.

 
traveller00:

Пока не споткнулась. Да и вроде следует официальной (хоть и устаревшей) версии формата файла. Если что найдёте-кидайте, самому будет интересно глянуть.

Не найду, т.к. используем разные реализации. Попробуйте ВсеСимволный opt-файл. И BruteForce + Genetic.

 
Обещали сделать поддержку нормального формата datetime в сет-файлах https://www.mql5.com/ru/forum/321656/page43#comment_14349716 Тогда можно будет генерить из кеша параметры с человеческим форматом даты-времени.
Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
  • 2019.12.23
  • www.mql5.com
В настоящий момент тестер стратегий MetaTrader 5 подвергается глубокой переработки командой MQ...
 
traveller00:
Обещали сделать поддержку нормального формата datetime в сет-файлах https://www.mql5.com/ru/forum/321656/page43#comment_14349716 Тогда можно будет генерить из кеша параметры с человеческим форматом даты-времени.

Сейчас отличный формат. В сет-файлах есть возможность добавлять комментарии. Туда можно генерировать любую информацию для "дешифровки".

 
version = 515

На 515 версии кэша не работает толком.

Результат демки отличается от результатов с самого тестера.

 
Aliaksandr Hryshyn:

На 515 версии кэша не работает толком.

Результат демки отличается от результатов с самого тестера.

Без воспроизведения ничего не сделать.