Алгоритм v1.0
Atom
12/18/2011
ingeniero


Приветствую участников форума.

В первую очередь хочу поблагодарить создателя проекта Stock#, Михаила Сухова.
Я считаю, что Stock# – достаточно успешный стартап, который объединяет прогрессивно мыслящих трейдеров и, безусловно, является частью МФЦ:)

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

Начнем с блок-схемы, описывающей основные элементы системы.
1. Выбор источника данных.
В качестве источника данных может выступать торговый терминал (Quik, Альфа-Директ, SmartCOM) или шлюз Plaza2.
2. Проверка работы источника данных
В случае проблем с подключением выдает сообщение об ошибке и предлагает выбрать другой источник данных.
3. Выбор стратегии
Предоставляет возможность тестировать несколько стратегий в одной оболочке. Например, торговля волатильностью, торговля спредами, арбитраж.
4. Грааль
Основной элемент системы. Рассчитывает оптимальные параметры для совершения торговых операций.
5. Проверка сигналов на сделку
Решение о сделке принимается на основании получаемых данных. В случае если соблюдается условие, необходимое для совершения сделки, программа переходит к этапу отправки заявки.
На этом этапе предусматривается возможность изменять параметры для принятия решения. Например, менять значение волатильности или стоимости спреда -n страйков от центра.
6. Отправка заявки
Программа отправляет заявку в торговый терминал или шлюз. Если от биржи приходит ответ о выставлении заявки, сообщает об этом пользователю. Если возвращает ошибку или не приходит ответ, сообщает пользователю об ошибке и пытается отправить заявку повторно.
Здесь можно настроить время или количество попыток для отправки заявки.
7. Проверка активных заявок
Этот элемент проверяет, исполнилась ли заявка. В случае исполнения заявки и ответа от биржи сообщает пользователю о сделке.
8. Изменение заявки
Если заявка не исполнилась, предлагает изменить цену.
Бывают такие ситуации, когда мы согласны на исполнение по худшей цене. Можно ввести условие, например, увеличивать цену на 15 пунктов, если заявка не исполняется в течение 5 секунд.
Или исполнить по рынку, если заявка висит больше 15 секунд. При этом алгоритм перейдет в п.6 (Отправка заявки). Программа также сообщает пользователю о снятии первоначальной заявки.

Буду признателен за конструктивную критику и рацпредложения.


Алексей



Tags:


Thanks:


freelancer

Avatar
Date: 12/18/2011
Reply


Примерно так, да. Если учесть, что существуют правила, то многое реализуется очень просто.
У меня заявка кидается просто по рынку, что гарантирует её исполнение в 99% случаях (пускай даже с большим проскальзыванием)
Thanks:

ingeniero

Avatar
Date: 1/15/2012
Reply


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

Основное окно

Просто и со вкусом:)

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

Все элементы управления доступны через меню, которое включает в себя вкладки: Торговля, Настройки, Окна.

Вкладка Торговля содержит следующие пункты


При выборе пункта «Установить соединение» программа подключается к коннектору по умолчанию. Информация об инициализации соединения отображается в окне логов.
После удачного соединения этот пункт становится неактивным, при этом активируется пункт «Запуск робота».
Соответственно, до установки соединения пункты «Разорвать соединение», «Запуск робота», «Остановка робота» неактивны.

Вкладка Настройки


Каждый элемент вызывает окно для настройки соответствующих параметров.
Окно также будет содержать вкладки для перехода к другим пунктам меню Настройки.

Источник данных: выбор коннектора, проверка работы (аналог Verifier), возможность подключения нескольких коннекторов.
Кстати, возможна ли в S# одновременная работа с несколькими источниками данных, например, с Quik и Plaza2?

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

Контроль рисков: рабочий сайз (% от счета, количество контрактов), максимальная просадка за определенный период, максимальный убыток на сделку, защита от технических сбоев:)

Управление временем: включение/выключение по расписанию. Наверно, здесь же: период для автоматического восстановления связи, период для проверки связи с сервером. Возможно, период для хранения информации о заявках, сделках.

Вкладка Окна


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

Деньги: аналог «Ограничений по клиентским счетам». Можно добавить прибыль в процентах, прибыль за определенный период. Максимальная прибыль/убыток на сделку, максимальная просадка в рублях, процентах. Здесь же: возможность построить графики эквити и просадок за выбранный период.

