Сказ о реальном времени

10 июля, 2012

Начинающие роботостроители, да и не только, порою не задумываются над таким понятием , как «работа программы в реальном времени»

Вот этому моменту я и хочу посвятить данную заметку.

Что же такое «реальное время » для торгового робота.

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

Но в торговых роботах важным может оказаться  даже 0.01 секунды.

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

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

Если робот не успевает сделать все до поступления новой порции информации, то необработанная информация начинает накапливаться, а решения принимаются с возрастающим запаздыванием. Говорят, что  «после драки кулаками не машут», а робот именно это и начинает делать в таких случаях.

Подавляющее большинство мелких инвесторов предпочитают торговать фьючерсом на индекс РТС.

Действительно, выглядит заманчиво.

При депозите в 10 тысяч рублей, получаем плечо 1:10 и комиссию в 1.5 рубля на транзакцию.

Но проблема в том, что для успешной такой торговли вы должны построить  HFT робот, и  обеспечить скорость обработки информации менее 10 мс на сделку.

Но…

Во-первых, Операционная система Windows обеспечивает обслуживание прерываний с запаздыванием более 10 мс, а в реальности это запаздывание составит, по моим оценкам,  более 100 мс.

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

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

Т.е. если совершается 10 сделок в секунду, а у вас 10 акций в портфеле, то для обработки одной сделки у вас есть всего 10 мс.

Вы можете сказать: «Зачем так быстро обрабатывать информацию, если я совершаю 1 сделку в день?»

Но дело в том, что либо вы будете «махать руками после драки», либо вынуждены обрабатывать в реальном времени, чтобы максимально быстро реагировать на изменение ситуации на рынке.

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

Если вы начинаете пропускать информацию и обрабатывать ее выборочно, то в этом случае вы допускаете неконтролируемое изменение стоимости открытых позиций в пропускаемом интервале времени.

Чтобы обеспечить  успешную работу робота с пропуском данных, необходимо создавать прогнозирующие системы, что значительно сложнее систем HFT.

В прогнозирующих системах существенно возрастают затраты времени , так как алгоритмы таких систем учитывают большой объем информации.

В заключение, хочу заметить, что методы построения систем обработки данных в реальном времени имеют свои особенности.

Если кратко сказать, то в таких системах «дурным тоном» считается : использование циклов для обработки информации,  накапление первичных данных без обработки.

Но смею предположить, что именно то, что не рекомендуется в системах реального времени, большинство из вас и применяет.

 

Немного о QPILE

28 июня, 2012

Возникло желание развеять некоторые заблуждения и поделиться своим опытом программирования торговых стратегий и роботов.

Начну с языка программирования QPILE, интерпретатор которого встроен в QUIK.

При множестве недостатках интерпретатора, пожалуй это единственный способ реализации простых и надежных торговых роботов на основе торгового терминала QUIK.

Если не ставить нереальные задачи, типа создать HFT робот на основе торгового терминала QUIK,

то на QPILE можно реализовать практически любой торговый алгоритм.

На вопрос о том, какой самый хороший язык программирования, я отвечаю так:

«Хороший язык программирование тот, на котором Вы умеете мыслить.»

Если Вы не профессиональный программист, то хороший язык тот , который проще и отражает предметную область.

К сожалению, усердно продвигаемая Майкрософт среда NET и реализация в ней языка C#,  который является универсальным языком, т е не отражает предметную область, не есть панация от всех бед.

Да и абстрактные понятия объектно-ориентированного программирования не есть общеизвестное и легко усвояемое.

Думаю, что желающие создать торговый робот, не очень вдохновятся необходимостью изучать абстрактные понятия объектно-ориентированного программирования.

 Язык QPILE сравнительно простой и предметно ориентированный.

Поэтому на нем программа торгового  робота будет наиболее проста в реализации.

Что бы упростить написания программ на QPILE и сделать их более наглядными,

я добавил в QPILE макрокоманды и сделал для сборки загружаемого портфеля компилятор NKQPL.

         Программу любого торгового робота на QPILE можно записать следующим образом:

#pathLib C:\NK_QPILE  
#TITLE test; pobot 30.03.2012;
#INIT
  if INIT>0 AND LRT-LRT_OLD!=0
#FILT_TRADES
#FILT_OWN      
#FILT_OSO      
#SET_OWN      
  end if
#OWN                                                              

Символ #  указывает на то, что далее за ним следует макрокоманда.

Поясню, что означает каждая из строк данной программы

pathLib C:\NK_QPILE   — определяем  путь к каталогу библиотеки функций.

Т е  в данном случае, вы разрабатываете или получаете от  других разработчиков различные функции и помещаете их в указанный каталог.

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

TITLE test; pobot 30.03.2012  — описание (test)  и название программы (pobot 30.03.2012)

INIT — инициализация переменных, загрузка из файла параметров клиента и торгуемых инструментов

if INIT>0 AND LRT-LRT_OLD!=0  — условие исполнения основного тела программы

FILT_TRADES   обработка таблицы сделок,  результат обработки сохраняется в файле истории позиции

FILT_OWN     обработка   программируемой  таблицы , которая содержит информацио о торгуемых инструментах, открытых позициях

FILT_OSO       обработка таблицы ордеров и стоп-ордеров, управление стопами

SET_OWN      запись  параметров позиции в программируемую таблицу

OWN             описание программируемой таблицы

~~~~~~~~~~~~~~~~~~~~~~~~~

Хочу показать  как элегантно пишутся торговые команды выставления заявок  в моей реализации макро QPILE.

Команда stop-loss и take-profit:

#STOP_LOSS_PROFIT   trz; PRICE; Q; STOPPROFIT; OFFSET; STOPLOSS; AFT; ATT; NUMBER

В результате в переменной NUMBER мы получим номер выставленного стоп ордера.

а вот так отменить стоп ордер под номером NUNBER

 #KILL_STOP_ORDER   NUMBER; SECCODE; CLASSCODE

команда «купить»:

#BUY   trz;PRICE; Q; SECCODE; CLASSCODE; NUMBER

команда «продать»:

#SELL   trz;PRICE; Q; SECCODE; CLASSCODE; NUMBER

Все просто и наглядно.

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