Блог им. s_mike
В терминале 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 и так далее.
Таким образом, С(0) — это цена Close самой правой свечи, H(-1) — это цена High предпоследней свечи, T(-5) — это время пятой справа свечи, где самая правая свеча имеет номер 0. Также можно использовать вычисляемые значения Average, Middle и Weighted Close.
Получать можно как значения цены инсрумента, так и значения истории его параметров (таких как лучшая цена спроса или открытый интерес). Для работы с историей параметра инструмента укажите в секции PARAMETER = xxx, где xxx есть идентификатор параметра инструмента, как он принят в QUIK.
В выражении CONDITION можно использовать скобки, символы > >= < <= == ~=
Предусмотрено использование математических формул. Вот их неполный список (взято из scaner.ini)
Математические функции, возвращающие одно значение для нескольких аргументов (регистр символов важен)
Предусмотрены специфичные функции, требуемые для удобства работы со сканером
Специфичные функции (регистр символов важен)
В сканер встроен расчет индикаторов, список которых пополняется в соответствии с моими нуждами или убедительными просьбами . На момент написания статьи были встроены следующие индикаторы:
Сканер позволяет создавать оповещения следующих типов:
Сканер может оповестить как о начале события, так и о его окончании.
Пример.
[Пробой уровня индикатора 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 и библиотеке расширений на С++
*если мало секса- заими себя пазлом
как донат кинуть? хорошее дело