Обновление массива Rates с каждым новым баров. Или как добавить в массив только последний бар. - страница 4
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Оно то все хорошо и правда, но это сферическое копирование в вакууме.
Реализация боевого/надежного варианта добавит ~5 экранов кода и это не сделаешь на коленке.
Опять-же, даже результат выполнения Bars() нужно обрабатывать.
Я не сомневаюсь, что это самое быстрое решение с точки зрения производительности. Но разработать надежный вариант не так уж и легко.
Приведите тестовый пример, который не копирует запрошенные последние бары. Это будет баг либо в терминале, либо в MQL5.
Оно то все хорошо и правда, но это сферическое копирование в вакууме.
Реализация боевого/надежного варианта добавит ~5 экранов кода и это не сделаешь на коленке.
Опять-же, даже результат выполнения Bars() нужно обрабатывать.
Я не сомневаюсь, что это самое быстрое решение с точки зрения производительности. Но разработать надежный вариант не так уж и легко.
У вас есть
У Вас есть
Где тут пять страниц кода?
Приведите тестовый пример, который не копирует запрошенные последние бары. Это будет баг либо в терминале, либо в MQL5.
Я не в состоянии пока в силу недостаточного опыта на MQL5.
Тем не менее, я считаю, что отсутствие кода для воспроизведения возможных проблем не отменяет необходимость реализации всего описанного в цитате ниже
(я не критикую ваш код, я просто акцентирую внимание на том, что, по моему мнению, при реализации надежного варианта нужно будет много всего предусмотреть и обработать)
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Обновление массива Rates с каждым новым баров. Или как добавить в массив только последний бар.
Vladislav Boyko, 2024.01.22 15:57
Если копировать только новые бары, то нужно много дополнительных обработок, я думаю.
При ошибке копирования нужно очищать весь ранее скопированный массив. Если добавлено больше одного бара - лучше тоже скопировать все заново. Потому, что лично я не могу быть уверен, что новые бары добавились именно в нужный конец массива (а не подгрузилась история, например).
Плюс все равно нужен хотя бы холостой запрос с каждым тиком что бы поддерживать график в актуальном состоянии. По идее, вызов Bars() для этого графика может обеспечить холостой запрос, но это не точно и нужно проверять (и как раз поможет узнать, добавились ли новые бары).
А если между вызовом Bars и копированием самих котировок придет тик, который сформирует новый бар (привет, паранойя)? Получается, при добавлении бара нужно копировать на 1 бар больше, что бы убедится потом, что все правильно добавили.
Довольно громоздкая хреновина получится с учетом всего этого.
У вас есть
У Вас есть
Где тут пять страниц кода?
Я, пожалуй, ретируюсь из этого обсуждения потому, что на данный момент не могу в коде показать то, что имею ввиду
Я так и предлагал - запрашивать только новые бары, добавлять в общий массив.
А ваш пример с ошибкой, поэтому вызов просто не работает (не потребляет ни времени, ни памяти):
Вместо этого должно быть:
Спасибо. Вот уж лоханулся, по полной. Но и вы не сразу это заметили. Хоть что-то в оправдание…:)))
У вас есть
У Вас есть
Где тут пять страниц кода?
Артём, в обоих частях есть засады :-) может прийти больше 1-го новых баров (например связь затыкалась), могут прийти некорректные данные, может прийти докачка/исправление истории. Если включая 0-й бар то незабывать копировать 2(!) бара (последний перезаписывать и новый добавлять)
не 5-ть конечно, но довольно кропотливо..Правда не разу не испытывал потребности держать полную копию Rates в отдельном массиве. В базы и эксель синхронизировал, поэтому уверенно - там есть подводные камни
не 5-ть конечно, но довольно кропотливо
5 много экранов это промышленное решение.
То есть, менеджер котировок, который в OnInit принимает массив нужных таймфреймов, создает экземпляры классов котировок для всех заданных таймфреймов и раздает всем нуждающимся константные указатели на экземпляры необходимых им графиков.
В OnTick этот менеджер сам обновляет все графики (читай классы котировок) и если что пошло не так, то возводит флаг ошибки.
Нуждающиеся чекают этот флаг ошибки и если ошибки нет, то просто спокойно используют котировки с помощью указателей, которые они получили в OnInit.
Я чуть позже может прикреплю здесь пример реализации на mql4, где прямой доступ к графикам и нет необходимости ничего копировать. Я как раз его сейчас ковыряю вношу в него изменения сейчас.
Основной прикол, что даже учитывая прямой доступ в четверке, все равно громоздко получается. А в пятерке пойди еще скопируй правильноCopyRates
// по ходу чо та тут шибко заморочились над поиском ответа на простейший вопрос ;)))))
решение в пару строк всего по сути
добавляйте в конец массива один бар, и пользуйтесь
(ArrayResize)
Вот такой эксперт запустить в тестере в режиме по открытию баров (потому что просили именно котировки, в онлайне нужно будет добавить общую проверку на формирование нового бара - здесь для нас это делает тестер), дважды: один раз параметр Batch равный true, второй раз - false.
Вот какие замеры получаем за 2023 год:
Это только по поводу быстродействия.
Насчет засечки последнего скопированного бара - нетрудно это реализовать и не займет ни времени, ни ресурсов (только одну переменную с datetime последнего бара сохранять и отправлять в CopyRates).
Чтобы не менять постоянного направления индексации, лучше подобный тест сделать через класс, где есть геттеры с нужным направлением индексации. Получается чуть быстрее. И более удобно.
результат через класс:
результат через смену индексаций:
хотя нет, скорость одинаковая, т.к. для правильного тестирования на реальных тиках нужно было сделать такую штуку: