Да еще и каждый отчет весит метр семьдесят. Судя по содержимому пользуют какой-то микрософтовский компонент, который как всегда отличается тем, что генерит кучу никому не нужного мусора. А сколько их будет в режиме оптимизации?!!
Вопрос в том, что всего один. По окончании работы оптимизатора. А нужно столько, столько
тестов прошло в нём. Если 500 тестов, то 500 отчётов. Каждому прогону теста должен соответствовать файл, тест же был, где его результат?
Прошу разработчиков MetaQuotes подключиться к ответу. Думаю, расчёт
просадки из кода интересен не только мне одному. Многие оценивают
работу экспертов по множеству показателей, просадка и прибыль
- основные из них.
Уважаемый Рашид, снова возвращаюсь к этой теме после тестов.
По результатам темы был собран файл SummaryReport.mq4 из кода первоначального
SummaryReport.mq4 С. Старикова и кода темы Скрипт для расчета MAE и MFE.
Тесты показали, что чаще всего новый скрипт считает просадку
чуть жёстче, чем показатели терминала в закладке Отчёт (что
подходит). Однако не всегда, были тесты эксперта на M5 GBPJPY, на которых терминал
показал раза в два большую просадку, чем выдал скрипт.
komposter, автопилота включил? Неужели необходимо все разжевывать? :) Уже упоминалось, что указанный срикпт SummaryReport.mq4 не считает просадку по эквити, и кроме того, не делает сортировку по времени закрытия. Я показал вариант, как это обойти своим скриптом - скрипт для расчета MAE и MFE - на который уже давал два раза ссылку в этой ветке. Скрещиваешь все необходимые алгоритмы в одну функцию, делаешь в ней вывод значений в файл, и вставляешь ее в deinit().
Рашид, скажите, пожалуйста, верно ли я использую Ваш скрипт MAE_MFE_DrawDowns.mq4?
1. Все декларации и функции из него я добавил в SummaryReport.mq4. 2. Взамен функции void CalculateSummary(double initial_deposit) из старого SummaryReport.mq4 тот код, которы был в start() из MAE_MFE_DrawDowns.mq4, добавил и сохранил в новую функцию в новый единый SummaryReport.mq4:
// start: added by CHV, 25.12.2007voidCalculateSummary2(){intClosedOrders, CancelledOrders; // количество открытых и отмененных ордеровintClosedTickets[],CancelledTickets[]; // масивы, содержащие тикеты закрытых и отмененных ордеровintAllOpenedOrdersTickets[]; // массив заркытых ордеров из истории + текущие незакрытые ордераstringSymbols[]; // массив, в котором хранятся имена символов, по которым были сделкиdoubleSwaps[]; // собственно, свопыdoubleProfits[],NormalizedProfits[]; // массивы, хранящие изначальные профиты и нормализованные к 0.1 лотуdoubleMFE[]; // массив, содержащий данные о максимальной потенциальной прибыли для каждого ордераdoubleMAE[]; // массив, содержащий данные о максимальной просадке для каждого ордераdoubleAccountDetails[][9];
doubleMinimalEquity; // минимальное историческое значение ЭквитиdoubleMoneyDrawDown; // максимальная денежная просадкаdoubleMoneyDrawDownInPercent; // процентное выражение для максимальной денежной просадкиdoubleRelativeDrawDown; // максимальная процентная просадкаdoubleRelativeDrawDownInMoney; // денежное выражение максимальной процентной просадки//----if(!GetNumberOfOrders(ClosedOrders, CancelledOrders,Symbols)){Print("Ордера в истории не найдены, обработка прекращена");
}ArrayResize(ClosedTickets,ClosedOrders);
ArrayResize(CancelledTickets,CancelledOrders);
ArrayResize(AccountDetails,ClosedOrders);
ArrayResize(Swaps ,ClosedOrders);
LoadSortedTickets(ClosedTickets);
FillOrderProfits(Profits,NormalizedProfits,Swaps,ClosedTickets);
if(CheckHistoryOnClosedOrders(ClosedTickets,Symbols))// проверим на наличие дыр в истории{SetMAEAndMFE(MFE,MAE,ClosedTickets); // и если дыр нет - заполним MAE и MFE//WriteMAE_MFE(MFE,MAE,ClosedTickets,"MAE_MFE_reports\\"+AccountNumber()+"_MAE_MFE.csv");}elsereturn;
// CalculateDD(ClosedTickets,Symbols,MinimalEquity,MoneyDrawDown,MoneyDrawDownInPercent,RelativeDrawDown,RelativeDrawDownInMoney);CalculateDD(ClosedTickets,Symbols,MinimalEquity
,/*MoneyDrawDown*/MaxDrawdown
,/*MoneyDrawDownInPercent*/MaxDrawdownPercent
,/*RelativeDrawDown*/RelDrawdownPercent
,/*RelativeDrawDownInMoney*/RelDrawdown);
Print("AbsDD=",10000-MinimalEquity," MoneyDrawDown=",MoneyDrawDown," MoneyDrawDownInPercent=",MoneyDrawDownInPercent,
" RelativeDrawDown=",RelativeDrawDown," RelativeDrawDownInMoney=",RelativeDrawDownInMoney);
//----//return(0);}// end: added by CHV, 25.12.2007
Декларации переменных остались из старого SummaryReport.mq4, в них и помещены результаты, вместо заремленных локальных переменных (MoneyDrawDown, MoneyDrawDownInPercent и т.д.)
добавил CalculateSummary2() в новый SummaryReport.mq4. И в эксперте-клиенте вызов в deinit() сделал вызов:
//CalculateSummary(ExtInitialDeposit);CalculateSummary2(); // try new code
Затем сделал вызов эксперта в тестере. Результаты были сохранены в XML файл и сравнены с показателями эксперта.
Видно, что показания по просадке не сходятся, и в терминале максимальная просадка выше, чем в расчётном XML.
Если же я в эксперте в deinit() возвращаю вызов старой CalculateSummary():
CalculateSummary(ExtInitialDeposit); // call old code//CalculateSummary2(); // try new code
То показатели получаются более правдоподобными, но всё же отличными от терминала, и зачастую сильно разнятся с ним, в этом и вопрос.
Может быть, именно я в сугубо извращённой форме использую Ваш код скрипта MAE_MFE_DrawDowns.mq4 совместно с SummaryReport.mq4 по расчёту просадки и других показателей? Честно, не догоняю, как его эксплуатировать совместно с кодом эксперта. Помогите, пожалуйста, примером.
Не могу сказать. Я превратил тот скрипт в простой инклюдник простым
переименованием функции start() в startCalculate():
//+------------------------------------------------------------------+//| script program start function |//+------------------------------------------------------------------+intstartCalculate(){intClosedOrders, CancelledOrders; // количество открытых и отмененных ордеровintClosedTickets[],CancelledTickets[]; // масивы, содержащие тикеты закрытых и отмененных ордеровintAllOpenedOrdersTickets[]; // массив заркытых ордеров из истории + текущие незакрытые ордераstringSymbols[]; // массив, в котором хранятся имена символов, по которым были сделкиdoubleSwaps[]; // собственно, свопыdoubleProfits[],NormalizedProfits[]; // массивы, хранящие изначальные профиты и нормализованные к 0.1 лотуdoubleMFE[]; // массив, содержащий данные о максимальной потенциальной прибыли для каждого ордераdoubleMAE[]; // массив, содержащий данные о максимальной просадке для каждого ордераdoubleAccountDetails[][9];
doubleMinimalEquity; // минимальное историческое значение ЭквитиdoubleMoneyDrawDown; // максимальная денежная просадкаdoubleMoneyDrawDownInPercent; // процентное выражение для максимальной денежной просадкиdoubleRelativeDrawDown; // максимальная процентная просадкаdoubleRelativeDrawDownInMoney; // денежное выражение максимальной процентной просадки//----if(!GetNumberOfOrders(ClosedOrders, CancelledOrders,Symbols)){Print("Ордера в истории не найдены, обработка прекращена");
}ArrayResize(ClosedTickets,ClosedOrders);
ArrayResize(CancelledTickets,CancelledOrders);
ArrayResize(AccountDetails,ClosedOrders);
ArrayResize(Swaps ,ClosedOrders);
LoadSortedTickets(ClosedTickets);
FillOrderProfits(Profits,NormalizedProfits,Swaps,ClosedTickets);
if(CheckHistoryOnClosedOrders(ClosedTickets,Symbols))// проверим на наличие дыр в истории{SetMAEAndMFE(MFE,MAE,ClosedTickets); // и если дыр нет - заполним MAE и MFEWriteMAE_MFE(MFE,MAE,ClosedTickets,"MAE_MFE_reports\\"+AccountNumber()+"_MAE_MFE.csv");
}elsereturn;
CalculateDD(ClosedTickets,Symbols,MinimalEquity,MoneyDrawDown,MoneyDrawDownInPercent,RelativeDrawDown,RelativeDrawDownInMoney);
Print("AbsDD=",10000-MinimalEquity," MoneyDrawDown=",MoneyDrawDown," MoneyDrawDownInPercent=",MoneyDrawDownInPercent,
" RelativeDrawDown=",RelativeDrawDown," RelativeDrawDownInMoney=",RelativeDrawDownInMoney);
//----return(0);
}//+------------------------------------------------------------------+
положил инклюдник в нужную директорию, а в deinit() просто добавил
вызов этой функции в deinit()
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+intdeinit(){if(IsTesting()&&!IsOptimization()){startCalculate(); // вывод результатов бектеста}return(0);
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Да еще и каждый отчет весит метр семьдесят. Судя по содержимому пользуют какой-то микрософтовский компонент, который как всегда отличается тем, что генерит кучу никому не нужного мусора. А сколько их будет в режиме оптимизации?!!
А сколько их будет в режиме оптимизации?!!
Вопрос в том, что всего один. По окончании работы оптимизатора. А нужно столько, столько тестов прошло в нём. Если 500 тестов, то 500 отчётов. Каждому прогону теста должен соответствовать файл, тест же был, где его результат?
Прошу разработчиков MetaQuotes подключиться к ответу. Думаю, расчёт просадки из кода интересен не только мне одному. Многие оценивают работу экспертов по множеству показателей, просадка и прибыль - основные из них.
А если просто прицепить в deinit() функцию расчета и вывода в файл из скрипта в статье Самостоятельная оценка результатов тестирования эксперта ?
ВнимательнЕе надо ;)
А если еще внимательнее читать, то я давал уже скрипт для расчета просадки по эквити. Тщительнее надо, не по диагонали.
Уважаемый Рашид, снова возвращаюсь к этой теме после тестов.
По результатам темы был собран файл SummaryReport.mq4 из кода первоначального SummaryReport.mq4 С. Старикова и кода темы Скрипт для расчета MAE и MFE.Тесты показали, что чаще всего новый скрипт считает просадку чуть жёстче, чем показатели терминала в закладке Отчёт (что подходит). Однако не всегда, были тесты эксперта на M5 GBPJPY, на которых терминал показал раза в два большую просадку, чем выдал скрипт.
Уже упоминалось, что указанный срикпт SummaryReport.mq4 не считает просадку по эквити, и кроме того, не делает сортировку по времени закрытия. Я показал вариант, как это обойти своим скриптом - скрипт для расчета MAE и MFE - на который уже давал два раза ссылку в этой ветке. Скрещиваешь все необходимые алгоритмы в одну функцию, делаешь в ней вывод значений в файл, и вставляешь ее в deinit().
Не в тему влез, каюсь ;)
Рашид, скажите, пожалуйста, верно ли я использую Ваш скрипт MAE_MFE_DrawDowns.mq4?
1. Все декларации и функции из него я добавил в SummaryReport.mq4.
2. Взамен функции void CalculateSummary(double initial_deposit) из старого SummaryReport.mq4 тот код, которы был в start() из MAE_MFE_DrawDowns.mq4, добавил и сохранил в новую функцию в новый единый SummaryReport.mq4:
Декларации переменных остались из старого SummaryReport.mq4, в них и помещены результаты, вместо заремленных локальных переменных (MoneyDrawDown, MoneyDrawDownInPercent и т.д.)
добавил CalculateSummary2() в новый SummaryReport.mq4. И в эксперте-клиенте вызов в deinit() сделал вызов:
Затем сделал вызов эксперта в тестере. Результаты были сохранены в XML файл и сравнены с показателями эксперта.
Видно, что показания по просадке не сходятся, и в терминале максимальная просадка выше, чем в расчётном XML.
Если же я в эксперте в deinit() возвращаю вызов старой CalculateSummary():
То показатели получаются более правдоподобными, но всё же отличными от терминала, и зачастую сильно разнятся с ним, в этом и вопрос.
Может быть, именно я в сугубо извращённой форме использую Ваш код скрипта MAE_MFE_DrawDowns.mq4 совместно с SummaryReport.mq4 по расчёту просадки и других показателей? Честно, не догоняю, как его эксплуатировать совместно с кодом эксперта.
Помогите, пожалуйста, примером.
положил инклюдник в нужную директорию, а в deinit() просто добавил вызов этой функции в deinit()