Сканер рынка

Опубликовано в Роботы

В терминале QUIK доступны сотни и даже тысячи инструментов. Как найти среди них те, в которых выполняются определённые условия? Например, бумага начала расти или достигнут локальный минимум и имеет смысл рассмотреть вопрос покупки этого актива? Или какое-то другое условие, которым пользуетесь именно вы для анализа ценных бумаг рынка.

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

Однако процесс поддаётся автоматизации - и это хорошо. Я не встречал в открытом доступе подобных утилит, поэтому некоторое время назад написал такую утилиту для себя. Она оказалась удобной - я ее причесал и делюсь с публикой. Лишний плюсик в личное дело на главном суде не помешает.

Итак, скачиваем Market Scaner. Установка простая: создаём на жестком диске папку с произвольным именем и вытряхиваем содержимое архива в эту папку.

Два главных файла: Scaner.lua и Scaner.ini. Первый - это робот, который запускается обычным способом через меню терминала Сервис-Скрипты Lua. Второй файл - это настройки сканирования. Именно в этом файле задаются все параметры сканера и условия поиска бумаг на рынке.

Файл настроек scaner.ini - это текстовый файл, имеющий определённую структуру. Его можно редактировать любым текстовым редактором типа блокнота Windows или notepad++. Не стоит пытаться редактировать его Word'ом или Фотошопом Крутой.

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

Редактировать файл настроек следует с учетом определённых правил.

Комментарии.

В тексте файла настроек можно написать комментарии. Эти строки не будут учитываться роботом. Он их проигнорирует, как будто их нет вовсе. Комментарии бывают двух типов. Если строка в файле начинается с точки с запятой - то комментарием считается вся это строка полностью. Также можно закомментировать только часть строки. Идущие подряд два слэша (две наклонные черты) сигнализируют роботу о необходимости проигнорировать их и весь остаток строки. Таким образом можно в теле файла настроек оставить для себя какие-то необходимые заметки, которые робот не будет пытаться обработать.

; эта строка будет проигнорирована полностью
MESSAGE = Ура!      // Все что слева от наклонных черт робот обработает, все
                              // что справа от них - проигнорирует

Файл настроек логически разделен на секции (или задачи). Каждая секция определяет определённое подмножество ценных бумаг, доступное в терминале, которые будут проверяться на выполнение условий. Внутри секции задаётся класс бумаг (например TQBR) и подмножество бумаг этого класса для сканирования. Можно задать сканирование всех бумаг класса. Также внутри секции задаётся условие, которое проверяется для каждой из бумаг и описываются необходимые действия в случае истинности или ложности условия. Каждая секция имеет свое имя, которое задаётся в её начале в квадратных скобках. Имена секций могут быть любыми, но не должны повторяться. Вот пример задания одной секции.

; Проверяем все доступные контракты на фьючерс РТС на тайфрейме 1 минута
; Сравниваем их текущую цену с 80 000 и показываем те, для которых это условие выполняется
[Цена больше 80000]
CLASSCODE = SPBFUT // Код класса
SECCODE = RI* // Код бумаг(и). Можно использовать маски ? (любой символ) и * (несколько символов).
TIMEFRAME = 60 // Таймфрейм. Можно задавать аббревиатурами типа M1,M2 и т.д. или количеством секунд CONDITION = C(0) > 80000 // Текущая цена более 80000
DESCRIPTION = Цена больше 80000 // Текст сообщения экранной таблицы.

В этом примере мы создали задачу, которая просматривает на минутном таймфрейме все бумаги, начинающиеся с RI в классе SPBFUT. Очевидно, что это все доступные фьючерсы на индекс РТС. Для каждой из этих бумаг проверяется текущая цена. В случае если она более 80000, условие срабатывает и на экран выводится информация. Секция была названа как "Цена больше 80000". Параметры ClASSCODE и SECCODE определяют подмножество бумаг для сканирования, TIMEFRAME определяет интервал, на котором происходит проверка условия, CONDITION задаёт проверяемое условие, DESCRIPTION указывает текст сообщения, которое выдаётся при выполнении условия. Первые две строки - комментарии.

Вот что я получаю на экране в результате сканирования:

 

 

Таким образом, в моём терминале сейчас в классе SPBFUT нашлось 8 инструментов, коды которых подходят под маску RI* и для которых выполняется условие "Текущая цена больше 80000". Очевидно, что это условие исполнилось для всех доступных фьючерсов RI. Подмигиваю  Если бы мы задали маску RI?7, то были бы обработаны только фьючерсы 2017 года.

Коды инструментов можно задавать списком. Например так:

