Программирование на языке qpile + видео обзор

SELF TRADE

Последние сообщения

TRANSAQ Connector

TSLab

Автозапуск QUIK

Переводим стрелки у роботов

Последние комментарии

Поиск по Меткам

Учебник QPILE

Информационно-торговая система QUIK – программный комплекс для предоставления доступа к биржевым торгам через сеть Интернет в режиме реального времени (интернет-трейдинг).

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

Функции, выполняемые системой QUIK:
1. Обеспечение доступа к торгам на фондовом и срочном рынках, организуемым ведущими биржами страны:
• Московская межбанковская валютная биржа (ММВБ): Фондовая биржа, включая режим переговорных сделок (РПС) и операции РЕПО, Рынок государственных ценных бумаг, Валютный рынок, Секция срочного рынка.
• Фондовая биржа РТС: Биржевой рынок акций, включая операции РЕПО, Срочный рынок FORTS, Классический рынок акций.
• Фондовая биржа «Санкт-Петербург»: Фондовая секция.
• Биржа «Санкт-Петербург»: Срочный рынок.
• Санкт-Петербургская валютная биржа (СПВБ): Фондовый рынок.
2. Получение биржевой информации в режиме реального времени, включая очереди котировок ценных бумаг.
3. Обеспечение участника торгов и его клиентов информацией о собственных заявках и сделках.
4. Сбор поручений клиентов и их передача в торговую систему биржи.
5. Возможность подачи стоп-заявок, отложенных заявок (Карман транзакций) с их пакетным выставлением в торговую систему.
6. Возможность маржинального кредитования брокером своих клиентов и автоматический контроль заданных лимитов кредитования. Мониторинг показателей маржинального кредитования встроенными средствами, а также специализированным рабочим местом риск-менеджера (система «CoLibri»).
7. Возможность автоматизации торговых операций с использованием механизма импорта подготовленных транзакций из внешней программы.
8. Поддержка торговых операций на внебиржевом рынке.
9. Аутентификация пользователя системы и защита передаваемой информации от постороннего вмешательства.
10. Возможность применения сертифицированных ФАПСИ средств криптографической защиты информации для электронной цифровой подписи транзакций клиентов.
11. Графическое отображение динамики торгов по любым выбранным биржевым инструментам и их параметрам.
12. Динамический экспорт полученной информации в MS Excel, произвольные базы данных (используя ODBC) и системы технического анализа Equis Metastock, Wealth-Lab Developer и Omega TradeStation/ProSuite 2000.
13. Программирование вычислений с использованием встроенного языка QPILE.
14. Получение дополнительного информационного обеспечения в виде лент новостей информационных агентств и котировок финансовых инструментов на других (в том числе зарубежных) рынках.
15. Обмен текстовыми сообщениями с администратором системы и другими пользователями.
16. Автоматическое обновление версии программы и получение файлов по защищенному соединению.

Как устроен интернет-трейдинг?
Центральным звеном системы является сервер QUIK. Сервер подключен к торговым системам бирж через специальные «шлюзы», передающие серверу информацию о торгах и средствах брокера на бирже, и принимающие поручения на покупку/продажу. Сервер осуществляет сбор информации с торговых систем и ее трансляцию всем активным (подключенным) клиентам с минимально возможной задержкой.

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

