d9e5a92d

Юрий Решетников - Реализация механических торговых систем с помощью торговых автоматов



Особенности программы технического анализа OmegaResearch Prosuite2000i


Тему автоматической торговли я хотел бы продолжить и предложить уже готовые решения для торговой платформы NetInvestor, которая сопряжена с программой технического анализа TradeStation. Хотелось бы рассказать, как это взаимодействует и какие подводные камни могут возникнуть при применении этого API непосредственно с самой TradeStation.

Предположим, что у вас есть стратегия и вы знаете, как и по каким алгоритмам, каким признакам она работает и выдает сигналы на покупку/продажу и то, что она написана на встроенном языке EasyLanguage – встроенном языке TradeStation. Я считаю, что Omega или TradeStation - это одно и тоже.

Какие функции при реализации автотрейдинга хотелось бы иметь и какие функции нужны? Когда вы используете программу интернет-платформы Quik или NetInvestor, вы видите свое состояние портфеля, т.е. наличие денежных средств, наличие бумаг, текущую оценку портфеля, выставленные заявки или которые вы сняли, сделки, которые вы исполнили. Точно таким набором функций обладает автомат.

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

Вопрос из зала:

Можно ли получить исторические данные о состоянии портфеля.

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

Каким образом это реализовано? TradeStation имеет возможность работать с внешними приложениями – DLL. Многие знают, что такое TradeStation? Надеюсь, что да. Что позволяет данная схема реализации? Фактически сам NetInvestor для этой схемы не нужен, нужен он-лайн-поток котировок GlobalServer – это сервер накопления котировок о текущем состоянии, что происходит на рынке - и TradeStation сама, автоматически при помощи DLL соединяется таким же способом, как и NetInvestor.

ОПИСАНИЕ СХЕМЫ

Со стороны брокера тот, где написано сервер, между этими двумя стрелочками имеется ввиду, что это соединение по интернет. То, что обведено пунктирной линией, это TradeStation.


Юрий Решетников - Реализация механических торговых систем с помощью торговых автоматов




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

Видеть текущее состояние наглядно можно видеть 2-мя способами. Первый – вы можете подключить еще один NetInvestor, анализируя этот счет и визуально видеть, какие заявки были выполнены, какие сняты, и соответственно, всю историю за текущий день. Второй – просматривать эту информацию непосредственно в Omega, в виде графической информации.


Хочу подробнее рассказать о функциях, которые доступны из Omega при работе с DLL.

Красным выделены функции, черным - описание. Я буду делать акцент именно на функциях.


Описание функций DLL

  • defineDLLFunc: "d:\niordcover.dll", int, "conn",lpstr,int,lpstr,lpstr,lpstr,lpstr,int;
соединение с сервером. Omega автоматически устанавливает соединение с сервером и получается, что не NetInvestor подсоединен к серверу, а именно TradeStation

  • defineDLLFunc: "d:\niordcover.dll", int, "init", lpstr;.
  • defineDLLFunc: "d:\niordcover.dll", int, "disconn";
рассоединение с сервером - дисконнект


  • defineDLLFunc: "d:\niordcover.dll", int, "is_conn";
проверка соединения с сервером. В данный момент, если соединения с сервером нет, то она возвращает 0. Система, проверяет, что соединения с сервером нет и выполнение операций на выставление заявок и пр. невозможно.

  • defineDLLFunc: "d:\niordcover.dll",
  • int, "order",lpstr,lpstr,lpstr,lpstr,lpstr,lpstr,lpstr,double,int,lpstr,lpstr,lpstr,int;
- выставление заявки. Более подробно мы рассмотрим эту функцию чуть позже. Дело в том, что выставление заявки может происходить на различных рынках, как на ФОРТСе, сгк так и на ММВБ, и я покажу список всех заявок, которые могут автоматически выставляться в системе NetInvestor , непосредственно на торговый сервер.

  • defineDLLFunc: "d:\niordcover.dll",
  • double, "get_current_portfolio",LPSTR,LPSTR, LPSTR,LPSTR,int,int;
– получение информации о текущем состоянии портфеля по каждому клиенту.

  • defineDLLFunc: "d:\niordcover.dll",
  • int, "orders_open",LPSTR, LPSTR, LPSTR,int;defineDLLFunc: "d:\niordcover.dll",
открытие соединения – получение информации о текущих заявках, которые выставлены в систему.

  • lpstr, "get_order_code",lpstr,lpstr,lpstr,lpstr,double,int,int,int;
  • defineDLLFunc: "d:\niordcover.dll",
  • int,"wd_order_by_number",LPSTR{orderno},LPSTR {secboard},int {TimeOut};
