В прошлой статье мы разработали простой алгоритм и сделали небольшой обзор библиотеки Stock#.
Теперь, когда предварительный этап закончен, перейдем непосредственно к программированию торгового робота. Для этого нам потребуется Microsoft Visual Studio 2010 и небольшое знание языка C#.
Запустим Visual Studio 2010 и создадим проект WPF. Сразу в настройках проекта выставим версию фреймворка «.NET Framework 4» (Рис. 8).
Рис. 8. Свойства проекта.
Далее, определимся с визуальным интерфейсом проекта, он у нас будет минималистический (Рис. 9).
Рис. 9. Интерфейс робота
Таким образом, почти весь визуальный интерфейс робота характеризуется всего 4 кнопками. Следующий код XAML, демонстрирует это.
<StackPanel Width="408" Height="163"><br /> <Grid><br /> <Button Name="buttonConnect" Content="Подключить" /><br /> <Button Name="buttonDisConnect" Content="Отключить" /><br /> </Grid><br /> <Separator></Separator><br /> <Button Name="buttonStartRobot" Content="Запустить робота" /><br /> <Button Name="buttonStopRobot" Content="Остановить робота" /><br /></StackPanel>
Рассмотрим по шагам, какие функции должны выполнять эти события.
Нажатие на кнопку «Подключить»
1) В самом начале необходимо создать шлюз к торговой системе Quik, используя класс QuikTrader.
2) Далее необходимо подписаться на все необходимые события.
3) Затем достаточно произвести подключение к терминалу с помощью метода Connect().
Нажатие на кнопку «Отключить»
Кнопка «Отключить» должна выполнить проверку на подключение робота к терминалу, затем остановить экспорт данных из QUIK и отключиться.
Нажатие на кнопку «Запустить робота»
Рассмотрим данное событие подробнее.
1) Вначале создается два объекта – менеджер свечей CandleManager и серия свечей CandleSeries. Это два разных класса, первый является управляющим звеном, CandleManager позволяет принимать данные о свечах из терминала и обрабатывать их. Второй класс CandleSeries – серия свечей, использую этот класс, можно обратиться к любой свече по её числовому индексу.
2) Этот же метод нажатия на кнопку должен запускать торговую стратегию. Для этого необходимо создать экземпляр класса Strategy (либо его наследника) и вызнать метод Start.
После выполнения этих действий будет запущена стратегия.
Подробнее
Перейдем к реализации стратегии. Рассмотрим как в StockSharp выполняется стратегия.
Как написано в документации есть два подхода к реализации стратегий:
1) событийный. Событийная модель характеризуется тем, что она состоит из заранее заданных правил. Каждое из правил хранит в себе условие срабатывания на событие и само действие, обрабатывающее данное событие.
2) итерационный. Если же используется итерационная модель, то код, выполняющий некоторые действия, вызывается только по окончанию интервала TimeFrameStrategy.TimeFrame. Такой подход следует использовать, если требуется простая реализация стратегии, не критичная к скорости исполнения.
В StockSharp рекомендуется применять именно событийную модель.
Опишем функции, которые должна выполнять стратегия:
1) вход/выход в позицию
2) управление позицией
Для реализации функции входа в позицию, необходимо подписаться на событие прихода новой свечи с помощью LINQ-выражения:
//когда свеча сформирована, то запустить метод обработки свечи ProcessCandle
_candleSeries
.WhenCandlesFinished()
.Do(ProcessCandle)
.Apply(this);
Рассмотрим метод ProcessCandle() (рис. 10). Этот метод вызывается каждый раз когда приходит новая свеча из терминала. Хотелось бы отметить, что свечи обрабатываются через объект класса CandleManager и хранятся в экземпляре класса CandleSeries. Причем свечи формируются из таблицы всех сделок Quik.
Рис. 10. Схема алгоритма метода ProcessCandle
Теперь вернемся к функции управления позицией. В нашем случае эта функция будет отвечать за закрытие сделки по стоп-лосу или в конце дня. Соответственно, эту функцию будет реализовывать метод OnNewOrderTrades для выставления стоп-лоса и метод closeAllPosition() для закрытия позиций в конце торговой сессии.
Причем функцию отслеживания срабатывания стоп-лоса, мы перекладываем на дочернюю стратегию StopLossStrategy.
Итак, стратегия создана. Но прежде чем запускать её, нужно знать, как она будет работать. Добавим логирование в наш проект. В StockSharp для этого существует класс LogManager. Чтобы запустить процесс логирования достаточно выполнить следующий код:
LogManager _logManager = new LogManager();
var fileListener = new FileLogListener(String.Format(«log\\{0}_{1:00}_{2:00}.txt», DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
_logManager.Sources.Add(_trader);
_logManager.Listeners.Add(fileListener);
Тем самым создается лог-менеджер, который будет записывать все происходящие события в файл с текущей датой в папку log.
Для того чтобы просматривать как работает робот, можно воспользоваться встроенным в Stock# механизмом мониторинга посредством класса MonitorWindow (Рис. 11).
Рис. 11. Монитор работы робота
Помимо этого в библиотеке Stock# реализована возможность сохранения отчетов по стратегии, для этого нужно воспользоваться классом ExcelStrategyReport.
На этом программную реализацию можно считать законченной, остается только скомпилировать проект и запустить. Рекомендую для запуска использовать тестовый счет.