Заметка

OLE ИНТЕРФЕЙС К ТАБЛИЦАМ QUIK

  0  

OLE ИНТЕРФЕЙС К ТАБЛИЦАМ QUIK

Как получить во внешней программе, написанной,к примеру, на языке С++, содержимое таблиц рабочего места quik? Алгоритм вроде очевиден. Создаём таблицы вручную, добавляем в них все инструменты и все параметры, которые могут понадобиться роботу. Настраиваем экспорт по DDE и в своей программе создаём DDE сервер. Либо экспортируем данные протоколом ODBC в какую-нибудь базу данных и учим программу с этой базой работать. При этом постоянно что-то не складывается, отсоединяется, лапы ноют и хвост отваливается... При рестарте терминала нужно каждый раз руками или программно инициировать старт экспорта. Не забывать добавлять вручную в таблицу текущих параметров каждый раз новые фьючерсы после экспирации старых. В общем, насколько бы ни был качественно написан сам алгоритм, удобство и надежность робота оставляют желать много лучшего из-за "удобств", предлагаемым самим терминалом.

Мне все танцы с бубном основательно осточертели. Да и не мне одному.

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

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


Запускаем скрипт. Один раз. При запуске терминала после выключения скрипт будет автоматически продолжать работу.

Теперь из внешней программы можно инициировать создание любой таблицы quik и читать ее как любой com-объект.

Как это выглядит во внешней программе?

Для наглядности будем использовать какой-нибудь простенький язык. Например, мою любимый для такого рода целей autoit. Ровно то же самое можно сделать и на С++, и на дельфи, и на Visual Basic. Да и вообще на любом языке, поддерживающем OLE-технологию. А других, считай, и не существует Улыбаюсь.

В качестве COM сервера возьмем старый добрый AmiSharp. Можно использовать и Excel, но старичок страдает ожирением и слишком задумчив.

Сначала подключимся к нему.

$amisharp = ObjCreate("Amisharp.Mutant")
$cmd = "<LuaSharp Command Table>"

AmiSharp автоматически запустится. Сформируем приказ на создание, скажем, таблицы заявок: 

;~ Создаем таблицу заявок
$line = 1
$amisharp.SetCell($cmd,0,$line,"Create")
$amisharp.SetCell($cmd,1,$line,"Orders")


Создастся таблица с информацией о сделках:

В таблице присутствуют все поля, описывающие заявки. Теперь в любой момент любую ячейку этой таблицы можно прочитать, используя метод GetCellName() и получить желаемую информацию.

Содержимое таблицы изменяется синхронно с обновлением в терминале информации о заявках: новые заявки дописываются, измененные меняют свои поля.

Аналогично заказывается создание таблицы сделок, стоп-ордеров и прочих. 

;~ Создаем таблицу сделок
$line = $line+1
$amisharp.SetCell($cmd,0,$line,"Create")
$amisharp.SetCell($cmd,1,$line,"Trades") ; Таблица сделок

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

;~ Таблица текущих параметров — параметр last для LKOH/QJSIM
$line = $line+1
$amisharp.SetCell($cmd,0,$line,"Create")
$amisharp.SetCell($cmd,1,$line,"TTP") ; ТТП
$amisharp.SetCell($cmd,2,$line,"QJSIM") ; Класс
$amisharp.SetCell($cmd,3,$line,"LKOH") ; Код инструмента
$amisharp.SetCell($cmd,4,$line,"last") ; Параметр
;~ Таблица текущих параметров — параметр bid для RIM4
$line = $line+1
$amisharp.SetCell($cmd,0,$line,"Create")
$amisharp.SetCell($cmd,1,$line,"TTP")
$amisharp.SetCell($cmd,2,$line,"SPBFUT")
$amisharp.SetCell($cmd,3,$line,"RIM4")
$amisharp.SetCell($cmd,4,$line,"bid")

 

Ну и в качестве бонуса можно выполнить функцию (да и просто любой текст) на lua

$line = $line+1
$amisharp.SetCell($cmd,0,$line,"ASK")
$amisharp.SetCell($cmd,1,$line,"getClassesList()")

Получим результат, который вернет функций getClassesList(). Можно попросить исполнить не только одну функцию, а вообще произвольный код и получить результат исполнения. С некоторой осторожностью можно даже запустить другой скрипт lua. Дразнюсь

При необходимости можно от любой таблицы отказаться. При этом таблица исчезнет. При отказе от ТТП скрипт отпишется у брокера от ВСЕХ заказанных параметров.

$line = $line+1
$amisharp.SetCell($cmd,0,$line,"Delete")
$amisharp.SetCell($cmd,1,$line,"Orders")
$line = $line+1
$amisharp.SetCell($cmd,0,$line,"Delete")
$amisharp.SetCell($cmd,1,$line,"Stop_Orders")
$line = $line+1
$amisharp.SetCell($cmd,0,$line,"Delete")
$amisharp.SetCell($cmd,1,$line,"Trades")
$line = $line+1
$amisharp.SetCell($cmd,0,$line,"Delete")
$amisharp.SetCell($cmd,1,$line,"TTP")

 


ЧТО В СУХОМ ОСТАТКЕ?

  1. Не требуется городить никаких DDE серверов в тексте внешних программ
  2. Нет больше проблем с настройкой руками требуемых таблиц терминала
  3. Нет проблем с включением/отключением DDE экспорта
  4. Не нужно обращать внимание на наличие и доступность требуемых данных — скрипт закажет все сам
  5. Никогда не отключается экспорт
  6. Параллельно запущенные роботы могут использовать одни и те же таблицы
  7. Нет никаких сложностей с экспортом данных из нескольких терминалов одновременно
  8. Никаких задержек, неотличимое от нуля потребление ресурсов процессора

 Источник: www.bot4sale.ru

Комментарии

Написать комментарий

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

Написать администратору