снятие заявки по номеру по сигналу из Omega

  • defineDLLFunc: "d:\niordcover.dll",
  • int, "portfolio_open",LPSTR {secboard},LPSTR {account}, LPSTR {brokerref},int {TimeOut};
открытие соединения – получение о текущем состоянии портфеля по каждому клиенту.


Рассмотрим код, который пишется в Omega, для проверки соединения с сервером и восстановление соединения в случае разрыва.

Если функция is_conn=1 (подтверждение о разрыве соединения), то повторяются попытки соединения с сервером, в коде прописаны адрес сервера, логин, пароль и при очередной удачной попытке вы автоматически соединяетесь с этим сервером и Omega продолжает функционировать дальше.


Пример проверки и установки соединения с торговым сервером


result = is_conn();


if LastBarOnChart and result=0 then


Begin

output_init = init("D:\\mfcniorder.dll");

output_conn = conn("213.181.10.183",2900,login,login,login,"netinvestor",LogMsg);

output_orders_open=orders_open(secboard,account,brokerref,TimeOut);

out_portfolio_open=portfolio_open(secboard,account,brokerref,TimeOut);

fileappend("D:\conn.txt","conn;"+NumToStr(time,0)+";"+brokerref+"; init="+NumToStr(output_init,0)+"; output_conn="

+NumToStr(output_conn,0)+"; output_orders_open="+NumToStr(output_orders_open,0)+"; out_portfolio_open="+NumToStr(out_portfolio_open,0)+NewLine);

end;


Реплика из зала:

Должен ли быть включен NetInvestor при использовании автомата?

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

Реплика из зала:

Сколько стоит автомат?

Она стоит символически - 50$. Это разовая покупка.

Реплика из зала:

Что делать если произошел разрыв связи и как восстановить авто-режим.

У меня компьютер находится во внутренней локальной сети, поэтому у меня разрывов практически не бывает. Но если это произошло, то в Omega есть 2 режима. Первый - включить режим, когда все котировки выставляются в один бар, есть разрыв связи. Такой режим включен по умолчанию. Если произошел разрыв связи Omega докачивает данные в один бар. Второй- если у вас отключено внутреннее время глобал-сервера, то у вас по прошествии этого сигнала бар нарисуется, закроется и заявка выйдет из системы.

Реплика из зала:

Значит автомат не полностью автоматизирован, если так сильно зависит от интернета.

Отвечу вопросом на вопрос: что вы сделаете, в таком случае при торговле в ручном режиме в случае разрыва связи? К сожалению, я не ваш провайдер, и не могу отвечать за качество связи.

Реплика из зала:

Что рекомендуете для устранения подобных пробелов?

В этом зале сидят два наших клиента. Я советую делать следующее: поставить компьютер нам в компанию непосредственно в локальную сеть, дабы избежать любых неприятностей. Это был бы самый идеальный вариант.


Конкретный пример выставления заявки в систему с определенными параметрами. Как вы видите, здесь описаны все те параметры, которые существуют непосредственно при вводе заявки вручную. Это направление, счет клиента, код инструмента, цена, количество, расщепление остатка и т.д.


Пример выставления заявки


orders=order (account,

buysell, {buy-B, sell-S}

mktlimit, {mktlimit} {Market-M, Limit-L}

splitflag, {splitflag} {O- OnePrise, S-...Price}

immcancel, {immcancel} {'Probel',N,W}

secboard, {LPSTR} {secboard="EQBR"}

seccode, {seccode="EESR"}

price, {price}

quantity, {quantity=lot}

brokerref, {brokerref} {kl/}

extref, {extref}

yeld, {P}

timeout); {TimeOut servera}



Какие параметры я вывожу непосредственно сам, когда использую автомат? Счет – L01 – клиентский счет, S01 – брокерский счет. Логин, который в пример я не включил из соображений безопасности, brokerref – это счет клиента и все остальные параметры – рынок и т.д.


Юрий Решетников - Реализация механических торговых систем с помощью торговых автоматов




Рассмотрим технические характеристики и быстродействие.


Скорость выставления заявки. Если кто-то работал с алертами в Omega, знает, что при наступлении события появляется информационное окно. Могу сказать, что это окно с алертом появляется позже, чем заявка в системе. Т.е. сначала заявка появляется в NetInvestor, я ее вижу, а потом уже ко мне поступает алерт этого события. Т.е. скорость выставления можно даже посмотреть. Я специально вывел несколько счетов - автомат работает с несколькими счетами – на рисунке это заметно, – обратите внимание на время исполнения заявки.