SECCODE = RI*,Si?7,LK??

Чтобы просканировать весь класс инструментов, можно указать звездочку в параметре SECCODE.

Следует отметить, что построение каких-либо графиков и манипуляций со списком получаемых с сервера бумаг для работы сканера не требуется.

Как мы задали текущую цену в этом примере, что такое С(0)?

Текущая цена - это цена Close самой правой свечи. Вот правила для получения значений свечей (взято прямо из файла alerter.ini, в котором все эти правила описаны в виде комментариев):

Получение значений свечи (регистр символов важен)
Нумерация свечей может осуществляться двумя способами:
Основной - самая левая свеча имеет номер 1, следующая 2 и так далее до самой правой (текущей). Номер самой правой свечи пожно получить функцией SIZE()
Дополнительный - самая правая (текущая) свеча имеет номер 0, предпоследняя -1, еще левее -2 и так далее.

  • O(indx) - Значение Open свечи с номером indx
  • H(indx) - Значение High свечи с номером indx
  • L(indx) - Значение Low свечи с номером indx
  • C(indx) - Значение Close свечи с номером indx
  • V(indx) - Значение Volume свечи с номером indx
  • T(indx) - Время свечи с номером indx в виде 023004 (2 часа 30 минут 04 секунды)
  • D(indx) - Дата свечи с номером indx в виде 20140124 (24 января 2014)
  • A(indx) - Значение Average (H+L+C)/3 свечи с номером indx
  • M(indx) - Значение Middle (O+H+L+C)/4 свечи с номером indx
  • W(indx) - Значение Weighted Close (H+L+2*C)/4 свечи с номером indx
  • SIZE() - Количество доступных свечей инструмента

Таким образом, С(0) - это цена Close самой правой свечи, H(-1) - это цена High предпоследней свечи, T(-5) - это время пятой справа свечи, где самая правая свеча имеет номер 0. Также можно использовать вычисляемые значения Average, Middle и Weighted Close.

Получать можно как значения цены инсрумента, так и значения истории его параметров (таких как лучшая цена спроса или открытый интерес). Для работы с историей параметра инструмента укажите в секции PARAMETER = xxx, где xxx есть идентификатор параметра инструмента, как он принят в QUIK.

В выражении CONDITION можно использовать скобки, символы >  >=  <  <=  ==  ~= 

Предусмотрено использование математических формул. Вот их неполный список (взято из scaner.ini)

  • ABS (x) Модуль x.
  • ACOS (x) Арккосинус x (в радианах).
  • ASIN (x) Арксинус x (в радианах).
  • ATAN (x) Арктангенс x (в радианах).
  • CEIL (x) Наименьшее целое число, большее или равное x. (Округление «вверх»).
  • COS (x) Косинус x (Угол – в радианах).
  • COSH (x) Кошинус (гиперболический косинус) x.
  • DEG (x) Переводит угол, заданный в радианах (x) в градусы.
  • EXP (x) e в стенени x.
  • FLOOR (x) Наибольшее целое число, меньшее или равное x. (Округление «вниз»)
  • LN (x) Натуральный логарифм x.
  • LOG10 (x) Логарифм x по основанию 10.
  • RAD (x) Конвертирует угол x, заданный в градусах, в радианы.
  • ROUND (x) Округление до ближайшего целого
  • SIGN (x) Модуль числа. -1 для отрицательных, 0 или 1 для положительных
  • SIN (x) Синус x (аргумент – в радианах).
  • SINH (x) Шинус (гиперболический синус) x.
  • SQRT (x) Квадратный корень x. (Вы также можете использовать выражение x^0.5 для вычисления этого значения.)
  • TAN (x) Тангенс угла x (аргумент – в радианах)
  • TANH (x) Гиперболический тангенс x.

Математические функции, возвращающие одно значение для нескольких аргументов (регистр символов важен)

  • MIN (x1,x2,x3....) Минимальное значение нескольких значений
  • MAX (x1,x2,x3....) Максимальное значение нескольких значений
  • AVERAGE (x1,x2,x3....) Среднее арифметическое нескольких значений
  • STDEV (x1,x2,x3....) Стандартное отклонение нескольких значений
  • MEDIAN (x1,x2,x3....) Медианное значение нескольких значений
  • VARIANTA(x1,x2,x3....) Разница между минимальным и максимальным значениями
  • CONST (x1,x2,x3....) Проверка, что выборка состоит из одинаковых чисел. Возвращает true или false
  • CONTAIN (value,x1,x2...) Проверка наличия в выборке значения value. Возвращает true или false

