Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не помню свои коды. Во время просмотра придет решение.
Во время просмотра увидел, что можно ускорить тестирование. Оставляю на будущее советник для замера производительности.
Этот советник убьет штатный тестер, на виртуалке прогоняет быстро. Еще ускорить - пока не до этого.
А в Orders.mqh сразу после вызова AddHistoryOrder корректирую баланс на своп
Логичнее до вызова этой функции.
Если ваш вариант, то своп надо считать не для ордеров из истории, а для активных. Видимо надо делать аналог функции SetSwap()
double Swap = this.HistoryOrders[this.AmountHistoryOrders-1].SetSwap(SwapShort, SwapLong, RolloverTime, Rollover3Days);
Заодно будет возможность считать свопы в onTick в начале нового дня, если кому-то надо будет.Если до, то он возьмет своп предыдущего перенесенного в историю ордера. А переносимый ордер посчитает своп во время выпонения AddHistoryOrder()
Исходил из оригинального исходника. В AddHistoryOrder нет ничего про свопы и не должно быть.
Пометил единственное место, где стал бы делать расчет свопа.
Исходил из оригинального исходника. В AddHistoryOrder нет ничего про свопы и не должно быть.
Пометил единственное место, где стал бы делать расчет свопа.
Удалил расчет в AddHistoryOrder и поместил его в указанное вами место. Сравнил результаты, всё точно совпадает с реальным тестером.
Но что делать с другими местами, где вызывается AddHistoryOrder и происходит перенос в историю (еще в снепшотах)? Тоже вставлять этот код?
Например тут:
Кстати тут и комиссия к балансу не прибавляется. Наверное лучше везде использовать GetFullProfit(), чтобы не путаться.
Виртуал рассчитан на максимальную производительность, поэтому стараюсь избегать любых доп. проверок, что вызываются миллиардами. Свопы нужны очень редко. Более того, штатный тестер их считает неправильно, т.к. у него нет истории изменений свопов.
Сегодня с этим столкнулся. 2 дня назад итоговый результат был один, а сегодня другой. Свопы к сделкам перестали совпадать и как результат общий итог. Но главное, что 2 дня назад и сегодня виртуальный результат совпадает с тестером MQ.
Слева - 2 дня назад, справа сегодня.
2 дня назад и сегодня виртуальный результат совпадает с тестером MQ.
Они оба берут данные по свопам из текущей спецификации символа. Посмотрите код выше с закомментированным Report. Так удобнее сравнивать.
Сам тестирую в режиме по пипсам. Там свопов нет. И быстрее пашет.
Но что делать с другими местами, где вызывается AddHistoryOrder и происходит перенос в историю (еще в снепшотах)? Тоже вставлять этот код?
Ничего не делать. Это же не относится к VIRTUAL::NewTick.
Вы можете объединять виртуалы, искусственно создавать любую историю и т.д. Для этого и нужен AddHistory в других местах.
Кстати тут и комиссия к балансу не прибавляется. Наверное лучше везде использовать GetFullProfit(), чтобы не путаться.
Похоже, Вы правы.
По #define VIRTUAL_CLOSEALL_BYEND
Он отрабатывает после моего OnDeinit() и OnTester() и в тестере не получается получить эти финальные сделки.
Делаю распечатку так:
В распечатках закрытые сделки отсутствуют (т.к. ваш VIRTUAL_CLOSEALL_BYEND еще не отработал). И баланс с эквити не совпадают
AccountBalance = 100239.2 AccountEquity = 100145.71
т.к. сделки не закрыты еще.
Если убрать #define VIRTUAL_CLOSEALL_BYEND и раскомментировать в коде выше
//VIRTUAL::NewTick(); VIRTUAL::Stop();
то закрытые сделки попадают в распечатку. И баланс с эквити совпадут.AccountBalance = 100143.69 AccountEquity = 100143.69
Видимо #define VIRTUAL_CLOSEALL_BYEND не имеет смысла, т.к. в тестере о закрытых сделках не узнать. И нужно делать VIRTUAL::Stop(); самостоятельно.
А VIRTUAL::NewTick(); делаю для того, чтобы закрытие сделок было как в тестере - по цене последнего тика в 23:59, я прерываю вызов NewTick() в 23:55 т.к. рынок закрыт и цена там другая, поэтому и нужен этот последний тик.
Обновление:
Подумал, что мой OnTester не дает вашему выполняться. Закомментировал свой и добавил в ваш Print(). На печать ничего не вышло, похоже что ваш OnTester не выполняется. Завтра посмотрю подробнее.