Язык QPILE (QUIK Programmable Interface and Logic Environment) представляет собой набор команд, интерпретируемых рабочим местом QUIK.
Областью применения QPILE является создание новых таблиц для расчета в режиме реального времени собственных показателей на основе информации из других таблиц.
Данный функционал удобен, прежде всего, для брокера, так как у каждого брокера существует своя собственная стратегия расчета показателей клиентской позиции. Применение встроенного языка позволяет реализовать практически любой алгоритм. Ключевые моменты и синтаксис языка рассмотрены в учебнике qpile.
Примеры использования QPILE:
1. Динамический пересчет стоимости активов клиентов на рабочем месте брокера.
2. Динамический пересчет стоимости активов в портфеле клиента и его суммарной стоимости.
3. Вычисление показателей, отсутствующих в системе QUIK либо торговой системе биржи, на основе собственных алгоритмов.
4. Расчет параметров маржинального кредитования в соответствии с принятыми нормативами.
5. Программирование торговой стратегии, генерирующей сигналы на изменение позиций по инструментам.
Основной областью применения языка QPILE является расчет стоимости портфелей ценных бумаг, поэтому в терминологии описания типов таблиц часто используется определение «Портфели».
Как работает QPILE
1. Структура таблицы (назначение столбцов, строк, и формулы для вычисления параметров) описывается в виде программы на языке QPILE. Для вычисления в формулах можно использовать стандартные математические и логические операции, использовать переменные и массивы данных, запрашивать информацию из других таблиц системы QUIK.
2. Код программы может быть получен с сервера QUIK (серверный) или загружен с диска на компьютере пользователя (локальный). Полученный код обрабатывается интерпретатором языка QPILE на рабочем месте QUIK, который производит пересчет значений в формулах с заданной периодичностью. Таким образом формируется внутренний источник данных для отображения полученных значений в таблицах. Несколько таблиц на основе одной и той же программы используют общий источник данных, при этом вычисления не будут дублироваться и снижать производительность системы.
3. На основе программы можно создавать таблицы, обладающие стандартными функциями при работе с таблицами в системе QUIK.
4. Рабочее место QUIK имеет встроенный отладчик кода программ на QPILE, позволяющий вести пошаговую отладку и контролировать текущие значения переменных. Подробнее см. п. 8.24.

Основные функции языка QPILE:
1. Описание новых таблиц произвольной структуры,
2. Вычисление полей таблиц на основе математических формул и логических выражений,
3. Выделение ячеек таблицы цветом в зависимости от значений какого-либо показателя,
4. Уведомление пользователя звуковым сигналом и текстовыми сообщениями.
Таблица на языке QPILE поддерживает основные действия с таблицами в системе QUIK:
• Редактирование, в том числе выбор параметров для отображения и настройку их очередности,
• Управление «горячими клавишами»,
• Размещение на «экранных закладках»,
• Поиск значения в ячейках таблицы,
• Печать таблицы с предварительным просмотром,
• Копирование данных в Буфер Обмена Windows (Clipboard),
• Экспорт данных в Excel,
• Экспорт данных по ODBC.

Источник

Чайник чайнику о программировании в Квике на языке Opile

Программирование на языке qpile

Что нужно, чтобы начать работу с алгоритмическим языком Qpile в Квике.

2. Первоначальная чайная (для чайников) пошаговая процедура создания простейшей таблицы

(Я сам чайник — описываю, чтобы и самому лучше понять)

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

Итак, начинаю чайную процедуру.

Нужно сформировать тело программы

PORTFOLIO_EX Вася; «Заголовок» – наименование таблицы и определение основных параметров

DESCRIPTION Вася; «Описание программы»
CLIENTS_LIST ALL_CLIENTS; (код клиента, т.е. Ваш код, или как здесь неопределенный клиент)
FIRMS_LIST ALL_FIRMS; (Код Вашего брокера или как здесь неопределенный брокер)

USE_CASE_SENSITIVE_CONSTANTS; (это необязательная константа — можно обойтись без нее на первых порах, но я не смог обойтись — что у меня без нее не заработало)

PROGRAM (мозг программы)

END_PORTFOLIO_EX «Конец заголовка программы»

Это обязательная форма описания программы, дальше можно творить.
Ну как творить — выбирать из придуманных кем-то шаблонов работы программы.
Приведенный код есть как бы оповещение миру, что есть
человек по имени Вася. Это все что мы о нем знаем — только имя,
ни внешности, ни умений Васи — только имя.Хотя кое-что мы знаем о Васе —
он работает в КВике и может для нас предоставить из Квика нужную нам информацию.
Чтобы Вася заговорил ему не надо наливать, наливать будет как раз он,
но ему надо приготовить стаканы, чтобы было куда наливать.

Для этого нам нужно придумать переменные и описать эти переменные.
Переменные — это стаканы, которые будут хранить добытую Васей информацию.
Добывать эту информацию Вася будет из таблиц и графиков Квика.
Переменные мы придумываем исходя из той информации, которую мы хотим добыть.
Допистим, мы хотим знать текущую цену акций Газпрома и объем по текущей сделке.
Нам нужно три переменные: Ticker,
Preise1,
Volume.
Вставим их в тело программы, не просто в тело — в мозг программы.
Присвоим нашим переменным первоначальные значения. Здесь мы не описывали тип переменных,
пользуемся тем, что программа позволяет работать и так.

