Сканер рынка

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

В терминале 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 wink. Если бы мы задали маску 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 (Угол – в радианах).
  • 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 (аргумент – в радианах)..
  • SQRT (x) Квадратный корень x. (Вы также можете использовать выражение x^0.5 для вычисления этого значения.)
  • TAN (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() Название обрабатываемого инструмента в виде Класс#Код
  • INSTRUMENT_NAME() Полное название инструмента
  • INSTRUMENT_SNAME() Короткое название инструмента
  • SECTION() Название текущей секции
  • CONDITION() Текст условия
  • FMT(x) Форматирование числа с разбиением на триады ( 1234567.89 --> 1 234 567.89)
  • NL() Возвращает символ перевода строки

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

  • ALMA(candle_number,window_size,sigma,offset,field) ALMA Moving Average
  • AO(candle_number,per_fast,per_slow,field) Awesome oscillator
  • AROON_H(number,period) Линия UP индикатора Aroon
  • AROON_L(number,period) Линия DOWN индикатора Aroon
  • ATR(candle_number, period) Average True Range
  • BB_BOTTOM(candle_number,period,deviation,field) Нижняя линия Bollinger Bands
  • BB_MIDDLE(candle_number,period,deviation,field) Средняя линия Bollinger Bands
  • BB_TOP(candle_number,period,deviation,field) Верхняя линия Bollinger Bands
  • CMO(candle_number,period,field) Chande Momentum Oscillator
  • DEMA(candle_number, period, field) Double Exponential Moving Average
  • EMA(candle_number, period, field) Exponential Moving Average
  • FISHER(candle_number,period,field) Fisher transform
  • FRACTAL_H(number,period,field) Верхний фрактал. Поле для расчета по умолчанию - High. Если фрактал существует, возвращает его значение или nil иначе
  • FRACTAL_L(number,period,field) Нижний фрактал. Поле для расчета по умолчанию - Low. Если фрактал существует, возвращает его значение или nil иначе
  • FRAMA(candle_number, period) FRAMA Moving Average
  • HHV(candle_number,period,field) Highest High Value
  • HMA(candle_number, period, field) Hull Moving Average
  • JMA(candle_number, period, field) Jurik Moving Average
  • KALMAN(candle,noice,field) Фильтр Кальмана
  • KC_BOTTOM(candle_number,period,deviation,field) Нижняя линия Keltner Channel
  • KC_MIDDLE(candle_number,period,deviation,field) Средняя линия Keltner Channel
  • KC_TOP(candle_number,period,deviation,field) Верхняя линия Keltner Channel
  • LLV(candle_number, period, field) Lowest Low Value
  • MACD(candle_number,per_fast,per_slow,percent,field) MACD. Режим вычисления percent = true|false
  • MACDH(candle_number,per_fast,per_slow,per_signal,percent,field) MACD-Histogram. Режим вычисления percent = true|false
  • MACDS(candle_number,per_fast,per_slow,per_signal,percent,field) MACD-Signal. Режим вычисления percent = true|false
  • MD(candle_number,period,smoothing,field) McGinley Dynamic
  • MOMENTUM(candle_number,period,field) Momentum
  • NRTR(k, field) NRTR
  • NRMA(period, k, sharp, field) NRMA
  • ROC(candle_number,period,field) Rate of Change
  • RSI(candle_number,period,field) Relative Strength Index
  • SMAD(candle_number, period, field) SMAD
  • STDEV(candle_number,period,field) Standard Deviation
  • TEMA(candle_number, period, field) Triple Exponential Moving Average
  • TR(candle_number) True Range
  • TRIMA(candle_number, period, field) TRIMA Moving Average
  • VARINDEX(candle_number,N) Индекс Вариации
  • VIDYA_CMO(candle_number,period_ema,period_cmo,field) Variable Index Dynamic Average
  • VHF(candle,period,field) Вертикальный горизонтальный фильтр
  • WMA(candle_number, period, field) William Moving Average
  • WR(candle_number,period) Williams % Range

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

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

 

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

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

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

Пример.

[Пробой уровня индикатора 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