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

 

TesterCache:

Чтение/Запись opt-файлов оптимизационных кешей MT5-тестера

TesterCache

Автор: fxsaber

 
Good Beer:
Подскажите пожалуйста, как с помощью этой библиотеки получить значение профита в форварде по номеру прохода внутри советника?

Все данные прохода в кеше.

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

Ошибки, баги, вопросы

Slava, 2019.04.19 15:11

//+------------------------------------------------------------------+
//| Структура для статистики торговли                                |
//+------------------------------------------------------------------+
struct ExpTradeSummary
  {
   double            initial_deposit;     // начальный депозит
   double            withdrawal;          // снято средств
   double            profit;              // общая прибыль (+)
   double            grossprofit;         // общий плюс
   double            grossloss;           // общий минус
   double            maxprofit;           // максимально прибыльная сделка
   double            minprofit;           // максимально убыточная сделка
   double            conprofitmax;        // прибыль максимальной последовательности прибыльных сделок
   double            maxconprofit;        // максимальная прибыль среди последовательностей
   double            conlossmax;          // убыток максимальной последовательности убыточных сделок
   double            maxconloss;          // максимальный убыток среди последовательностей
   double            balance_min;         // минимальное значение баланса (для расчёта абсолютной просадки)
   double            maxdrawdown;         // максимальная просадка по балансу
   double            drawdownpercent;     // отношение максимальной просадки по балансу к её пику
   double            reldrawdown;         // максимальная относительная просадка по балансу в деньгах
   double            reldrawdownpercent;  // максимальная относительная просадка по балансу в процентах
   double            equity_min;          // минимальное значение equity (для расчёта абсолютной просадки по equity)
   double            maxdrawdown_e;       // максимальная просадка по equity
   double            drawdownpercent_e;   // отношение максимальной просадки по equity к её пику (+)
   double            reldrawdown_e;       // максимальная относительная просадка по equity в деньгах
   double            reldrawdownpercnt_e; // максимальная относительная просадка по equity в процентах
   double            expected_payoff;     // матожидание выигрыша (+)
   double            profit_factor;       // показатель прибыльности (+)
   double            recovery_factor;     // фактор восстановления (+)
   double            sharpe_ratio;        // коэффициент Шарпа (+)
   double            margin_level;        // минимальный уровень маржи
   double            custom_fitness;      // пользовательский фитнесс - результат OnTester (+)
   int               deals;               // общее количество сделок
   int               trades;              // количество сделок out/inout
   int               profittrades;        // количество прибыльных
   int               losstrades;          // количество убыточных
   int               shorttrades;         // количество шортов
   int               longtrades;          // количество лонгов
   int               winshorttrades;      // количество прибыльных шортов
   int               winlongtrades;       // количество прибыльных лонгов
   int               conprofitmax_trades; // максимальная последовательность прибыльных сделок
   int               maxconprofit_trades; // последовательность максимальной прибыли
   int               conlossmax_trades;   // максимальная последовательность убыточных сделок
   int               maxconloss_trades;   // последовательность максимального убытка
   int               avgconwinners;       // среднее количество последовательных прибыльных сделок
   int               avgconloosers;       // среднее количество последовательных убыточных сделок
  };

Можете видеть, что форвард там отсутствует.

 
fxsaber:

Все данные прохода в кеше.

Можете видеть, что форвард там отсутствует.

форвард присутствует.
fxsaber:

Все данные прохода в кеше.

Можете видеть, что форвард там отсутствует.

