Алгоритм расчёта просадки, или Самостоятельная оценка результатов тестирования эксперта

 

Вопрос уважаемым разработчикам MT4 терминала.

В своё время была опубликована статья Самостоятельная оценка результатов тестирования эксперта Станислава Старикова (stringo), которая дала отличный инстумент по количественной оценке работы эксперта, его показателей. Приложенный в статье файл SummaryReport.mq4 был мной в соответствии с рекомендациями подключен и использован в эксперте для оценки его запусков.

После выхода, кажется, 211-го билда при сравнении показателей, выдаваемых данным кодом SummaryReport.mq4 из эксперта и тем, что показывает сам терминал на закладке Отчёт после прогона теста, видна сильная разница именно по показателям, связанным с просадкой (максимальная просадка, абсолютная просадка, относительная просадка). Сейчас эти показатели дают разницу зачастую в разы от показателей терминала. Рисунок поясняет разницу в показателях.

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

Как предложение - поскольку эти показатели выдаются терминалом в виде отчёта, но в неудобном для автоматического анализа HTML виде (теги могут меняться без предупреждения в версиях терминала), сделать возможность с параметром командной строки терминала (вместе с TestReport, TestReplaceReport конфигураци при старте) выдавать отчёт в XML формате, это снимет все вопросы с получением подобных результатов. Однако у этого механизма сейчас есть недостаток - отчёт один на запуск терминала, а не на число тестов. Т.е. запуск в режиме тестера даст отношение "Один тест - один отчёт", а вот запуск оптимизатора на все тесты выдаст всего один отчёт, вероятно последний. Остальные прогоны останутся без отчёта и показателей.

 
Терминал при расчете данных отчета сортирует ордера по времени закрытия. А в скрипте этого нет. Пример сортировки ордеров по CloseTime я приводил - Сортировка ордеров
 
Rosh:
Терминал при расчете данных отчета сортирует ордера по времени закрытия. А в скрипте этого нет. Пример сортировки ордеров по CloseTime я приводил - Сортировка ордеров


Рашид, спасибо Вам за информацию, обязательно сравню после изменения скрипта результаты, напишу об этом.

 

