Вводные данные:
1. Есть рабочий алгоритм определения торгового сигнала на указанном ТФ. Пусть он будет выглядеть как функция
bool HaveSignal(Symbol);
2. Функция умеет отправлять push, писать сигналы в файл.
Задача: Просканировать все доступные активы (МТ5, активов более 4000). То есть сделать некий скринер через эксперта.
Что было опробовано:
В цикле через SymbolsTotal(false) обхожу все активы,
проверяю, что торги доступны (SYMBOL_TRADE_MODE_DISABLED),
вызываю
функцию. Проверка проводится не на каждом тике, а раз в 1 бар, ТФ 4 часа.
Все вроде бы ничего, за некоторыми исключениями:
1. Проверяет только тысячу активов.
2. Очень долгая проверка.
Вопрос - как лучше реализовать идею собственного скринера активов? Алгоритм поиска сигнала нелинейный, в существующие скринеры типа
FinViz.com его не впишешь. Глазами тоже нереально такой объем пересмотреть. Буду рад любому дельному совету.
Так сначала проверьте SymbolsTotal связка с SymbolName то все видит активы? или с ними что то не так? Я сначала в массив строк загоняю, потом с ними работаю.
Добрый день!
Надо делать расчет на каждом тике, и данные забить в массив,
когда массивы пополнены - расчет прекратить.
Как то так.
"Так сначала проверьте SymbolsTotal связка с SymbolName то все видит активы? или с ними что то не так?"
Тут затупил, согласен. В лог выводил с одним параметром, в функции с другим. Поправил, теперь все ровно = 4300 активов.
Насчет расчетов - выполняется функция в OnTick(), затем идет проверка, пришел новый бар или нет. Зачем сделано - затем, что нет необходимости каждый тик высчитывать то, что нужно 1 раз в бар.
Собственно, основная проблема в скорости работы - последовательный перебор такого количества занимает кучу времени. Может, можно распараллелить
вычисления?
"Так сначала проверьте SymbolsTotal связка с SymbolName то все видит активы? или с ними что то не так?"
Тут затупил, согласен. В лог выводил с одним параметром, в функции с другим. Поправил, теперь все ровно = 4300 активов.
Насчет расчетов - выполняется функция в OnTick(), затем идет проверка, пришел новый бар или нет. Зачем сделано - затем, что нет необходимости каждый тик высчитывать то, что нужно 1 раз в бар.
Собственно, основная проблема в скорости работы - последовательный перебор такого количества занимает кучу времени. Может, можно
распараллелить вычисления?
Отлично. Но я понял у вас может быть еще одна проблемс - Бары начинаются на разных инструментах в разные моменты времени, поэтому проверять нужно для каждого, а т.к. советник запущен на одном графике, то нельзя получив новый бар ждать следующего.
т.е. надо ждать пока по всем инструментам не образуется новый бар (заполнить массив как сказали выше) и только тогда можно переходить в режим ожидания(и то не всегда). Т.е. режима работы на каждом тике не избежать.
в тестере если не ошибаюсь этой проблемы нет, только в реале.
Эту проблему я тоже решил, сделав функцию bool NewBar(symbol, period) - на каждом тике проверяется, есть ли новый бар по указанным активу и таймфрейму.
1. Проверяет только тысячу активов.
Группами по N-штук включать в Обзор рынка. Проверили - удалили и следующую группу добавили на проверку.
2. Очень долгая проверка.
Это архитектурная особенность MT5.
Долго — это сколько? 20 секунд или 5 минут?
Если не упираетесь в объем оперативной памяти, можно распараллелить, будет быстрее во столько раз, сколько доступно ядер процессора (или даже больше, если упираетесь не в процессор).
Вариант попроще: запускаем несколько советников, каждому задаем параметрами номер первого и последнего инструмента, который он должен обрабатывать( 1-500, 501-1000, и т.д.).
Вариант поудобнее: выносим расчеты в скрипт, из советника запускаем несколько скриптов, каждому из которых дается пачка заданий. При завершении работы скрипта запускаем на его место новый, с новой пачкой. Пачки делаем небольшие, чтобы один застрявший инструмент не тормозил все остальные.
Еще можно попробовать перенести расчеты в индикатор, запустить их 4000, и посмотреть, как МТ с этим справится ;)
Но я подозреваю, что проблема именно в памяти, так как МТ после доступа к тайм-сериям (а сигнал же по ним определяется?) какое-то время их не выгружает, и память быстро забивается. С этим бороться можно только с помощью своей копии всех нужных данных нужного размера.
Это архитектурная особенность MT5.
О чем конкретно речь?
О чем конкретно речь?
Память и время на подъем исторических данных.
Долго — это сколько? 20 секунд или 5 минут?
Если не упираетесь в объем оперативной памяти, можно распараллелить, будет быстрее во столько раз, сколько доступно ядер процессора (или даже больше, если упираетесь не в процессор).
Вариант попроще: запускаем несколько советников, каждому задаем параметрами номер первого и последнего инструмента, который он должен обрабатывать( 1-500, 501-1000, и т.д.).
Вариант поудобнее: выносим расчеты в скрипт, из советника запускаем несколько скриптов, каждому из которых дается пачка заданий. При завершении работы скрипта запускаем на его место новый, с новой пачкой. Пачки делаем небольшие, чтобы один застрявший инструмент не тормозил все остальные.
Еще можно попробовать перенести расчеты в индикатор, запустить их 4000, и посмотреть, как МТ с этим справится ;)
Но я подозреваю, что проблема именно в памяти, так как МТ после доступа к тайм-сериям (а сигнал же по ним определяется?) какое-то время их не выгружает, и память быстро забивается. С этим бороться можно только с помощью своей копии всех нужных данных нужного размера.
Долго - это минимум час. Причем в отладке видно, что застрявший инструмент вешает всю работу.Похоже, действительно, придется делать вариантом "поудобнее":
1. При старте советника получать весь список активов.
2. Разбивать его на блоки по 10-50 штук и думать, что делать, если зависнет.
И еще вопрос - в МТ5 нет никакого API, позволяющего сторонними путями получать котировки всех нужных активов? Может, так проще будет?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вводные данные:
1. Есть рабочий алгоритм определения торгового сигнала на указанном ТФ. Пусть он будет выглядеть как функция
bool HaveSignal(Symbol);
2. Функция умеет отправлять push, писать сигналы в файл.
Задача: Просканировать все доступные активы (МТ5, активов более 4000). То есть сделать некий скринер через эксперта.
Что было опробовано:
В цикле через SymbolsTotal(false) обхожу все активы, проверяю, что торги доступны (SYMBOL_TRADE_MODE_DISABLED), вызываю функцию. Проверка проводится не на каждом тике, а раз в 1 бар, ТФ 4 часа.
Все вроде бы ничего, за некоторыми исключениями:
1. Проверяет только тысячу активов.
2. Очень долгая проверка.
Вопрос - как лучше реализовать идею собственного скринера активов? Алгоритм поиска сигнала нелинейный, в существующие скринеры типа FinViz.com его не впишешь. Глазами тоже нереально такой объем пересмотреть. Буду рад любому дельному совету.