Юрий Решетников - Реализация механических торговых систем с помощью торговых автоматов




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


Для отображения и видения состояние портфеля я использую индикатор. Красным отмечено состояние в рублях, синим – состояние портфеля, если short – это отрицательное значение, черным – получается текущее состояние переоценки. Если в портфеле что-то куплено, то сумма портфеля переоценивается по текущей цене. Считается остаток в рублях, количество в акциях, умножается и получается текущая оценка.


Практические примеры использования DLL и программы ТА OmegaResearch Prosuite2000i

Визуальный контроль и графическое отображение состояния портфеля

Юрий Решетников - Реализация механических торговых систем с помощью торговых автоматов




Недостатки и преимущества торговой платформы OmegaResearch Prosuite2000i

А теперь о подводных камнях. Как уже сказал Влад, самая интересная и самая оптимальная программа для автотрейдинга – это TradeStation, другой я пока не знаю. К сожалению MetaStock не подходит, потому что получить и рассчитать каким количеством лотов торговать в нем не представляется возможным. В MetaStock вообще нельзя заложить любые внутренние переменные. Он только выдает иUформацию, получать вовнутрь он ее не может, кроме текущих он-лайн котировок.


Работать по проблеме автотрейдинга я начал года 3 назад. Начал с Quik и TradeStation. Текстовый файл формировался в TradeStation и предавался в Quik. В силу того, что у текстового файла есть некоторые ограничения, я отказался от текстовых файлов и перешел к вышеупомянутой системе.

1. MarketPosition использовать нельзя, т.е. этот код пишется как индикатор, не как сигнал. MarketPosition нельзя использовать, потому что он меняет свое значение не на том баре, на котором произошел сигнал, а через один.


2. При реализации вашей стратегии, в зависимости от того, как вы хотите покупать – по закрытию бара или на текущем баре – вам соответственно нужно ставить функцию Barstatus. Приравнивать к 2 или 1. 2 - по закрытию бара, 1 – в онлайне, но хочу обратить внимание: когда это в онлайне, в текущем баре, сигнал может наступить несколько раз, поэтому нужно использовать внутренний триггер, т.е. заявка вышла, присваивается некое значение некой переменной и больше заявка в систему не выходит, либо при запросе портфеля анализируем его текущее состояние.


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


3. Использование функции LastBarOnChart. Первое время при тестировании я не использовал LastBarOnChart. При тестировании я подключал систему после 18:45, у меня в систему выскочило более 1,5 тысяч заявок. Все они были отклонены и не исполнены.


4. Функция BarInterval – если вы свою стратегию используете на каком-то временном интервале, например, 5-минутке или 30-минутке, то используете ее, потому что если вы переключите на другой период, то система также будет продолжать функционировать, но на другом периоде станет убыточной. Или, по крайней мере, будет выполнять не то, что вам нужно.


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


А теперь о хорошем.

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

Данная реализация, как уже говорил Влад Горбунов, это и есть API, которая фактически работает с неограниченным количеством счетов по клиентам, выполняет фактически любые заявки, которые вы запрограммируете. Все, что вы делаете руками в NetInvestor, все тоже самое может сделать автомат, только скорость значительно быстрее. Если у вас, к примеру, в управлении счетов более 3-4-х, то на выставление заявки и подсчету количества лотов у вас уйдет довольно много времени, если выставлять их вручную. Здесь это произойдет буквально за доли секунды.


В общих словах все, я готов ответить на вопросы. Бурные, продолжительные аплодисменты.


Вопрос:

Дальнейшее развитие TradeStation

Ответ:

На самом деле, я не вижу в этом проблемы, она у меня очень хорошо работает, буду использовать ее, пока не найду что-либо другое. Но чего-то более лучшего на текущий момент я не вижу. Хотел бы сказать в продолжение, что пока у API у нет интерфейса, официально мы не предоставляем с интерфейсом, но он уже в разработке и вы сможете визуально наблюдать непосредственно управляемые счета, выставлять лимиты на бумаги, на портфель в процентах, в абсолютной величине, по каждому конкретному клиенту и, соответственно, выставлять заявку не в абсолютном значении, а в процентах, т.е. если вы выставляете одну заявку по группе счетов, по, допустим, 8 или 50 счетов, выставляете одну заявку, определяя, что это вот такая группа счетов и выставляете 30%, соответственно, машина сама посчитает, что у одного 20 лотов, у другого 30, у третьего 55.



Содержание раздела