Вы знаете, я поменял код SummaryReport.mq4, добавив в него Вашу функцию int LoadSortedTickets(int & Tickets[]) с http://simple-testing.blogspot.com/2007/07/blog-post_3924.html и использовав её:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateSummary(double initial_deposit)
  {
   int    sequence=0, profitseqs=0, lossseqs=0;
   double sequential=0.0, prevprofit=EMPTY_VALUE, drawdownpercent, drawdown;
   double maxpeak=initial_deposit, minpeak=initial_deposit, balance=initial_deposit;
   int    trades_total=HistoryTotal();
//---- initialize summaries
   InitializeSummaries(initial_deposit);
 
   // begin: chv added, 09.12.2007   
   int ordersIdList[];
   ArrayResize(ordersIdList, trades_total);
   LoadSortedTickets(ordersIdList);
   int iSelectedIndex;
   // end: chv added, 09.12.2007   
 
//----
   for(int i=0; i<trades_total; i++)
     {
      // begin: chv added, 09.12.2007   
      iSelectedIndex = ordersIdList[i]; // 
      //if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if(!OrderSelect(iSelectedIndex, SELECT_BY_POS, MODE_HISTORY)) 
         continue;
      // end: chv added, 09.12.2007   
 
      int type = OrderType();
      //---- initial balance not considered

Полный код прикреплен с топику.

В итоге расчёты изменились, но не в лучшую сторону. Чистая прибыль, которая была согласована между скриптом и терминалом, разошлась. И просадки тоже не пришли в норму. Я неверно понял суть того, что нужно изменить?

Файлы:
 
О, заметил по разнице в "Общий убыток" и числу ордеров на единицу то, что после сортировки в скрипте теряется первый ордер (разница равна его профиту/убытку). Завтра постараюсь исправить это, но такое ощущение, что на расчёт просадки это не повлияет. Просадка ведь ранее считалась по балансу, а сейчас по эквити, чем в этом поможет сортировка ордеров?
 

Алгоритм подсчёта я подправил, конечно же, после функции LoadSortedTickets, возвращающей массив тикетов, выбор ордеров должен идти по номеру тикета, т.е. SELECT_BY_TICKET:

   //for(int i=0; i<trades_total; i++)
   for(int i=0; i<counter; i++)
     {
      // begin: chv added, 09.12.2007   
      iSelectedIndex = ordersIdList[i]; // 
      //if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if(!OrderSelect(iSelectedIndex, SELECT_BY_TICKET)) 
         continue;
      // end: chv added, 09.12.2007   
 
      int type = OrderType();
      //---- initial balance not considered

Данные по числу ордеров, чистой прибыли и общей прибыли/убытку сошлись между тем, что показывает терминал в закладке Отчёт, и тем, что выдаёт исправленный алгоритм из функции CalculateSummary() SummaryReport.mq4.
Однако параметры просадки по-прежнему расходятся. Терминал стал считать её по эквити, т.е. правильно, и сортировка ордеров, к сожалению, ничего не меняет.

 

Небольшая преамбула.
Хочу обратить внимание разработчиков на то, что MetaTrader является де-факто лучшей платформой по автоматизированному трейдингу и автоматизированной обработке торговых данных. Я был на курсах Финама, то, что нужно выделывать с другими терминалами, выгружая для анализа данные в другие программы, никуда не идёт в сравнение, да простят меня их разработчики. Однако в современном мире, имеющем курс на интеграцию и объединение, важным является не только собственный функционал системы, сколько её возможность участвовать в составных системах различных производителей софта, интегрируясь как часть более сложных систем. Терминал имеет почти все нужные параметры для управления им из командной строки из других систем (ps.: кроме флажка Визуализация ;)), однако отсутствие встроенной возможности получения достоверных данных о результатах тестирования и оптимизации снижает возможность применения платформы MetaTrader в качестве составного звена в создаваемых комплексах. Запуски прогнали, а дальше-то что, где их достоверные результаты?
В своё время в споре Windows и OS/2 победила первая (хотя OS/2 была надёжнее и требовала меньше ресурсов), потому что под Windows писали больше софта, и она стала повсеместной платформой.

В связи с этим убедительно прошу разработчиков обратить внимание на данную задачу, и изыскать ресурсы (понимаю, все ушли на фронт MQL5) на её решение, каким-либо образом выдав ключевые параметры (их меньше десятка) прогона терминала с закладки Отчёт в виде, пригодном для автоматизированной обработки, либо описать понятный путь, как их возможно получить средствами MQL/WinAPI.
Заранее спасибо.

 
Рассчитать все просадки можно и по эквити, пример показан в скрипте Скрипт для расчета MAE и MFE
 
Rosh:
Рассчитать все просадки можно и по эквити, пример показан в скрипте Скрипт для расчета MAE и MFE
Так бы сразу и сказали. Спасибо за вторую подсказку ;) попробую.
 

Уважаемый Рашид, снова возвращаюсь к этой теме после тестов.

По результатам темы был собран файл SummaryReport.mq4 из кода первоначального SummaryReport.mq4 С. Старикова и кода темы Скрипт для расчета MAE и MFE.
Тесты показали, что чаще всего новый скрипт считает просадку чуть жёстче, чем показатели терминала в закладке Отчёт (что подходит). Однако не всегда, были тесты эксперта на M5 GBPJPY, на которых терминал показал раза в два большую просадку, чем выдал скрипт. Эксперта, к сожалению, публиковать не могу, это заказная разработка и поэтому не моя собственность.

Код нового SummaryReport.mq4 прилагается. Используется он в эксперте так:

Блок деклараций переменных:

// SummaryReport:begin ---
#include <SummaryReport.mq4>
 
double ExtInitialDeposit;
#define OP_BALANCE 6
#define OP_CREDIT  7
// SummaryReport:end ---

Блок в deinit():

      if(!IsTesting())
         ExtInitialDeposit = CalculateInitialDeposit();
 
      CalculateSummary(ExtInitialDeposit);

и далее запись показателей теста в xml файл.

Однако это не всё. Запуски эксперта показали в некоторых случаях очень долгое время его выполнения. Т.е. на 4-хядерной машине Intel QX6850-1333 Ghz/ HDD speed 10000/ RAM 4 Gb DDR3 за ночь отрабатывало 2-6 тестов в режиме оптимизатора. Если же вернуть эксперту исходный файл SummaryReport. mq4 от Станислава Старикова (прошлый расчёт просадки), то число тестов приходило в норму, несколько сотен за ночь на каждый терминал.

Прошу Вас, если есть возможность, прокоментировать новый код SummaryReport.mq4 на корректность. Или же вопрос, если показатели терминала в закладке Отчёт генерируются MQL кодом (не C++ кодом терминала), возможна ли его открытая публикация от MetaQuotes? Ведь параметры-то тестов, и просадка в том числе, важные и открыто обсуждаемые для экспертов на форуме, чемпионате и т.д.

Файлы:
 
А я не понял в чем проблема преобразовать html файл генерируемого отчета в xml или csv при помощи какого-нибудь текстового процессора типа awk?
 
TedBeer:
А я не понял в чем проблема преобразовать html файл генерируемого отчета в xml или csv при помощи какого-нибудь текстового процессора типа awk?

Разобрать можно на чём угодно, но формат HTML отчёта нигде не утверждён и может меняться от версии терминала. Для автообработки более подходит xml с опубликованной схемой. Но это полбеды.
Главное - терминал в режиме оптимизатора не выдаёт столько отчётов, сколько прошло тестов. Отчёт будет только один в конце, а прогонов эксперта - много. Тут косяк - нет такой возможности на все тесты.