Предусмотрены специфичные функции, требуемые для удобства работы со сканером

Специфичные функции (регистр символов важен)

  • ISCONNECTED() 1, если терминал подключен к серверу и 0, если отключен
  • TIME() Текущее время компьютера числом 023004 (2 часа 30 минут 04 секунды)
  • TIMESTR() Текущее время компьютера строкой 02:30:04 (2 часа 30 минут 04 секунды)
  • SERVERTIME() Время сервера брокера числом 023004 (2 часа 30 минут 04 секунды) или -1 если нет соединения
  • SERVERTIMESTR() Время сервера брокера строкой 02:30:04 (2 часа 30 минут 04 секунды) или -1 если нет соединения
  • DATE() Текущая дата компьютера числом 20140124 (24 января 2014)
  • DATESTR() Текущая дата компьютера строкой 24.01.2014 (24 января 2014)
  • DATETIMESTR() Текущие дата и время строкой 24.01.2014 02:30:04
  • WEEKDAY() Номер дня недели. 1 - Воскресенье, 7 - Суббота
  • INSTRUMENT() Название обрабатываемого инструмента
  • SECTION() Название текущей секции
  • CONDITION() Текст условия
  • FMT(x) Форматирование числа с разбиением на триады ( 1234567.89 --> 1 234 567.89)

В сканер встроен расчет индикаторов, список которых пополняется в соответствии с моими нуждами или убедительными просьбами Улыбаюсь. На момент написания статьи были встроены следующие индикаторы  :

  • SMA(candle_number,period,field) Simple Moving Average 
  • EMA(candle_number,period,field) Exponential Moving Average 
  • WMA(candle_number,period,field) William Moving Average
  • DEMA(candle_number,period,field) Double Exponential Moving Average
  • TEMA(candle_number,period,field) Triple Exponential Moving Average
  • FRAMA(candle_number,period) FRAMA Moving Average
  • TRIMA(candle_number,period,field) TRIMA Moving Average
  • ALMA(window_size,sigma,offset,field) Arnaud Legoux Moving Average
  • STDEV(candle_number,period,field) Standard Deviation
  • JMA(candle_number,period,field) Jurik Moving Average
  • HHV(candle_number,period,field) Highest High Value
  • LLV(candle_number,period,field) Lowest Low Value 
  • FISHER(candle_number,period,field) Fisher transform
  • RSI(candle_number,period,field) Relative Strength Index
  • MOMENTUM(candle_number,period,field) Momentum
  • ROC(candle_number,period,field) Rate of Change
  • BB_TOP(candle_number,period,deviation,field) Верхняя линия Bollinger Bands
  • BB_MIDDLE(candle_number,period,deviation,field) Средняя линия Bollinger Bands
  • BB_BOTTOM(candle_number,period,deviation,field) Нижняя линия Bollinger Bands
  • TR(candle_number) True Range
  • ATR(candle_number,period) Average True Range
  • WR(candle_number,period) Williams % Range

Скрипт пополняется встроенными индикаторами исходя из моих нужд или по просьбам пользователей, от которых я не в силах отказаться. ))) Актуальный список встроенных индикаторов находится в файле scaner.ini

Функция PARAM() позволяет получать значения из таблицы текущих торгов и использовать их в условиях и выражениях.

 

Сканер позволяет создавать оповещения следующих типов:

  1. Индикацией состояния в экранной таблице с использованием цвета.
  2. Сообщением на экране
  3. Проигрыванием звукового файла wav, mp3, midi (настраивается отдельно на каждое событие)
  4. Голосовым озвучиванием любого текста
  5. Запуском произвольной программы Windows
  6. Отсылкой почты на указанный адрес

Сканер может оповестить как о начале события, так и о его окончании.

Пример.