Логи: вся информация о работе программы с указанием времени, типа и состояния операции.

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

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

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

Графики.
Сначала хотел вынести в отдельный пункт и, возможно, так и сделаю в перспективе.

График: текущий график позиции.
Как будет выглядеть портфель при торговле волатильностью, более-менее представляю, а вот при арбитраже будем смотреть на горизонтальную прямую:)
Также необходимо наверно добавить график БА для удобства.

Модель: аналог опционного аналитика. Нормально там все реализовано, кроме календарей, конечно.

Улыбка: улыбка 2D и 3D. Графики за выбранный период. История по определенному страйку.

Смотрю на это описание и думаю: не получится нормального робота, так хоть софт для торговли будет удобный:)
Весит приложение 12 КБ, при этом кушает уже 12 МБ. Майкрософт..


Code
<Window x:Class="robot.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Робот 1.0" Height="250" Width="400">
    
    <Grid Margin="1" Background="LightGray">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="30*"/>
            <RowDefinition Height="70*"/>
        </Grid.RowDefinitions>

        <Menu Grid.Row="0">
        <MenuItem Header="Торговля">
            <MenuItem Header="Установить соединение"></MenuItem>
            <MenuItem Header="Разорвать соединение"></MenuItem>
            <Separator></Separator>
            <MenuItem Header="Запуск робота"></MenuItem>
            <MenuItem Header="Остановка робота"></MenuItem>
            <Separator></Separator>
            <MenuItem Header="Выход"></MenuItem>
        </MenuItem>
        <MenuItem Header="Настройки">
            <MenuItem Header="Источник данных"></MenuItem>
            <MenuItem Header="Стратегии"></MenuItem>
            <Separator></Separator>
            <MenuItem Header="Контроль рисков"></MenuItem>
            <MenuItem Header="Управление временем"></MenuItem>
        </MenuItem>
        <MenuItem Header="Окна">
            <MenuItem Header="Деньги"></MenuItem>
            <Separator></Separator>
            <MenuItem Header="Логи"></MenuItem>
            <Separator></Separator>
            <MenuItem Header="Заявки"></MenuItem>
            <MenuItem Header="Сделки"></MenuItem>
            <MenuItem Header="Позиции"></MenuItem>
            <Separator></Separator>
            <MenuItem Header="График"></MenuItem>
            <MenuItem Header="Модель"></MenuItem>
            <MenuItem Header="Улыбка"></MenuItem>
        </MenuItem>
    </Menu>
        
        <Grid Grid.Row="1" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50*"/>
                <ColumnDefinition Width="50*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="100*"/>
            </Grid.RowDefinitions>
            <Viewbox Grid.Row="1" Grid.Column="0"  Margin="7">
                <TextBlock Foreground="Black" FontStyle="Normal" Height="Auto" HorizontalAlignment="Center" Name="textBlock1" Text="Прибыль" VerticalAlignment="Center" Width="Auto" />
            </Viewbox>
            <Viewbox Grid.Row="1" Grid.Column="1"  Margin="7">
                <TextBlock Foreground="Black" Height="Auto" HorizontalAlignment="Center" Name="textBlock2" Text="11402%" VerticalAlignment="Center" Width="Auto" />
            </Viewbox>
        </Grid>
        
        <Grid Grid.Row="2" Background="White" >
            <Viewbox Margin="5" >
                <TextBlock Foreground="Black" Height="Auto" HorizontalAlignment="Left" Name="textBlock3" Text="Логи" VerticalAlignment="Center" Width="Auto" ></TextBlock>
            </Viewbox>
        </Grid>
        
    </Grid>
</Window>
Thanks:

Alexander

Avatar
Date: 1/15/2012
Reply


Мне кажется, что графическая оболочка - едва ли не последнее над чем надо работать.
Алгоритм первичен всё же :)
Thanks:

Evgeny_K

Avatar
Date: 1/16/2012
Reply


Полезная тема.

Quote:
Начнем с блок-схемы, описывающей основные элементы системы.


Я бы еще добавил пункт Логирование - запись в файл или БД истории котировок, сделок и ошибок.
Thanks:

OvcharenkoVI

Avatar
Date: 1/16/2012
Reply


Alexander Mukhanchikov
Мне кажется, что графическая оболочка - едва ли не последнее над чем надо работать.
Алгоритм первичен всё же :)


+1)
Thanks:

vader