PORTFOLIO_EX Вася;
DESCRIPTION Вася;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

PROGRAM (мозг программы)

Ticker=«GAZP»
Preise1=0
Volume=0

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

Обязательное описание столбца таблицы:
PARAMETER Preise1; (связывание столбца с одной из наших переменных)
PARAMETER_TITLE Текущая цена акции; (заголовок стобца)
PARAMETER_DESCRIPTION Цена акции при открытии торгов; (описание действий, производимых в стобце)
PARAMETER_TYPE NUMERIC(10,2); (описание типа содержимого столбца — здесь числовой)
END (конец кода стобца)

В результате у нас получится следующий код.

PORTFOLIO_EX Вася;
DESCRIPTION Вася;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

PROGRAM (мозг программы)

Ticker=«GAZP»
Preise1=0
Volume=0

PARAMETER Ticker;
PARAMETER_TITLE Ticker;
PARAMETER_DESCRIPTION Ticker;
PARAMETER_TYPE STRING(256);
END

PARAMETER Preise1;
PARAMETER_TITLE Текущая цена акции;
PARAMETER_DESCRIPTION Цена последней сделки на текущий момент;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER Volume;
PARAMETER_TITLE Volume;
PARAMETER_DESCRIPTION Volume;
PARAMETER_TYPE NUMERIC(10,2);
END

Здесь описано таблица из трех столбцов, три переменных, которые привязаны к трем стобцам таблицы.

И вроде бы куда наливать есть, куда выливать тоже есть, но если запустить программу в Квике, то
обнаружится, что Вася молчит.
Ну как же — бутылки то нет, не из чего наливать. Нам нужна бутылка.
Бутылка — это таблицы Квик. Возьмем самую обширную таблицу — это таблица текущих торгов.
На странице 60 описания языка есть информация о Функциях для получения значений Таблицы
текущих торгов и описание полей таблицы.

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

Preise1= GET_PARAM («TQBR», «GAZP», «last»)

Переменной Preise1 присваивается текущий параметр из таблицы текущих торгов по акции Газпром — последняя цена сделки на текущий момент

Volume=GET_PARAM («TQBR», «GAZP», «VALUE»)

Переменной Volume присваивается объем в деньгах по сделке

Получается следующий код

PORTFOLIO_EX Вася;
DESCRIPTION Вася;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

PROGRAM (мозг программы)

Ticker=«GAZP»
Preise1=0
Volume=0

Preise1= GET_PARAM («TQBR», «GAZP», «last»)

Volume=GET_PARAM («TQBR», «GAZP», «VALUE»)

PARAMETER Ticker;
PARAMETER_TITLE Ticker;
PARAMETER_DESCRIPTION Ticker;
PARAMETER_TYPE STRING(256);
END

PARAMETER Preise1;
PARAMETER_TITLE Текущая цена акции;
PARAMETER_DESCRIPTION Цена последней сделки на текущий момент;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER Volume;
PARAMETER_TITLE Volume;
PARAMETER_DESCRIPTION Volume;
PARAMETER_TYPE NUMERIC(10,2);
END

Запускаем программу в Квике, а Вася молчит и ничего не наливает. При чем что обидно — мозг то у Васи работает, считает, но Вася разговаривать с нами не хочет.

Почему? У нас есть привязка переменных к столбцам таблицы, а нам надо еще и строки таблицы вывести.
Находим в справочнике языка Qpile функцию для вывода строки таблицы — вот она:

ADD_ITEM (DOUBLE Index, MAP table_string)
Создать значение (Число с плавающей точкой как индекс строки, массив МАР как строка таблицы)
Я хотел вот так
add_item(0, Вася) — создать значения по первой строке таблицы Вася, но по инструкции так не положено-надо еще массив создавать.

Объявляем переменную для массива- MD=0
Создаем массив — MD=CREATE_MAP()
Привязываем этот массив к стобцам таблицы
MD=SET_VALUE(MD,«Ticker»,Ticker)
MD=SET_VALUE(MD,«Preise1»,Preise1)
MD=SET_VALUE(MD,«Volume»,Volume)

Если присмотреться, то массив создан как бы из ребра Васи, т.е.идет привязка к тем же самым переменным.
Прямо как Ева из ребра Адама.

Выводим строку в таблицу

Получается следующий код

