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

 

Как и говорил, выкладываю парсинг одиночных проходов tst. Прикрутил к существующим исходникам, старался ничего не сломать, соблюдать совместимость обратную.

С новым кешем работать через

SINGLEPASSTST<ExpTradeSummary> TstCache;

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

Файлы:
TesterCache.mqh  13 kb
TstHeader.mqh  13 kb
 
traveller00:

Как и говорил, выкладываю парсинг одиночных проходов tst. Прикрутил к существующим исходникам, старался ничего не сломать, соблюдать совместимость обратную.

Отличный код, Спасибо!

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

Видимо, Вам нужно на OOS запускать, поэтому нужен ExpTradeSummary прохода. Я эти данные получаю через inFakeRange. А в tst-файле интересует торговая история. Поэтому ждем раскрытия формата.

 
Да, Вы правы. Я выстаскиваю наиболее интересные варианты из оптимизации и прогоняю их на более длинном OOS, отсеивая автоматикой ненужное. А наиболее перспективные уже кручу потом руками. Для этих целей выложенного кода мне хватило. Если понадобится что-то ещё и полезу в дебри tst дальше, я обновлю формат и код.
 
fxsaber:

Способ быстрого импорта кеша из песочницы.

  1. Выбрали во вкладке Оптимизация меню импортировать.
  2. В диалоге выбора файла сделать CTRL+V это строки  ..\..\MQL5\Files\*.opt и нажать Enter.
Возможно, разработчики сделают drag&drop-механизм, тогда будет гораздо проще и удобнее.

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

Например, через эту функцию

MTTESTER::SetClipboard("..\\..\\MQL5\\Files\\*.opt");
 
В TestCacheHeader.mqh вывод TOSTRING2((ENUM_TIMEFRAMES)period) выведет строку как (ENUM_TIMEFRAMES)period = PERIOD_M1. Не баг, просто мелкая некрасивость.
 

Похоже, что такая конструкция неправильная

      if (this.Header.opt_mode == 1)
        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 == 1)
        ::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));

Обе из файла TesterCache.mqh. Налетел при тестировании, где у меня dwords_cnt=3. И всё съехало на 8 байтов. Если обратиться к оригиналу  https://www.mql5.com/ru/forum/1111/page2440#comment_11395809

   if(m_header.dwords_cnt>1)
      m_header.record_size+=m_header.dwords_cnt*sizeof(DWORD);
   else
     {
      if(m_genetics)
         m_header.record_size+=sizeof(INT64);
     }

то код должен быть типа

      if (this.Header.dwords_cnt)
        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));

Так у меня работают оба варианта, как старый с  dwords_cnt=0, который всегда работал, так и новый с  dwords_cnt=3.

Запись не проверял, ибо не использую.

P.S. По половине инструментов я один бегрепорты пишу? Или остальные скромничают и просто в личку пишут?

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

Похоже, что такая конструкция неправильная

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

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

P.S. По половине инструментов я один бегрепорты пишу? Или остальные скромничают и просто в личку пишут?

Почти все багрепорты по моим работам касались MT4Orders. За пол года, наверное, был только один багрепорт. И опять же по торговой библиотеке. По остальным - ноль.

Это объяснимо, т.к. торговая часть нужна многим MT4-кодерам, а другое - почти никому. Вы великолепно продебажили мои работы и выдали на гора очень много багрепортов, которые, вроде, позыкрывал. Вам за это Благодарен!

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

 

Для себя исправил на

      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));

и

      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));

соответственно.

Что было под рукой, на всём прогнал, пока работает. Если что отвалится, понятное дело, отпишусь.

Я относительно недавно начал этим заниматься, сам пробую, тыкаю, что-то адаптирую и дописываю под себя. В первую очередь Ваши работы весьма интересны с познавательной и общеобразовательной точки зрения. Ну и во вторую очередь есть ощущение, что это может быть не только интересно, но и полезно с точки зрения профита. Так что спасибо Вам огромное за все выложенные работы и статьи. Хотя я ещё до сих пор не всё осилил, вдумываться надо, прилично времени уходит. Я сам программист, разработка даётся достаточно легко. Но тематика трейдинга для меня новая.

 
traveller00:

Для себя исправил на

У Вас старая версия библиотеки была. В версии от 27-го ноября нет строк, что указали.

 
Да, Вы правы, у меня более старая версия. Видимо, предыдущая. 27 ноября был тихий апдейт без анонсов, я и не обновился.