Ошибки, баги, вопросы - страница 1861
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
HistoryDealGet* и HistoryOrderGet*-функции написаны очень странно, с точки зрения производительности.
Когда делаю HistorySelect, например, на 100К отдельных записей. То HistoryDealGet-функция требует первым аргументом не номер записи в исторической таблице, а тикет. При этом таблица отсортирована по времени, а не по тикету. Поэтому при выполнении, первое, что делает HistoryDealGet-функция, это бежит каждый раз по таблице и ищет подходящий Ticket.
Зачем столь нерациональное расходование ресурсов?! Получается, что самый первый тикет и самый последний будут выполняться с разными скоростями. И чтобы получить все характеристики последней сделки, HistoryDealGet-функции будут каждый раз пробегать всю таблицу.
Почему не сделать нормально?
И как HFT-робота тестировать, если для того, чтобы узнать размер комиссии текущей позиции, нужно лезть каждый раз в тормозную историю через HistorySelect и ни в коем случае не через HistorySelectByPosition? Посмотреть проскальзывание отложенного ордера превращается в треш производительности!
ACCOUNT_PROFIT в тестере показывает ерунду.
Запускаем советник, который открывает и закрывает тут же позицию
Результат
ACCOUNT_PROFIT показывает ноль, но на самом деле -56.44. Как следствие, неправильно оцениваются эквити, просадка и т.д.
PositionGetDouble(POSITION_PROFIT) - аналогично.
И как HFT-робота тестировать, если для того, чтобы узнать размер комиссии текущей позиции, нужно лезть каждый раз в тормозную историю через HistorySelect и ни в коем случае не через HistorySelectByPosition? Посмотреть проскальзывание отложенного ордера превращается в треш производительности!
HistorySelect работает через двоичный поиск запрошенного интервала времени или нет? Т.е. O(N) или O(log(N))?
Нет. В данном случае двоичный поиск неприменим
Так внутриархитектурно обе истории (Orders и Deals) отсортированы по времени.
Извините, погорячился.
Да, отсортированы по времени. Начальная запись ищется двоичным поиском.
Да, отсортированы по времени. Начальная запись ищется двоичным поиском.
Последнюю запись разве не логично искать так же?
Очень напрягает организация работы с историей. HFT в тестере - почти нереально. Написал по этому поводу несколько постов на форуме и оформил в виде заявки в СД.
И еще, если в терминале и так есть история, то почему к ней обязываете обращаться через HistorySelect, а не по принципу MT4 - SELECT_BY_POS? И что совсем непонятно, зачем HistoryDealGet* реализован через тикет с соответствующей O(N), когда логично опять же через SELECT_BY_POS?
Очень интересные записи
Последнюю запись разве не логично искать так же?
Зачем?
От времени до времени. Начальное время нашёл, а дальше идёт поэлементное копирование. До конечного времени.
Имело бы смысл, если бы все записи были в одном блоке памяти. Я Вам уже говорил в севисдеске, что ордера и сделки в истории хранятся в блочных массивах, чтобы не было перераспределения памяти, а только дораспределение
Зачем?
От времени до времени. Начальное время нашёл, а дальше идёт поэлементное копирование. До конечного времени.
Имело бы смысл, если бы все записи были в одном блоке памяти. Я Вам уже говорил в севисдеске, что ордера и сделки в истории хранятся в блочных массивах, чтобы не было перераспределения памяти, а только дораспределение
Очень напрягает организация работы с историей. HFT в тестере - почти нереально.
Решается алгоритмичнски.
Для HFT не надо каждый раз лазить в историю. Подготовьте необходимую информацию в процессе инициализации и держите её наготове, чтобы очень быстро доступаться