Скринер активов через советника

 

Вводные данные:

1. Есть рабочий алгоритм определения торгового сигнала на указанном ТФ. Пусть он будет выглядеть как функция

bool HaveSignal(Symbol);

2. Функция умеет отправлять push, писать сигналы в файл.


Задача: Просканировать все доступные активы (МТ5, активов более 4000). То есть сделать некий скринер через эксперта.


Что было опробовано:

В цикле через SymbolsTotal(false) обхожу все активы, проверяю, что торги доступны (SYMBOL_TRADE_MODE_DISABLED), вызываю функцию. Проверка проводится не на каждом тике, а раз в 1 бар, ТФ 4 часа.

Все вроде бы ничего, за некоторыми исключениями:

1. Проверяет только тысячу активов.

2. Очень долгая проверка.


Вопрос - как лучше реализовать идею собственного скринера активов? Алгоритм поиска сигнала нелинейный, в существующие скринеры типа FinViz.com его не впишешь. Глазами тоже нереально такой объем пересмотреть.  Буду рад любому дельному совету.

 
firsalex:

Вводные данные:

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 раз в бар.

Собственно, основная проблема в скорости работы - последовательный перебор такого количества занимает кучу времени. Может, можно распараллелить вычисления?

 
firsalex:

"Так сначала проверьте  SymbolsTotal  связка с SymbolName то все видит активы? или с ними что то не так?"

Тут затупил, согласен. В лог выводил с одним параметром, в функции с другим. Поправил, теперь все ровно = 4300 активов.


Насчет расчетов - выполняется функция в OnTick(), затем идет проверка, пришел новый бар или нет. Зачем сделано - затем, что нет необходимости каждый тик высчитывать то, что нужно 1 раз в бар.

Собственно, основная проблема в скорости работы - последовательный перебор такого количества занимает кучу времени. Может, можно распараллелить вычисления?

Отлично. Но я понял у вас может быть еще одна проблемс - Бары начинаются на разных инструментах в разные моменты времени, поэтому проверять нужно для каждого, а т.к. советник запущен на одном графике, то нельзя получив новый бар ждать следующего.

т.е. надо ждать пока по всем инструментам не образуется новый бар (заполнить массив как сказали выше) и только тогда можно переходить в режим ожидания(и то не всегда). Т.е. режима работы на каждом тике не избежать. 

в тестере если не ошибаюсь этой проблемы нет, только в реале.

 

Эту проблему я тоже решил, сделав функцию bool NewBar(symbol, period) - на каждом тике проверяется, есть ли новый бар по указанным активу и таймфрейму.

 
firsalex:

1. Проверяет только тысячу активов.

Группами по N-штук включать в Обзор рынка. Проверили - удалили и следующую группу добавили на проверку.

2. Очень долгая проверка.

Это архитектурная особенность MT5.

 

Долго — это сколько? 20 секунд или 5 минут?

Если не упираетесь в объем оперативной памяти, можно распараллелить, будет быстрее во столько раз, сколько доступно ядер процессора (или даже больше, если упираетесь не в процессор).

Вариант попроще: запускаем несколько советников, каждому задаем параметрами номер первого и последнего инструмента, который он должен обрабатывать( 1-500, 501-1000, и т.д.).

Вариант поудобнее: выносим расчеты в скрипт, из советника запускаем несколько скриптов, каждому из которых дается пачка заданий. При завершении работы скрипта запускаем на его место новый, с новой пачкой. Пачки делаем небольшие, чтобы один застрявший инструмент не тормозил все остальные.

Еще можно попробовать перенести расчеты в индикатор, запустить их 4000, и посмотреть, как МТ с этим справится ;)


Но я подозреваю, что проблема именно в памяти, так как МТ после доступа к тайм-сериям (а сигнал же по ним определяется?) какое-то время их не выгружает, и память быстро забивается. С этим бороться можно только с помощью своей копии всех нужных данных нужного размера.

 
fxsaber:

Это архитектурная особенность MT5.

О чем конкретно речь?

 
Andrey Khatimlianskii:

О чем конкретно речь?

Память и время на подъем исторических данных.

 
Andrey Khatimlianskii:

Долго — это сколько? 20 секунд или 5 минут?

Если не упираетесь в объем оперативной памяти, можно распараллелить, будет быстрее во столько раз, сколько доступно ядер процессора (или даже больше, если упираетесь не в процессор).

Вариант попроще: запускаем несколько советников, каждому задаем параметрами номер первого и последнего инструмента, который он должен обрабатывать( 1-500, 501-1000, и т.д.).

Вариант поудобнее: выносим расчеты в скрипт, из советника запускаем несколько скриптов, каждому из которых дается пачка заданий. При завершении работы скрипта запускаем на его место новый, с новой пачкой. Пачки делаем небольшие, чтобы один застрявший инструмент не тормозил все остальные.

Еще можно попробовать перенести расчеты в индикатор, запустить их 4000, и посмотреть, как МТ с этим справится ;)


Но я подозреваю, что проблема именно в памяти, так как МТ после доступа к тайм-сериям (а сигнал же по ним определяется?) какое-то время их не выгружает, и память быстро забивается. С этим бороться можно только с помощью своей копии всех нужных данных нужного размера.

Долго - это минимум час. Причем в отладке видно, что застрявший инструмент вешает всю работу.Похоже, действительно, придется делать вариантом "поудобнее":

1. При старте советника получать весь список активов.

2. Разбивать его на блоки по 10-50 штук и думать, что делать, если зависнет.


И еще вопрос - в МТ5 нет никакого API, позволяющего сторонними путями получать котировки всех нужных активов? Может, так проще будет?