PORTFOLIO_EX Вася;
DESCRIPTION Вася;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

PROGRAM (мозг программы)

Ticker=«GAZP»
Preise1=0
Volume=0

Preise1= GET_PARAM («TQBR», «GAZP», «last»)

Volume=GET_PARAM («TQBR», «GAZP», «VALUE»)

MD=SET_VALUE(MD,«Ticker»,Ticker)
MD=SET_VALUE(MD,«Preise1»,Preise1)
MD=SET_VALUE(MD,«Volume»,Volume)

PARAMETER Ticker;
PARAMETER_TITLE Ticker;
PARAMETER_DESCRIPTION Ticker;
PARAMETER_TYPE STRING(256);
END

PARAMETER Preise1;
PARAMETER_TITLE Текущая цена акции;
PARAMETER_DESCRIPTION Цена последней сделки на текущий момент;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER Volume;
PARAMETER_TITLE Volume;
PARAMETER_DESCRIPTION Volume;
PARAMETER_TYPE NUMERIC(10,2);
END

Все — теперь должно работать, Вася заговорит с нами и нальет.
Пиршествуйте, ну или пируйте.

Источник

СУПЕР пример создания простого робота на языке Qpile.

На мой взгляд, это лучший пример для изучения программирования для Квика.

На чем пишем?

Написать автомат для торговли можно практически на любом современном языке программирования, самое главное – установить обмен данными между терминалом (или шлюзом биржи) и автоматизированной торговой системой. А это требует достаточно серьезных навыков программирования. Самый доступный путь – написание робота на языке Qpile.

Плюс этого языка состоит в том, что он прост и интегрирован непосредственно в терминал Quik [1], что повышает надежность связки «Терминал-Робот». Из минусов можно выделить отсутствие интерфейса взаимодействия с пользователем (то есть программу можно запустить и остановить, но управлять ею в процессе работы нельзя). Также проблематично на Qpile обрабатывать большие массивы данных, что накладывает ограничение на создание механических систем для работы с большим количеством входных параметров. Но для реализации простых стратегий функционала этого языка вполне достаточно.

С чего начать?

Робот – это программный код, который можно набрать в любом текстовом редакторе, даже в «Блокноте» стандартного пакета Windows. Однако удобнее его писать в специализированных редакторах. В них автоматически нумеруются строки и подсвечиваются операторы, что улучшает восприятие кода и упрощает его отладку. Наиболее распространены редакторы «Notepad + +» и «SciTE», они бесплатны, и для них можно найти модули для корректной подсветки синтаксиса Qpile. Есть также специализированный редактор «Qpile Master 1.2», который в бесплатном варианте имеет ограниченный функционал.

Стратегия и инструмент

Любой робот работает по заранее заданному алгоритму, который является логическим воплощением торговой стратегии. Cтратегия является самой важной частью любого автомата (хотя по объему может занимать небольшую часть кода). Ее выбор – основополагающий этап для построения любой торговой системы, именно она делает одну систему прибыльной, а другую убыточной при прочих равных условиях. Вопросу выбора стратегии посвящено немало книг [2,3]. Целью данного цикла статей является процесс написания робота, который самостоятельно принимает решения о покупке/продаже, выставляет заявки и проверяет их исполнение (но не гарантируется, что он обязательно окажется прибыльным). Какой алгоритм выбрать для торговой системы, каждый трейдер решает сугубо индивидуально. Мы же рассмотрим одну из самых простых стратегий – торговлю в канале. Ее алгоритм прост: если цена ниже определенного уровня, покупаем, а если выше – продаем. Если котировки выходят за пределы канала в невыгодном для нас направлении, фиксируем убытки.

В качестве рабочего инструмента используем фьючерс на обыкновенные акции Сбербанка. На момент написания статьи ближайшими контрактами были SRU1 (исполнение 14 сентября 2011 года) и SRZ1 (исполнение 14 декабря). Этот инструмент хорош тем, что характеризуется высокой ликвидностью и небольшим размером гарантийного обеспечения (1700 рублей на момент написания статьи). То есть, если мы будем торговать одним контрактом и закрывать позицию в случае убытка, даже в худшем случае это не приведет к существенным финансовым потерям. Но не следует забывать, что фьючерс имеет ограниченный срок жизни и вхождение в позицию незадолго до исполнения увеличивает риск возможных потерь. Для покупки и продажи выберем уровни 8500 и 9100 рублей (см. рис. 1).

