s_mike@rambler.ru
s_mike@rambler.ru личный блог
01 декабря 2016, 13:01

Сканер рынка для QUIK

В терминале 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 указывает текст сообщения, которое выдаётся при выполнении условия. Первые две строки — комментарии.

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

 Сканер рынка для QUIK

 

Таким образом, в моём терминале сейчас в классе 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

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

  1. Индикацией состояния в экранной таблице с использованием цвета.
  2. Сообщением на экране
  3. Проигрыванием звукового файла wav, mp3, midi (настраивается отдельно на каждое событие)
  4. Запуском произвольной программы Windows
  5. Отсылкой почты на указанный адрес
  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.
                          // Можно использовать вычисляемые выражения, выделяя их символами #
                          // Если не задано, сообщение не выводится<br>VOICE_ON = Выполнено условие для инструмента #CODE()#<br>                          // Голосовое сообщение<br>VOICE_OFF = Условие для инструмента #CODE()# больше не выполняется

 

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

[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 языке Lua и библиотеке расширений на С++

28 Комментариев
  • Garry36.6
    01 декабря 2016, 13:17
    Плюс в карму.
  • Сергей Гаврилов
    01 декабря 2016, 13:31
    Молодец.., написал целую документацию, ей самое место в блоге... 
  • На Кураже
    01 декабря 2016, 13:41
    Спасибо!
  • 303
    01 декабря 2016, 14:25
    s_mike@rambler.ru, зачетно
  • nicolas
    01 декабря 2016, 14:46
    зачем все это?
    • Владимир Фокс
      01 декабря 2016, 22:52
      nicolas, видимо это пазл * 
      *если  мало секса- заими себя пазлом
  • Soldier
    01 декабря 2016, 14:52
    Спасибо! Познавательный пост.Профита!
  • Friend
    01 декабря 2016, 16:24
    Красавчик, нужная штука была бы если бы была лет 7 назад.
  • jatotrade.com
    01 декабря 2016, 16:52
    Хорошая вещь, спасибо. Плюс, к сожалению, виртуальный (нет рейтинга) +
  • Иван Симпл
    01 декабря 2016, 20:30
    Ни разу ничего не писал, но тут пошаговая инструкция! можно попробовать)
  • Stoic
    01 декабря 2016, 21:41
    Спасибо! Побольше пишите!
  • Astronomer
    01 декабря 2016, 22:17
    Спасибо!
  • SenSoR
    02 декабря 2016, 00:06
    Михаил наконец запостил на Смартлабе! Как говорится: «Вэлком!» )
  • Дмитрий С
    02 декабря 2016, 00:41
    Мля, как все сложно у вас.
  • Григорий
    02 декабря 2016, 09:07
    Конечно, плюсы. Пост полезнее многих других.
  • Анатолий Борисов
    02 декабря 2016, 11:06
    Спасибо. да еще и бесплатно.
    как донат кинуть? хорошее дело
  • Salvinit
    13 февраля 2017, 21:13
    Подскажите пожалуйста, а как записать условия, где сравнивается общий спрос с общим предложением. Типо общий спрос больше общего предложения (на столько то ) ???
  • iuiu
    25 октября 2017, 23:15
    ТАк как Акции сканировать? тут одним РИ не обойдешься, там и русские буквы и латинские и как просканировать наш рынок да по нескольким условиям, типа: Был Рост 2 дня, клоус вчерашний закрылся в 80% свечи, плюс еще какое условие? Интересуют дневки тока. По фьючам понятно, но одного условия мало, полюбэ. А так конечно респект и уважуха

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн