fxsaber #: Копирование строки выделенного прохода в буфер. Аналог этого.
Есть в планах.
fxsaber #: mqd-формат читать можно, если фреймами будет передача.
А если там свои данные эксперт передавал. Опишу необходимость добавления графиков и напрмиер дописывать в конец буфера графики и потоми только их сохранять в файл с именем .opt файла, но своим расширением.
Opt файл наверное просто самый новый брать. Думаю будет надежно.
//+------------------------------------------------------------------+//| заголовок кеша |//+------------------------------------------------------------------+struct TestCacheHeader
{
UINT version; // версия кеша
wchar_t copyright[64]; // копирайт
UINT header_size; // размер заголовка
UINT record_size; // размер кешируемой записи (TestCacheRecord с буфером параметров)//---
wchar_t expert_name[64]; // имя эксперта
wchar_t expert_path[128]; // имя эксперта с путём от MQL5
wchar_t server[64]; // источник истории (торговый сервер)
wchar_t symbol[32]; // символ тестирования
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
wchar_t trade_currency[32]; // валюта депозитаint trade_deposit; // начальный депозитint trade_condition; // режим работы торговли (0-без задержек, -1-произвольная задержка, nnn-количество миллисекунд)int trade_leverage; // плечоint trade_hedging; // 1 - netting, 2 - hedgingint 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//--- конец заголовка. далее следуют записи о каждом проходе
};
//+------------------------------------------------------------------+//| входные параметры тестирования |//+------------------------------------------------------------------+struct TestCacheInput
{
wchar_t name[64];
int flag; // оптимизируемый параметрint type; // тип TYPE_XXXint digits; // количество знаков после запятойint offset; // смещение в буфере параметровint size; // размер значения параметра в буфере//--- 0-start,1-step,2-stopunion { INT64 integers[3]; double numbers[3]; };
};
//--- кешируемая запись содержит номер прохода (при генетике - номер по порядку), структуру результатов тестирования (если математика, то 1 double), буфер оптимизируемых параметров и генетический проход
m_header.record_size=sizeof(INT64)+m_header.opt_params_size;
if(m_mathematics)
m_header.record_size+=sizeof(double);
else
m_header.record_size+=sizeof(ExpTradeSummary);
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);
}
//+------------------------------------------------------------------+//| Структура для статистики торговли |//+------------------------------------------------------------------+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; // максимальная просадка по equitydouble 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/inoutint 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; // среднее количество последовательных убыточных сделок
};
PS. Формат может поменяться. Данный формат соответствует версии 514
Предложение по улучшению
В структуре для каждого прохода ExpTradeSummary есть поле Initial deposit, которое для всех имеет одинаковые значения, оно же есть в заголовке TestCacheHeader как int trade_deposit; Т.е. оно излишне.
Вместо него можно сохранять комплексный критерий, который сейчас не сохраняется. Видимо он рассчитывается из того, что есть в .opt файле. Хорошо бы его вместо начального депозита подставить. Размер структуры не поменяется. Т.е. модификация минимальна.
А если вместо double использовать 2 float элемента, то и мат. ожидание в пунктах можно сохранять, при том же размере структуры. Или просто отдельными double добавить их, и нач. депозит тоже оставить.
Считаю его так:
HistoryDeals=OrdersHistoryTotal();
for (int i = 0; i < HistoryDeals; i++){
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) ){
if(OrderType()==OP_BUY || OrderType()==OP_SELL ){
profit=OrderProfit() + OrderCommission() + OrderSwap();// может еще сборы какое то есть... нужно учесть все расходы
AvgPips += (OrderLots()>0 ? profit / OrderLots() : 0); // заработанных пипсов с учетом расходов
}}}
if(HistoryDeals>0){AvgPips /= HistoryDeals;}// среднее заработанных пипсов с учетом комиссий и свопов
Думаю это больше скажет о стратегии, чем мат. ожидание в деньгах. Выводить в отчете можно оба.
В структуре для каждого прохода ExpTradeSummary есть поле Initial deposit, которое для всех имеет одинаковые значения, оно же есть в заголовке TestCacheHeader как int trade_deposit; Т.е. оно излишне.
Архитектурно эти "лишние "восемь байтов для каждого прохода все же правильно хранить, как есть сейчас. Я бы предложил дополнить данную структуру резервными полями байтов на 40. И вот туда что-нибудь скидывать. Например, множество OnTesterX.
ЗЫ В данной структуре много ненужных показателей, на которые уходит большое количество вычислительных ресурсов. Особенно, когда много сделок в каждом оптимизационном проходе. И если в мат. режиме можно самому выбирать, что из этих показателей вычислять, то в обычном - нет. Когда-то для ускорения был введен режим по пипсам. Возможно, имеет смысл ввести режим выбора, какие показатели вычислять или нет.
Обновлено графическое ядро для отрисовки графиков. Теперь вместо устаревшего GDI используется современный движок Blend2D. Более высокая производительность Blend2D использует современную архитектуру рендеринга и эффективно задействует многоядерные процессоры, что обеспечивает плавную отрисовку графиков и индикаторов даже при большом количестве...
fxsaber #:... В данной структуре много ненужных показателей, на которые уходит большое количество вычислительных ресурсов. Особенно, когда много сделок в каждом оптимизационном проходе.
Пока получается вот так:
Все 43 критерия оценки можно отсортировать (столбец выделяется зеленым фоном) и каждому можно задать фильтры: от, до или от и до. Фильтры разных столбцов объединяются через И. Значения порогов - любые, а не фиксированные 0, 0.5, 50%, -1 как у МТ5.
Графики перерисовываю по столбцу который отсортирован. Покликал по разным - действительно самые интересные это те 8, что есть в MT5. Ну если уж сделал - пусть будут. Может кому захочется посмотреть по числу ошибок подряд или еще что...
Графики вместо таких
и
Сделал совмещенные
Сразу видно, что из Trall можно выбрать вариант получше, а от TP совсем нет пользы. т.к. графики слились в 1 линию.
Думаю так удобнее. Еще сделал по клику открытие Гугл чарта - в нем зум и он показывает точные значения.
Сейчас про 2D думаю как сделать... наверное так же линиями. Цветная мозаика трудна к восприятию.
Все 43 критерия оценки можно отсортировать (столбец выделяется зеленым фоном) и каждому можно задать фильтры: от, до или от и до. Фильтры разных столбцов объединяются через И. Значения порогов - любые, а не фиксированные 0, 0.5, 50%, -1 как у МТ5.
Не хватает столбца с номером строки. Но, наконец, без мусора!
Актуально, не смотря на отличные кеши. Просьба открыть формат opt-файлов.
Как пример, зачем это нужно. Вот отсортировал результаты Оптимизации по прибыльности (PF)
Посмотрите на количество трейдов - они статистически ничего не значат: меньше 30. Но у них PF зашкаливает и таких результатов сотни/тысячи. Ну зачем этот мусор в таблице?
Если бы был открыть opt-формат, то можно было бы этот мусор автоматом убивать, оставляя только интересные более-менее стат. значимые результаты.
Что уж говорить о кастомных сортировках по нескольким критериям одновременно и т.д.
По сортировке проще объяснить на примере с этой страницы.
Здесь компрессоры отсортированы по степени сжатия - красный. Мне нужно было найти золотую середину между степенью сжатия и производительностью.
Зеленый - улучшение показателя скорости сжатия. Синий - разжатия.
Вы можете видеть, что каждое улучшение показателя сопровождается его подчеркиванием. Например, если показатель не подчеркнут, то эту строку не имеет смысл рассматривать, т.к. она уступает какой-то предыдущей строке. Таким образом по этой таблице почти сразу был найден великолепный компрессор - нижние зеленый/синий.
Если для проходов такое же реализовывается, то очень легко видеть интересные проходы. Мне это видится так, что для каждого столбца можно задать условие подчеркивания: значение больше, чем все предыдущие. Или меньше.
Копирование строки выделенного прохода в буфер. Аналог этого.
mqd-формат читать можно, если фреймами будет передача.
А если там свои данные эксперт передавал. Опишу необходимость добавления графиков и напрмиер дописывать в конец буфера графики и потоми только их сохранять в файл с именем .opt файла, но своим расширением.
Opt файл наверное просто самый новый брать. Думаю будет надежно.
А если там свои данные эксперт передавал.
@Slava#:
PS. Формат может поменяться. Данный формат соответствует версии 514
Предложение по улучшению
В структуре для каждого прохода ExpTradeSummary есть поле Initial deposit, которое для всех имеет одинаковые значения, оно же есть в заголовке TestCacheHeader как int trade_deposit; Т.е. оно излишне.
Вместо него можно сохранять комплексный критерий, который сейчас не сохраняется. Видимо он рассчитывается из того, что есть в .opt файле.
Хорошо бы его вместо начального депозита подставить. Размер структуры не поменяется. Т.е. модификация минимальна.
А если вместо double использовать 2 float элемента, то и мат. ожидание в пунктах можно сохранять, при том же размере структуры. Или просто отдельными double добавить их, и нач. депозит тоже оставить.
Считаю его так:
Думаю это больше скажет о стратегии, чем мат. ожидание в деньгах. Выводить в отчете можно оба.Предложение по улучшению
В структуре для каждого прохода ExpTradeSummary есть поле Initial deposit, которое для всех имеет одинаковые значения, оно же есть в заголовке TestCacheHeader как int trade_deposit; Т.е. оно излишне.
Архитектурно эти "лишние "восемь байтов для каждого прохода все же правильно хранить, как есть сейчас. Я бы предложил дополнить данную структуру резервными полями байтов на 40. И вот туда что-нибудь скидывать. Например, множество OnTesterX.
ЗЫ В данной структуре много ненужных показателей, на которые уходит большое количество вычислительных ресурсов. Особенно, когда много сделок в каждом оптимизационном проходе. И если в мат. режиме можно самому выбирать, что из этих показателей вычислять, то в обычном - нет. Когда-то для ускорения был введен режим по пипсам. Возможно, имеет смысл ввести режим выбора, какие показатели вычислять или нет.
Здравствуйте.
У меня у одного в этой версии Git перестал работать?
2025.10.24 10:06:27.684 Git MQL5: push failed with -1 error, generic error
Со 2-го декабря опять перестал Git работать. То ли Commit не отправляет, то ли Pull не получает.
Вчера дома вечером после изменений отправил все c помощью Git Commit, сегодня пришел с утра на работу Git Pull - already up-to-date.
Господа разработчики, верните пожалуйста возможность работать в старом хранилище, оно понадежнее было...
Со 2-го декабря опять перестал Git работать. То ли Commit не отправляет, то ли Pull не получает.
Вчера дома вечером после изменений отправил все c помощью Git Commit, сегодня пришел с утра на работу Git Pull - already up-to-date.
Господа разработчики, верните пожалуйста возможность работать в старом хранилище, оно понадежнее было...
Не отображается bmp картинки! ранее в других билдах они отображались, но с обновлением пропали в советнике
Пока получается вот так:
Все 43 критерия оценки можно отсортировать (столбец выделяется зеленым фоном) и каждому можно задать фильтры: от, до или от и до. Фильтры разных столбцов объединяются через И. Значения порогов - любые, а не фиксированные 0, 0.5, 50%, -1 как у МТ5.
Графики перерисовываю по столбцу который отсортирован. Покликал по разным - действительно самые интересные это те 8, что есть в MT5. Ну если уж сделал - пусть будут. Может кому захочется посмотреть по числу ошибок подряд или еще что...
Графики вместо таких
Сделал совмещенные
Сразу видно, что из Trall можно выбрать вариант получше, а от TP совсем нет пользы. т.к. графики слились в 1 линию.
Думаю так удобнее. Еще сделал по клику открытие Гугл чарта - в нем зум и он показывает точные значения.