Avatar
Date: 1/16/2012
Reply


Не стоит использовать имена textBlock1, textBlock2, textBlock3 и им подобные.
Совершенно не читаемый код получается.
Thanks:

BigBen

Avatar
Date: 1/17/2012
Reply


Ждем продолжения.
Thanks:

ingeniero

Avatar
Date: 2/9/2012
Reply


algorithm
Thanks:

Serg

Avatar
Date: 3/1/2012
Reply


А можно поподробней по этой uml диаграмме. Никогда в них не разбирался. Пишу арбитражных роботов и если честно они у меня такие кривые просто жуть... конструкции вроде трехэтажного мата))) Может хоть диаграммы мне помогут)
Thanks:

ingeniero

Avatar
Date: 3/4/2012
Reply


Quote:
А можно поподробней по этой uml диаграмме. Никогда в них не разбирался. Пишу арбитражных роботов и если честно они у меня такие кривые просто жуть... конструкции вроде трехэтажного мата))) Может хоть диаграммы мне помогут)


Serg,
Диаграмма помогает понять алгоритм в общих чертах, но от суровой модели событийной реальности не спасает:)

Алгоритм (в идеале):
1. Считаем спред
2. Видим диапазон цены
3. У нижней границы диапазона продаем, у верхней покупаем (минимальная прибыль = проскальзывание + комиссия + какой-то фикс)
4. Продажа спреда: котируем фьючерс (по нижней границе диапазона), продали – покупаем спот.
5. Покупка спреда: котируем фьючерс (по верхней границе диапазона), налили – продаем спот.
Профит.

Какие возникли проблемы:
1. Ликвидность.
Сначала я исходил из предпосылки: на споте максимальная ликвидность, поэтому там всегда торгуем по рынку.
Умные люди объяснили, что лотов 10, спред не всегда (и не на всех инструментах) одна копейка, т.е. нужно в каждый момент времени считать, где бид/аск спред больше и котировать эту сторону.
Впрочем, я до сих пор считаю, что основной источник дохода – это залетные покупатели на неликвидных фьючах. Поэтому даже, если на споте бид/аск спред в какой-то момент будет больше, котировать эту сторону смысла я не вижу: появился сигнал на продажу спреда, пока будем покупать спот, нашему залетчику уже 10 раз нальют.

2. Стаканы.
Для тестов на истории я использовал квиковские стаканы и событие
this.When(Change(Trader.GetMarketDepth(Security1))).Do()
Поскольку экспорт не всегда запускался ровно в 10:00, трейдер ругался на отсутствие стаканов в 10:00:01 и выдавал exception: Object reference not set to an instance of an object (стаканов нет, сделок тоже не еще не было).
Есть как минимум три решения этой проблемы: добавить условие и торговать в то время, когда стаканы точно будут; использовать тестирование на рыночных данных; торговать на реальном счете.

3. События.
3.1. Событие (Изменились стаканы) --> Действие (Пересчитываем спреды) -->
Событие (Сигнал на продажу?) --> Действие (Котируем фьюч) --> Событие (Налили?) --> Действие (Покупаем спот)
3.2. Событие (Изменились стаканы) --> Действие (Пересчитываем спреды) -->
Событие (Сигнал на покупку?) --> Действие (Котируем фьюч) --> Событие (Налили?) --> Действие (Продаем спот)
Буду благодарен за помощь в корректном подборе событий и дочерних стратегий (у каждой свои особенности)))

4. Индикатор.

Синяя линия – продажа спреда
Красная – покупка

Коллеги предлагают построить среднюю и торговать отклонения от нее.
Как это сделать?
Я вижу диапазон: минимальные значения для продажи, максимальные для покупки.
Найти середину диапазона, отобрать все значения красной линии выше середины и все значения синей ниже диапазона. Соединить полученные точки. Построить среднюю от новой линии.
Посчитать то отклонение от средней, которое позволяет получить минимальную прибыль (см. п.3 алгоритма).


Интересное видео на тему арбитража
http://www.youtube.com/watch?v=GXf5046e9o0

В общем и целом реализация понятна.
Обратите внимание на варианты перекрытия: нет / по рынку / по последней (по цене последней сделки?) / лучший бид/аск (перекрытие котированием?).
Что такое Порог, Limit-выигрыш, PM Price?
Полезная функция «Зона заявки» (используется для ограничения транзакций), возьму на заметку.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy