Получаем данные из QUIK для торгового робота
Второй этап из плана публикаций — двигаемся по графику.
Итак, в QPILE существуют следующие типы данных (пример):
STRING — строковый: «Профит» (кавычки именно такие);
DOUBLE — число с плавающей точкой: 500,45;
COLLECTION -коллекция — список объектов, с индексацией по целочисленному ключу, начиная с нуля;
MAP — ассоциативный массив – последовательность данных, идентифицирующихся по значению и ключу.
Любой переменной можно присвоить любой из вышеперечисленных типов данных.
Строковые данные, применяются для идентификации переменных и значений из таблиц:
INSTRUMENT=”RIM9”, в этом случае мы присваиваем переменной INSTRUMENT строковое значение RIM9.
MESSAGE (INSTRUMENT,1) , после выполнения этой инструкции QUIK откроет окно сообщений со значением переменной INSTRUMENT. Казалось бы, что даже написание названия переменной в нашем случае длиннее, чем значение, так почему бы не писать в коде просто значение? Ответ прост, есть роботы, да и мы будем такие создавать, где торговля происходит по одному, выбранному нами заранее, инструменту. А в коде будет мест десять, где нам потребуется сравнить его буквенное значение, и при переходе на иной инструмент, нам придется менять во всех десяти местах его написание, а при обозначении переменной в начале программы – всего один раз.
Число с плавающей точкой, здесь все просто:
MOOVING1=9
MOOVING2=14
MULTIPLER=3,14
Здесь мы присвоили переменным целочисленные значения, которые потом будем использовать в расчетах, например:
A= (MOOVING1+ MOOVING2)* MULTIPLER/100
Действия в скобках выполняются первыми, все как в школе.
В процессе выполнения программ, мы можем динамически менять тип этих двух переменных, например:
KOEF=”3,14” – строковая (кавычки!), а если мы совершим математическое действие с ней. То получим число:
A= KOEF+0 – в результате, переменная А = числу 3,14, и наоборот, если нам необходимо число превратить в строку, нам надо объединить, используя символ &, ее либо с пустой строкой, либо с текстом:
В=А&”” либо В=“Коэффициент” &А
в результате получим текстовую строку «Коэффициент 3.14»
Сделано это для большей универсальности, но есть небольшой минус: при получении из таблиц цифровых данных, необходимо из складывать с нулем (либо производить любое другое простое математическое действие с числом), чтоб на выходе получить действительно цифру. Так мы делали в нашем первом роботе, когда получали цену из таблицы всех сделок: PRICE=GET_VALUE (GET_ITEM («ALL_TRADES», I), «PRICE»)+0. Поэтому, если Ваш робот при запуске будет ругаться на то, что Вы пытаетесь сравнить разные типы данных, в первую очередь смотрите, куда добавить «плюс ноль».
Едем дальше – Коллекции и Мапы. Подробно и прекрасно они описаны в «Руководстве пользователя QPILE» копипастить их сюда смысла нет – мы их разберем подробнее, когда при создании робота «Пробойный» доберемся до их использования.
Теперь самое важное — Функции для обращения к строкам произвольных таблиц QUIK. Для правильно функционирования автономного робота нам просто как воздух необходима следующая информация:
- Текущий баланс – для расчета позиции;
- Текущая чистая позиция – для оценки ситуации;
- Текущее значение ГО – в случае операция на ФОРТС, тоже нужно для расчета позиции;
- Цена нашего инструмента;
- Доход/убыток, как сумма вармаржи и накопленного дохода — понятно для чего;
- Дата;
- Время;
Это только начальные параметры, в последствии нам потребуется еще гораздо больше. Все эти параметры должны быть получены из QUIK, при каждом исполнении программы (мы помним что это минимум 1 раз в секунду), для правдивой и точной оценки ситуации. Все они берутся из разных мест, рассмотрим все по порядку (ФОРТС):
Текущий баланс берется из таблицы «Ограничения по клиентским счетам» из поля «Лимит открытых позиций» из строки №1 (варьируется в зависимости от брокера) функция:
MoneyCurrentBalance = GET_VALUE (GET_ITEM («FUTURES_CLIENT_LIMITS»,1), «CBPLIMIT»)
Если разобрать написанное своими словами получим «получить значение CBPLIMIT из строки номер 1 таблицы FUTURES_CLIENT_LIMITS.
Описание названий таблиц и доступных параметров дано в руководстве QPILE в разделе 8.9.3
Текущая чистая позиция:
TP=GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS»,1), «TOTAL_NET»)
Текущее значение ГО. Тут немного иначе, т.к. ГО доступно в Таблице текущих значений параметров, функция немного иная:
GO=GET_VALUE (GET_PARAM_EX («SPBFUT»,Instrument,"selldepo"),"param_value")
Цена:
Price=GET_VALUE (GET_PARAM_EX («SPBFUT»,Instrument,"last"),"param_value")
Доход/убыток:
Profit=GET_VALUE (GET_ITEM («FUTURES_CLIENT_LIMITS»,1), «VARMARGIN»)+GET_VALUE (GET_ITEM («FUTURES_CLIENT_LIMITS»,1), «ACCRUEDINT»)
Что мы забыли? Правильно! Ко всем полученным численным данным прибавить ноль!
Также, следует заметить, что при создании торгового робота, данные нужно получать один раз, например текущая чистая позиция, в процессе выполнения программы робота, не изменится, и что бы не происходило в QUIK, и только при следующем запуске робота, можно будет получить свежие данные.
В следующей статье, в рубрике «Торговый робот» мы обсудим алгоритм робота по торговой стратегии «Пробойная», а затем продолжим его создавать. Все что мы обсудили сегодня нам пригодится.
Отличный сайт! мне нравится!)))
Есть вопрос, как отправлять заявки по полученным данным с графика? можно ли как нибудь обойтись без импорта транзакций и других *. tro *.tri и т.п. фалов??
Спасибо за оценку!
С помощью QPILE можно отправлять транзакции непосредственно в QUIK, без всяких файлов. Это при условии, что весь расчет производится в QPILE.
Отличное описание. Давно хотел с qpile разбраться, а тут подробно и сжато всё в доступной форме. Мне нравится. Продолжайте в том же духе.
Спасибо!
Дальше будет еще интереснее, заходите в гости почаще!
Спасибо, вот чего не хватало, так это такого хорошего описания!
Ждем робота! ):
Эх...
Вы бы знали что про Вас пишут в других блогах
Мне уже стало интересно, что же пишут:)
Прикольный пост, очень интересно было почитать
С описанием сдесь всё отлично, а это самое главное для новичка!!!!!!!
Помогите пожалуйста, получение стоимости шага цены, например для фьючерса РТС (RIU0), я пишу следующую строчку:
STEP = GET_VALUE (GET_PARAM_EX («SPBFUT», «RIU0» , «STEPPRICET»), «param_value») + 0
Программа всегда возвращает значение 0, в чём ошибка?
Евгений Reply:
июня 16, 2010 at 14:12
Привет.
SEC_PRICE_STEP вместо STEPPRICET
вот так напишите.
alegnom Reply:
июня 16, 2010 at 19:54
Спасибо, SEC_PRICE_STEP не пробовал, но получилось с помощью замены GET_PARAM_EX на GET_PARAM. Ещё один вопрос не совсем может по теме, но связан с этой функцией: вы случайно не знайте где можно взять индикативный курс доллара который используетя для расчёта фьючерсов, например РТС? Он есть на сайте ртс но только на момент клирингов, а хотелось бы поподробнее.
Евгений Reply:
июня 16, 2010 at 20:17
Да, для функции GET_PARAM параметр называется STEPPRICET, для функции GET_PARAM_EX параметр SEC_PRICE_STEP. НО! Первая это стоимость шага цены, а вторая — мнимальный шаг цены, обратите внимание.
Что касается курса доллара — то лучше спросить об этом вашего брокера, у каждого разный набор неосновных инструментов.
Здравствуйте Евгений !
Подскажите что и где нужно исправить чтобы получить данные
из 4-х часового таймфрейма ...
CandleCount=0
CurYear=get_value (GET_DATETIME (), «YEAR»)
CurMonth=get_value (GET_DATETIME (), «MONTH»)
CurDay=get_value (GET_DATETIME (), «DAY»)
CurHour = GET_VALUE (GET_DATETIME (), «Hour»)
CurMin = GET_VALUE (GET_DATETIME (), «Min»)
CurMin = Interval*Floor (CurMin/Interval)
for i from 1 to (DayToFind*24)*(Floor (60/Interval)) TextData=fTextData (CurYear,CurMonth,CurDay) &""
TextTime=fTextTime (CurHour,CurMin) & ""
if (CandleCount0)
CandleCount=CandleCount+1
High=GET_VALUE (Candle, «High»)+0
Low=GET_VALUE (Candle, «Low»)+0
Close=GET_VALUE (Candle, «Close»)+0
Евгений Reply:
июля 18, 2010 at 18:11
Привет.
www.hirobot.ru/2010/04/ka...grafika-2-chast/
Почитайте эту статью, там готовый код.