форвард присутствует
struct TestCacheHeader
{
  UINT              version;                // версия кеша
  //   wchar_t           copyright[64];          // копирайт
  STRING64           copyright;             // копирайт
  UINT              header_size;            // размер заголовка
  UINT              record_size;            // размер кешируемой записи (TestCacheRecord с буфером параметров)
  //---
  //   wchar_t           expert_name[64];        // имя эксперта
  STRING64           expert_name;           // имя эксперта
  //   wchar_t           expert_path[128];       // имя эксперта с путём от MQL5
  STRING128           expert_path;           // имя эксперта с путём от MQL5
  //   wchar_t           server[64];             // источник истории (торговый сервер)
  STRING64           server;                // источник истории (торговый сервер)
  //   wchar_t           symbol[32];             // символ тестирования
  STRING32           symbol;                // символ тестирования
  UINT16            period;                 // период чарта
  INT64             date_from;              // дата начала данных в настройках тестирования
  INT64             date_to;                // конечная дата в настройках тестирования
  INT64             date_forward;           // конечная дата соответствующего форварда
  int               opt_mode;               // режим оптимизации (0-полная оптимизация, 1-генетика, 2 или 3-форвард)
  int               ticks_mode;             // режим генерации тиков
  int               last_criterion;         // критерий оптимизации при последнем сеансе
  DWORD             msc_min;                // минимальное время выполнения в миллисекундах
  DWORD             msc_max;                // максимальное время выполнения в миллисекундах
  DWORD             msc_avg;                // среднее время выполнения в миллисекундах
  int               common_reserve[16];
  //---
  //   wchar_t           group[80];              // имя группы + hedging/netting
  STRING80           group;                 // имя группы + hedging/netting
  //   wchar_t           trade_currency[32];     // валюта депозита
  STRING32           trade_currency;        // валюта депозита
  int               trade_deposit;          // начальный депозит
  int               trade_condition;        // режим работы торговли (0-без задержек, -1-произвольная задержка, nnn-количество миллисекунд)
  int               trade_leverage;         // плечо
  int               trade_hedging;          // 1 - netting, 2 - hedging
  int               trade_currency_digits;
  int               trade_reserve[6];
  //---
  char              hash_ex5[16];           // контрольная сумма скомпилированного эксперта
  UINT              parameters_size;        // размер буфера параметров эксперта
  UINT              parameters_total;       // количество параметров
  UINT              opt_params_size;        // размер буфера оптимизируемых параметров эксперта
  UINT              opt_params_total;       // количество оптимизируемых параметров
  UINT              dwords_cnt;             // размер номера прохода большой генетики
  UINT              snapshot_size;          // размер снапшота для тотальной оптимизации и для форварда после тотальной оптимизации
  UINT              passes_total;           // общее количество проходов оптимизации (для генетической оптимизации 0)
  UINT              passes_passed;          // количество пройденных проходов
  // далее следуют выставленные параметры эксперта (в т.ч. строковые) в структуре TestCacheInput
  //--- конец заголовка. далее следуют записи о каждом проходе

Я неверно спросил. Эта библиотека впринципе для постоптимизационной работы. Я хотел спросить: Может есть тут метод чтобы перехватить результат форварда наподобие TesterStatistics. OnTester() в форварде не вызывается.

 
Good Beer:

Я хотел спросить: Может есть тут метод чтобы перехватить результат форварда наподобие TesterStatistics. OnTester() в форварде не вызывается.

Никогда не пользовался форвардом, поэтому не могу ответить. Если GUI-кеша показывает нужные данные, то библиотека их тоже увидит.

 
Good Beer:

Я неверно спросил. Эта библиотека впринципе для постоптимизационной работы. Я хотел спросить: Может есть тут метод чтобы перехватить результат форварда наподобие TesterStatistics. OnTester() в форварде не вызывается.

Форвард - обычный прогон, поэтому TesterStatistics можно вызвать из OnDeinit (раз уж вопрос был повернут в сторону OnTester; к читалке кеша это, конечно, не относится).

 
Stanislav Korotky:

Форвард - обычный прогон, поэтому TesterStatistics можно вызвать из OnDeinit (раз уж вопрос был повернут в сторону OnTester; к читалке кеша это, конечно, не относится).

Форвард - не обычный прогон. Он работает в каждом агенте тестирования отдельно и слить результат можно только в файловую папку агента. Получаем число файлов по числу агентов, скопировать которые в общий файл тоже нельзя. Но тестер это как-то делает при записи общего лога и кэша. Вот бы перехватить эту запись!
 
Good Beer:
Форвард - не обычный прогон. Он работает в каждом агенте тестирования отдельно и слить результат можно только в файловую папку агента. Получаем число файлов по числу агентов, скопировать которые в общий файл тоже нельзя. Но тестер это как-то делает при записи общего лога и кэша. Вот бы перехватить эту запись!

Не понял мысль. Каждый прогон (и обычный, и форвард) - работает в агенте тестирования отдельно. Результаты с агентов на терминал нужно передавать через фреймы.

 
Stanislav Korotky:

Не понял мысль. Каждый прогон (и обычный, и форвард) - работает в агенте тестирования отдельно. Результаты с агентов на терминал нужно передавать через фреймы.

Нет в форварде никаких фреймов. Они не создаются ни в одной функции. Только в OnInit есть признак форварда, но фрейм всё равно не записать.
 
Good Beer:
Нет в форварде никаких фреймов. Они не создаются ни в одной функции. Только в OnInit есть признак форварда, но фрейм всё равно не записать.

У меня фреймы есть везде. Прекрасно создаются в OnTester, который вызывается и в оптимизации, и в форварде. Прекрасно получаются в OnTesterPass.

 
Stanislav Korotky:

У меня фреймы есть везде. Прекрасно создаются в OnTester, который вызывается и в оптимизации, и в форварде. Прекрасно получаются в OnTesterPass.

Написал отдельный советник и прогнал на разных компах, с разной виндой. Результат тот-же: форвард не работает. С выкл. форвардом файл пишеться. Посмотрите пожалуйста этот код. Что у меня не так?
 
Good Beer:
Написал отдельный советник и прогнал на разных компах, с разной виндой. Результат тот-же: форвард не работает. С выкл. форвардом файл пишеться. Посмотрите пожалуйста этот код. Что у меня не так?

Я принимал фреймы в OnTesterPass. Прилагаю минимальный работающий тест (без файлов).

Файлы:
fwdfrm.mq5  2 kb