Главная > Торговый робот > Получаем данные из QUIK для торгового робота

Получаем данные из QUIK для торгового робота

19 марта 2009

part2logo2Второй этап из плана публикаций — двигаемся по графику.

Итак, в 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, и только при следующем запуске робота, можно будет получить свежие данные.

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

Евгений Торговый робот ,

  1. Саша
    22 Март 2009 в 19:20 | #1

    Отличный сайт! мне нравится!)))

    Есть вопрос, как отправлять заявки по полученным данным с графика? можно ли как нибудь обойтись без импорта транзакций и других *. tro *.tri и т.п. фалов??

  2. Евгений
    22 Март 2009 в 19:32 | #2

    Спасибо за оценку!

    С помощью QPILE можно отправлять транзакции непосредственно в QUIK, без всяких файлов. Это при условии, что весь расчет производится в QPILE.

  3. Сергей
    22 Март 2009 в 22:22 | #3

    Отличное описание. Давно хотел с qpile разбраться, а тут подробно и сжато всё в доступной форме. Мне нравится. Продолжайте в том же духе.

  4. Евгений
    22 Март 2009 в 22:24 | #4

    Спасибо!

    Дальше будет еще интереснее, заходите в гости почаще!

  5. Олег
    24 Март 2009 в 15:19 | #5

    Спасибо, вот чего не хватало, так это такого хорошего описания! :)

    Ждем робота! ):

  6. 2 Апрель 2009 в 03:19 | #6

    Эх... :) Вы бы знали что про Вас пишут в других блогах :)

  7. Евгений
    2 Апрель 2009 в 14:21 | #7

    Мне уже стало интересно, что же пишут:)

  8. 11 Апрель 2009 в 10:48 | #8

    Прикольный пост, очень интересно было почитать

  9. ZooR
    30 Март 2010 в 05:32 | #9

    С описанием сдесь всё отлично, а это самое главное для новичка!!!!!!!

  10. alegnom
    16 Июнь 2010 в 11:42 | #10

    Помогите пожалуйста, получение стоимости шага цены, например для фьючерса РТС (RIU0), я пишу следующую строчку:

    STEP = GET_VALUE (GET_PARAM_EX («SPBFUT», «RIU0» , «STEPPRICET»), «param_value») + 0

    Программа всегда возвращает значение 0, в чём ошибка?

    Евгений Reply:

    Привет.

    SEC_PRICE_STEP вместо STEPPRICET

    вот так напишите.

    alegnom Reply:

    Спасибо, SEC_PRICE_STEP не пробовал, но получилось с помощью замены GET_PARAM_EX на GET_PARAM. Ещё один вопрос не совсем может по теме, но связан с этой функцией: вы случайно не знайте где можно взять индикативный курс доллара который используетя для расчёта фьючерсов, например РТС? Он есть на сайте ртс но только на момент клирингов, а хотелось бы поподробнее.

    Евгений Reply:

    Да, для функции GET_PARAM параметр называется STEPPRICET, для функции GET_PARAM_EX параметр SEC_PRICE_STEP. НО! Первая это стоимость шага цены, а вторая — мнимальный шаг цены, обратите внимание.

    Что касается курса доллара — то лучше спросить об этом вашего брокера, у каждого разный набор неосновных инструментов.

  11. manfredman
    18 Июль 2010 в 12:33 | #11

    Здравствуйте Евгений !

    Подскажите что и где нужно исправить чтобы получить данные

    из 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:

    Привет.

    www.hirobot.ru/2010/04/ka...grafika-2-chast/

    Почитайте эту статью, там готовый код.

Необходимо войти на сайт, чтобы написать комментарий.