Сейчас про 2D думаю как сделать... наверное так же линиями. Цветная мозаика трудна к восприятию.
Сразу видно, что из Trall можно выбрать вариант получше, а от TP совсем нет пользы. т.к. графики слились в 1 линию.
Очень полезная визуализация!
Все 43 критерия оценки можно отсортировать (столбец выделяется зеленым фоном) и каждому можно задать фильтры: от, до или от и до. Фильтры разных столбцов объединяются через И. Значения порогов - любые, а не фиксированные 0, 0.5, 50%, -1 как у МТ5.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2018.09.11 22:34
Актуально, не смотря на отличные кеши. Просьба открыть формат opt-файлов.
Как пример, зачем это нужно. Вот отсортировал результаты Оптимизации по прибыльности (PF)
Посмотрите на количество трейдов - они статистически ничего не значат: меньше 30. Но у них PF зашкаливает и таких результатов сотни/тысячи. Ну зачем этот мусор в таблице?
Если бы был открыть opt-формат, то можно было бы этот мусор автоматом убивать, оставляя только интересные более-менее стат. значимые результаты.
Что уж говорить о кастомных сортировках по нескольким критериям одновременно и т.д.
По сортировке проще объяснить на примере с этой страницы.
Здесь компрессоры отсортированы по степени сжатия - красный. Мне нужно было найти золотую середину между степенью сжатия и производительностью.
Зеленый - улучшение показателя скорости сжатия. Синий - разжатия.
Вы можете видеть, что каждое улучшение показателя сопровождается его подчеркиванием. Например, если показатель не подчеркнут, то эту строку не имеет смысл рассматривать, т.к. она уступает какой-то предыдущей строке. Таким образом по этой таблице почти сразу был найден великолепный компрессор - нижние зеленый/синий.
Если для проходов такое же реализовывается, то очень легко видеть интересные проходы. Мне это видится так, что для каждого столбца можно задать условие подчеркивания: значение больше, чем все предыдущие. Или меньше.
Очень полезная визуализация!
Не хватает столбца с номером строки.Нужно иметь возможность создавать таблицу только из выбранных номеров (что приглянулись при изучении результатов оптимизации).
Это может быть полезно, например, при составлении портфеля из разных проходов.
Ну и удалять бестолковые строки из таблицы по выбору. Как и столбцы - все 43 очень редко нужны.