[Пробой уровня индикатора HHV снизу вверх]
CLASSCODE = SPBFUT // Код класса
SECCODE = RI*,GZZ? // Код бумаг(и). Можно использовать маски ? (любой символ)
// и * (несколько символов).
TIMEFRAME = 60 // Таймфрейм. Можно задавать аббревиатурами типа M1,M2 и т.д.
// или количеством секунд CONDITION = C(0) < HHV(-1,12) // Можно переносить условия на новые строки,
// используя символ подчеркивания. COLOR = 0x0000СС // Цвет секции в экранной таблице (палитра)
// Варианты: RGB(R,G,B) или #BBGGRR или 0xBBGGRR
// Если параметр не задан, выделение цветом по умолчанию отсутствует. EXECUTE_ON = begin.exe // Программа для запуска при начале события.
// Не запускается если не указана EXECUTE_OFF = end.exe // Программа для запуска при окончании события.
// Не запускается если не указана SOUND_ON = SMS.mp3 // Звуковой файл начала события. Не проигрывается если не задан.
SOUND_OFF = SMS.mp3 // Звуковой файл окончания события. Не проигрывается если не задан.
EMAIL_ON = #DATETIMESTR()# : [#SECTION()#] #INSTRUMENT()# Выполнено условие #CONDITION()#
// Текст почтового сообщения. Если не задано, почта не отправляется.
// Можно использовать вычисляемые выражения, выделяя их символами #
EMAIL_OFF = #DATETIMESTR()# : [#SECTION()#] #INSTRUMENT()# Условие #CONDITION()# перестало исполняться
// Текст почтового сообщения. Если не задано, почта не отправляется.
// Можно использовать вычисляемые выражения, выделяя их символами # DESCRIPTION = Выполнено: #DATETIMESTR()# // Текст сообщения экранной таблицы.
// Можно использовать вычисляемые выражения, выделяя их символами #
// Если не задано, в экранную таблицу выводится сообщение по умолчанию
MESSAGE_ON = Цена #FMT(C(0))# превысила максимум за последние 12 свечей
// Текст сообщения терминала QUIK.
// Можно использовать вычисляемые выражения, выделяя их символами #
// Если не задано, сообщение не выводится
MESSAGE_OFF = Цена вернулась в канал
// Текст сообщения терминала QUIK.
// Можно использовать вычисляемые выражения, выделяя их символами #
// Если не задано, сообщение не выводится

 

Еще пример. Здесь длинное условие разбито на несколько строк для удобства чтения

[RSI на Газпроме > 80 и ROC положителен]
CLASSCODE = QJSIM
SECCODE = GAZP
TIMEFRAME = 60 CONDITION = RSI(-1,14) > 80 and _
            ROC(-2,5) > 0 and _
            ROC(-1,5) > 0

Остальные примеры - в файле scaner.ini


 

 

Скачать архив

 

См. также Расширенный сервис оповещений QUIK

Комментарии   

# Вадим 111 11.01.2017 20:32
У меня антивирус нашел вирус в архиве, проверьте пожалуйста.
Ответить | Ответить с цитатой | Цитировать
# admin 11.01.2017 22:24
В архиве есть исполняемый exe файл, который отвечает за отправку почтовых сообщений. Эта программа написана на скриптовом языке autoit.

Некоторые не слишком аккуратные антивирусы (как правило бесплатные) находят в загрузочных файлах, созданных таким образом, некий вирус, которого там, естественно нет.

Просто игнорируйте это сообщение антивируса, оно ложное. Более качественные антивирусы понимают, что все в порядке.
Ответить | Ответить с цитатой | Цитировать
# subspear 15.02.2017 14:36
Как Вам оплатить через QIWI (Запрашивает ФИО)?
Ответить | Ответить с цитатой | Цитировать
# admin 15.02.2017 14:49
К сожалению, мне трудно что-либо сказать про qiwi - я никогда с ней дела не имел.

Могу дать яндекс кошелёк, если с киви на него можно сделать перевод.

Я только что попросил гугл выдать мне странички по запросу "перевод с qiwi на mastercard" -там куча разных вариантов и ни один не задаёт никаких лишних вопросов.
Ответить | Ответить с цитатой | Цитировать
# subspear 15.02.2017 14:59
Если можно Yandex.
Ответить | Ответить с цитатой | Цитировать
# subspear 15.02.2017 15:09
Через сайт ФИО не запрашивается, до этого пробовал через приложение на Android. Оплатил.
Ответить | Ответить с цитатой | Цитировать
# admin 15.02.2017 15:18
Пароль ушел на вашу почту
Ответить | Ответить с цитатой | Цитировать
# Юрий77 20.03.2017 15:23
Здравствуйте Михаил

Подскажите - как можно в этом скрипте задать временной интервал проверки условия - допустим каждые 10 секунд?
Это и к скрипту оповещения (Alert) относится
Ответить | Ответить с цитатой | Цитировать
# admin 20.03.2017 19:24
Юрий, в сканере можно задавать только стандартные интервалы, которые имеются в терминале quik.

Касаемо алертера. Алертер получает данные с графиков. На каком интервале построен график -такие данные и можно обрабатывать.
Ответить | Ответить с цитатой | Цитировать
# Юрий77 20.03.2017 19:45
я другое имел ввиду - например