Рис. 1 Динамика сентябрьского фьючерса на обыкновенные акции ОАО «Сбербанк России»

Программирование на языке qpile

Необходимо отметить, что стратегия с фиксированными уровнями оправдывает себя в краткосрочной перспективе, поскольку с течением времени средний уровень может измениться, и тогда выбранные цели станут неактуальными. Чтобы решить эту проблему, можно сделать уровни покупки/продажи динамическими, то есть привязать их к среднему значению за определенный период. Реализовать это можно, например, с помощью технического индикатора «скользящая средняя». Так мы и поступим позже. Однако сейчас остановимся на фиксированных уровнях, следуя принципу от простого к сложному.

Реализовать стратегию торговли в канале можно двумя способами. Первый подразумевает отслеживание уровня цены и выставление заявки при достижении цели. Также можно сразу размещать ордера на уровнях, независимо от текущей цены, и затем следить за исполнением. Первый способ применим только для инструментов, цены которых изменяются не слишком быстро, в противном случае, при резких движениях можно просто не успеть. Второй метод подходит для всех активов, однако при этом надо все время следить за исполнением заявок, при необходимости их переставлять или же во- все снимать (например, при динамически изменяющихся уровнях покупки/продажи). Первый подход более прост в реализации, поэтому пока остановимся на нем. А бороться с быстрым изменением цены и неисполнением заявок будем заведомо более выгодными для рынка ценами, то есть в них будет изначально закладываться проскальзывание.

Шаг 1

Итак, стратегия и инструмент определены. Открываем редактор и начинаем писать код. Любая программа на Qpile должна содержать одну таблицу для вывода данных, как минимум, с одним столбцом. Для начала напишем код, состоящий всего из одного оператора. Он будет выводить в таблицу текущее время сервера (см. код «Время сервера»).

После того, как код написан, сохраняем файл с расширением *.qpl, затем в терминале Quik открываем пункт меню «Таблицы->Портфели->Задать портфель» (программы в Quik именуются портфелями) или нажимаем клавиши Ctrl+F10. Выбираем наш файл, кликаем на кнопке «Открыть», «Загрузить локально», а затем «Выход» (см. рис. 2).

Рис. 2 Пункты меню для загрузки и запуска программ Qpile

Программирование на языке qpile

Наша программа загружена! Все портфели в Quik работают в циклическом режиме с заданным периодом, который по умолчанию равен 10 секундам. Чтобы уменьшить его, необходимо сделать соответствующие настройки: открываем пункт меню «Таблицы->Портфели->Доступные портфели» (или Ctrl+F11), выбираем наш портфель и ставим период расчета 1 сек (это минимальное значение), после чего сохраняем изменения. Эту операцию не надо проводить каждый раз, установленное значение сохраняется для каждого загруженного портфеля отдельно. Чтобы запустить программу, в меню находим «Таблицы->Портфели->Просмотр портфеля» (или Ctrl+F12), выбираем наш портфель, а в «Доступных параметрах» — «Добавить все». После клика на кнопке «Да» программа начинает работать, и появляется наша таблица. Если в коде есть явные ошибки, будет выдано сообщение с их описанием и номером строки кода. Если ошибки не явные (например, логические), то сообщение может и не появиться, но данных в таблице не будет. В этом случае программу можно запустить в режиме отладки. Кликаем по нашей таблице правой кнопкой мыши и выбираем «Начать расчет в режиме отладки». По шагам можно отследить ход выполнения программы и значения переменных. Если код достаточно длинный, для отладки можно использовать функцию BREAKPOINT(), которая останавливает выполнение программы в заданной точке и запускает режим отладки. Если все сделано правильно, в нашем случае появится таблица с одним столбцом «TIME» и текущим временем сервера, к которому подключен терминал (см. рис. 3). Чтобы остановить программу, достаточно закрыть окно с таблицей.

Рис. 3 Программа, выводящая текущее время сервера

Программирование на языке qpile

Шаг 2

Теперь, когда первая программа заработала, начинаем ее усовершенствование: будем получать текущие цены спроса/предложения по выбранному инструменту, значения наших уровней, название инструмента и время до исполнения в днях. Все эти данные так- же выведем в таблицу (см. код «Инструмент»). Загрузим программу в Quik и запустим ее. Если все реализовано без ошибок, мы получим следующую таблицу (см. рис. 4).

