Сканер рынка
В терминале 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 (Угол – в радианах).
- 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() позволяет получать значения из таблицы текущих торгов и использовать их в условиях и выражениях.
Сканер позволяет создавать оповещения следующих типов:
- Индикацией состояния в экранной таблице с использованием цвета.
- Сообщением на экране
- Проигрыванием звукового файла wav, mp3, midi
- Голосовым озвучиванием любого текста
- Запуском произвольной программы Windows
- Отсылкой почты на указанный адрес
- Сообщением в 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
Некоторые не слишком аккуратные антивирусы (как правило бесплатные) находят в загрузочных файлах, созданных таким образом, некий вирус, которого там, естественно нет.
Просто игнорируйте это сообщение антивируса, оно ложное. Более качественные антивирусы понимают, что все в порядке.
Могу дать яндекс кошелёк, если с киви на него можно сделать перевод.
Я только что попросил гугл выдать мне странички по запросу "перевод с qiwi на mastercard" -там куча разных вариантов и ни один не задаёт никаких лишних вопросов.
Подскажите - как можно в этом скрипте задать временной интервал проверки условия - допустим каждые 10 секунд?
Это и к скрипту оповещения (Alert) относится
Касаемо алертера. Алертер получает данные с графиков. На каком интервале построен график -такие данные и можно обрабатывать.
CONDITION = Time() == ?????0 - где ? - любая цифра (что ставить вместо ? - это типа маска) - срабатывает когда последняя равно - 0
(это одно из условий в данной строке)
Уберите эти ошибки и скрипт будет работать.
Также ошибки вы можете увидеть в логфайле.
Жду ключик.
CLASSCODE = SPBFUT
SECCODE = RIM7
TIMEFRAME = M1
CONDITION = C(0) < 111200
DESCRIPTION = Цена #C(0)# меньше 111200
COLOR = #FFAAAA
Когда цена уходит вниз за 111200 - все отлично пиликает, появляется сообщение в окне - цена уходит над 111200 - сообщение из таблички изчезает. А можно ли что-то сделать, чтобы это сообщение не изчезало из окна, а оставалось - показывало, что была сработка условия в такое-то время(например меняло цвет или становилось тусклым) , но теперь опять все нормально ? Спасибо.
Дело в том, что вы (как я понимаю из приведенного вами фрагмента настроек) используете сканер не совсем по назначению.
Вам он нужен для наблюдения за одной бумагой. На здоровье, раз вам так удобно и цель достигается.
Вообще сканер предназначен для поиска сигналов среди множества бумаг. Их может быть и 10 и 100 и несколько тысяч.
Поэтому держать в таблице строчки с инструментами, которые когда-то в прошлом срабатывали, не имеет особого смысла - в этой таблице невозможно будет ориентироваться .
Но можете перевести на кошелёк 4100 1269 4478 342.
Это временная возможность
Можно узнать в чем принципиальное различие между этой программой и программой "Расширенный список оповещений"?
Также, в ссылке внизу статьи название не соответствует ссылке.
Алертер позволяет смотреть графики и индикаторы, построенные вручную. Практически любые индикаторы, в том числе самописные. Но ограниченное количество, столько, сколько вы из построите.
Сканер может просматривать сотни и тысячи инструментов, индикаторы строить не нужно. Но набор индикаторов ограничен, только те, что встроены в сканер.
А ссылочку поправил, спасибо.
а в сканере есть возможность сделать блок как в алертере касательно подключения к брокеру?
то есть чтобы всегда висела строка вверху показывая что подключение есть и когда разрыв то выскакивало сообщение что связь прервалась.
у меня есть такой блок в алертере, но не получается почему то в сканере.. так как каждый блок запрашивает сразу период времени и другие показатели не имеющие отношения к процессу подключения программы.
пока получается только прописывать время в каждом дескрипшене при срабатывании сканера, а других индикаторов что связь оборвалась или на связи программа работает построить не нашел способа.
С уважением.
Если соединения нет, то нет и изменения котировок инструментов. Следовательно, алертер будет просто спать.
Для отслеживания соединения с сервером используйте например, алертер. Или включите паровозик в тулбаре квика
Все сообщения, оставленные здесь будут автоматически удалены. Спасибо за понимание.
RSS лента комментариев этой записи