CONDITION = Time() == ?????0 - где ? - любая цифра (что ставить вместо ? - это типа маска) - срабатывает когда последняя равно - 0
(это одно из условий в данной строке)
Ответить | Ответить с цитатой | Цитировать
# admin 20.03.2017 20:48
Time() %10 == 0
Ответить | Ответить с цитатой | Цитировать
# Олег12 06.04.2017 22:54
После запуска индикатора пишет в конце окна: Для продолжения закройте это окно. После закрытия окна скрипт останавливается . Надо заново запускать. Так и должно быть ?
Ответить | Ответить с цитатой | Цитировать
# admin 06.04.2017 23:37
Посмотрите, что в этом окне выше. Там список ошибок, которые были обнаружены в файле настроек.

Уберите эти ошибки и скрипт будет работать.

Также ошибки вы можете увидеть в логфайле.
Ответить | Ответить с цитатой | Цитировать
# Олег12 07.04.2017 13:55
Спасибо - отправил для кошки - очень она мне понравилась!
Жду ключик.
Ответить | Ответить с цитатой | Цитировать
# Олег12 08.04.2017 14:32
Все работает отлично - спасибо большое! А есть ли возможность сделать так, чтобы история сработок условий как-нибудь фиксировалась в таблице ? Например. создал простейшее условие:
CLASSCODE = SPBFUT
SECCODE = RIM7
TIMEFRAME = M1
CONDITION = C(0) < 111200
DESCRIPTION = Цена #C(0)# меньше 111200
COLOR = #FFAAAA

Когда цена уходит вниз за 111200 - все отлично пиликает, появляется сообщение в окне - цена уходит над 111200 - сообщение из таблички изчезает. А можно ли что-то сделать, чтобы это сообщение не изчезало из окна, а оставалось - показывало, что была сработка условия в такое-то время(например меняло цвет или становилось тусклым) , но теперь опять все нормально ? Спасибо.
Ответить | Ответить с цитатой | Цитировать
# admin 08.04.2017 16:17
Если при двойном клике на интересующей вас строке будет выскакивать окошко с историей срабатываний по этгму инструменту - это вас устроит ?
Ответить | Ответить с цитатой | Цитировать
# Олег12 08.04.2017 23:38
Да, конечно - это будет просто отлично - но надо еще чтобы и строка осталась и отформатиловала сь иначе, а не изчезла после отмены условия - а то после отмены и кликать то будет не на чем:) Спасибо.
Ответить | Ответить с цитатой | Цитировать
# admin 09.04.2017 12:23
Такой вариант плох.

Дело в том, что вы (как я понимаю из приведенного вами фрагмента настроек) используете сканер не совсем по назначению.

Вам он нужен для наблюдения за одной бумагой. На здоровье, раз вам так удобно и цель достигается.

Вообще сканер предназначен для поиска сигналов среди множества бумаг. Их может быть и 10 и 100 и несколько тысяч.

Поэтому держать в таблице строчки с инструментами, которые когда-то в прошлом срабатывали, не имеет особого смысла - в этой таблице невозможно будет ориентироваться .
Ответить | Ответить с цитатой | Цитировать
# Олег12 09.04.2017 15:42
Мой фрагмент - это пример. Оповещалка Quik это делает ( правда без почты, а с SMS) . Но Вас я понял - спасибо за ответ. :)
Ответить | Ответить с цитатой | Цитировать
# subspear 26.04.2017 14:59
Можно Яндекс кошелек на QIWI комиссия 2%+50 р. за платеж :)
Ответить | Ответить с цитатой | Цитировать
# admin 26.04.2017 16:08
Я не пользуюсь Яндекс деньгами.

Но можете перевести на кошелёк 4100 1269 4478 342.

Это временная возможность
Ответить | Ответить с цитатой | Цитировать
# a1timate 19.06.2017 10:33
Добрый день.
Можно узнать в чем принципиальное различие между этой программой и программой "Расширенный список оповещений"?
Также, в ссылке внизу статьи название не соответствует ссылке.
Ответить | Ответить с цитатой | Цитировать
# admin 19.06.2017 11:07
Здравствуйте

Алертер позволяет смотреть графики и индикаторы, построенные вручную. Практически любые индикаторы, в том числе самописные. Но ограниченное количество, столько, сколько вы из построите.

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

А ссылочку поправил, спасибо.
Ответить | Ответить с цитатой | Цитировать
# DigitService 18.01.2018 00:29
Михаил, приветствую,
а в сканере есть возможность сделать блок как в алертере касательно подключения к брокеру?

то есть чтобы всегда висела строка вверху показывая что подключение есть и когда разрыв то выскакивало сообщение что связь прервалась.

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

С уважением.
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий


Защитный код
Обновить