Рис. 4 Вывод параметров инструмента в таблицу

Программирование на языке qpile

Программирование на языке qpile

У нас есть все необходимые данные, поэтому остается лишь сравнивать текущие цены с нашими уровнями. Если цена спроса выше верхнего уровня, это сигнал к про- даже, если предложение ниже нашего нижнего уровня, необходимо осуществить покупку. Оформим эту логику в коде (см. код «Сравнение», приведено только тело основной программы).

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

‘ ЕслиценаспросавышеуровняHI, надопродавать

IF PriceBid >= HiLevel SERVER_TIME =«SELL»

END IF

‘ Если цена спроса ниже уровня LOW, надо покупать

IF PriceOffer «OK»

DELETE_ALL_ITEMS()

output=CREATE_MAP()

output=SET_

VALUE(output,«TIME»,

ADD_ITEM(1,output)

RETURN

END IF

Сама функция для удобства восприятия будет располагаться в конце программы. Если функций много, их можно подключить через отдельный файл (см. Руководство пользователя Quik. Раздел 8).

Каждая функция оформляется следующим образом:

FUNC Control()

[Тело функции]

END FUNC

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

Отсутствие соединения с сервером. Для контроля коннекта существуетспециальный оператор IS_CONNECTED(), который возвращает «1», если соединение установлено:

IF IS_CONNECTED()<>1

Result = «ErrorConnection»

‘ Ошибка соединения с

сервером

TIMER=0

Return

ELSE

Result = «OK»

END IF

В случае потери соединения переменной TIMER присваиваем значение «0». Таким образом, после восстановления связи мы вновь включим задержку, чтобы терминал успел обновить данные.

Время торговой сессии. Основная торговая сессияна FORTS начинается в10:00 и заканчивается в23:50 мск, при этом имеетсядва перерыва на клиринг: дневной длится с 14:00 до14:03, а вечерний – с 18:45до 19:00 мск (до 19:10 в дниэкспирации опционов).Следовательно, программа должна работать поалгоритму, только когдаидут реальные торги, а востальное время она находится в режиме ожидания.Фрагмент программногокода, который проверяеттекущее время, представлен в справочной информации к статье.

Программирование на языке qpile

Главное – вовремя остановиться. Умениеостановиться вовремя ине торговать, когда уже до-пущено много ошибок, может сберечь значительнуюсумму любому трейдеру.Наделим этой способностью и нашего робота.Если размер счета станетменьше заранее заданногоуровня (в качестве примера зададим минимальныйуровень в 50 тыс. рублей), программа не будет открывать новые позиции.Тем самым наш счет будетзастрахован от полногоопустошения в случаебольшого количества убыточных сделок. Фрагменткода, который приводит костановке открытия новыхпозиций при достиженииопределенной величиныпросадки счета, представлен в справочной информации к статье.

Программирование на языке qpile

Гарантийное обеспечение (ГО). Если на счете недостаточно средств для ГО, при выставлении заявкитерминал выдаст сообщение об ошибке, и алгоритмостановится. Чтобы этогоизбежать, стоит заранееконтролировать наличиенеобходимых средств насчете. Поскольку величинаГО может изменяться, длянадежности будем ориентироваться на наличиесвободных денежныхсредств в двойном размере.Если средств недостаточно, программа выведет ошибкув таблицу и начнет выполнять пустые циклы:

Unit = 1 ‘ Количество

контрактов для одной

сделки

WARRANTY =0

+ GET_PARAM

(ClassCode,SecCode,

«BGONP») ‘ Размер

гарантийного обеспечения

IF AvailableMoney Рис. 1 Присваиваем идентификатор «скользящей средней»

Программирование на языке qpile

В теле программы зададим переменную с именем нашей скользящей средней, которая (переменная) будет автоматически создаваться из кода используемого инструмента (в нашем случае SRZ1). Это существенно упрощает настройку робота для другого контракта: достаточно поменять значение переменной SecCode для другого фьючерса и создать необходимые графики с соответствующим именем, и наш робот готов торговать другим инструментом.

EMA=SecCode&»_EMA» ‘

Название графика

Код функции чтения текущих значений индикатора приведен в справке.

Аргументом для этой функции будет имя графика (EMA), а выходным параметром — массив типа «коллекция», который содержит: в ячейке под номером 0 время текущей свечи, а в ячейках под номерами 1,2,3 и так далее значения линий графиков. В рассматриваемом примере технический индикатор «скользящая средняя» представляет собой одну линию, поэтому используется только ячейка под номером 1. Но есть индикаторы, состоящие из нескольких линий (ADX, MACD), в этом случае значения последних будут последовательно записываться в ячейки 1,2,3 и так далее. В теле программы обращение к функции осуществляется следующим образом:

‘ Получаем значение

скользящей средней

GRAFF = GRAF (EMA)

EmaExp =0+ GET_

COLLECTION_

ITEM(GRAFF,1)

В результате обращения переменная EmaExp будет содержать текущее значение «скользящей средней». Если график отсутствует или его имя не совпадает с переменной EMA, EmaExp равно 0, то есть наши уровни также окажутся нулевыми, а это приведет к ошибочным сигналам, так как цена спроса всегда будет больше 0. Также функция может возвращать нулевые значения в моменты формирования новой свечи. Многие технические индикаторы рассчитываются на основе уровней свечи (OPEN, HIGH, LOW, CLOSE), в том числе и «скользящая средняя», и мы можем наблюдать ситуацию, когда время новой свечи уже стало отсчитываться (например, 15 часов 10 минут и 03 секунды), но при этом не было проведено ни одной сделки. Поэтому новая свеча не начала формироваться (свечи рассчитываются на основе сделок), и в этот промежуток времени – от начала отсчета новой свечи до первой сделки – мы получим нулевое значение «скользящей средней».

Кроме того, при чтении значений технических индикаторов необходимо обращать внимание на текущее время. Дело в том, что в связке «терминал-сервер-биржа» присутствует три времени: компьютера, на котором установлен QUIK, сервера, к которому подключен терминал, и самой биржи. В идеале время на них должно совпадать, однако на практике это не всегда так. Время компьютера может существенно отличаться от серверного, поэтому важно, какое из них мы используем для обращения к графикам. Из-за разницы между ними можно получить значения разных свечей. Например, при расхождении в 5 секунд – 15ч10м03с и 15ч09м58с – для минутного графика имеем в первом случае свечу 151000, а во втором – 150900. Причем, если первой еще не существует, получим нулевое значение. В представленной выше функции для чтения значений графиков используется серверное время, однако в любом случае целесообразно минимизировать расхождение между компьютером и сервером. Это можно сделать, настроив синхронизацию часов компьютера с каким-либо NTP-сервером. Очевидно, когда мы получаем нулевое значение графика, производить расчеты нельзя, поэтому сделаем проверку значения индикатора на отличие от нуля.

Источник

Видео

Программирование на языке терминала QUIK (QPILE) Лекция №2

Программирование на языке терминала QUIK (QPILE) Лекция №2

Программирование на языке терминала QUIK (QPILE) Лекция №3

Программирование на языке терминала QUIK (QPILE) Лекция №3

Программирование на языке терминала QUIK (QPILE) Лекция №4

Программирование на языке терминала QUIK (QPILE) Лекция №4

Программирование на языке терминала QUIK QPILE Лекция №2

Программирование на языке терминала QUIK QPILE Лекция №2

Урок 7. Условия 1. Видеокурс по языку QPILE

Урок 7. Условия 1. Видеокурс по языку QPILE

Программирование на языке терминала QUIK QPILE Лекция №4

Программирование на языке терминала QUIK QPILE Лекция №4

Создаем свой ЯЗЫК ПРОГРАММИРОВАНИЯ. Лексер, Парсер, Абстрактное синтаксическое дерево (AST)

Создаем свой ЯЗЫК ПРОГРАММИРОВАНИЯ. Лексер, Парсер, Абстрактное синтаксическое дерево (AST)

Урок 2. Переменные. Торговый робот на QPILE для QUIK.

Урок 2.  Переменные.    Торговый робот на QPILE для QUIK.

Введение в "Практический курс QPILE" (7 занятий, примерно 10 часов)

Введение  в "Практический курс QPILE" (7 занятий, примерно 10 часов)

Урок 1. Торговый робот на QPILE для QUIK. Введение

Урок 1. Торговый робот на QPILE для QUIK. Введение
Поделиться или сохранить к себе:
Добавить комментарий

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