Создание роботов с помощью S#. Введение
Решил написать несколько простых статей о том, как можно разрабатывать роботов с использованием библиотеки S#.
В саму библиотеку уже входят примеры, но они достаточно простые и их нельзя использовать в реальном приложении.
Предложенная архитектура робота включает следующие особенности:
- Интерфейс в стиле METRO UI.
- Паттерн MVVM для написания интерфейса робота.
- Корректная обработка исключительных ситуаций.
- Робот позволяет запускать множество различных стратегий на разных торговых системах, разных портфелях и разных инструментах, с различными параметрами, а также позволяет задавать все эти настройки в конфигурационном XML-файле (достаточная гибкость).
- Хранение состояния робота.
- Абсолютно компактный и тривиальный код.
Приведу пример конфигурационного файла. В этом примере задается одна стратегия StrikeStrategy. Для нее задается Quik в качестве торговой системы, задается портфель, инструмент RIM2. Для получения исторических данных устанавливается провайдер, получащий данные с ФИНАМа; у него установлены свойства на получение дневных данных по инструменту RIM2. Свое состояние стратегия хранит в ветке реестра Software\FinDirector\StrikeStrategy. Размер позиции равен 20% от капитала в портфеле. Стратегия работает на 5-минутках.
Код
<FinDirector:StrategyLoader
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:FinDirector="clr-namespace:FinDirector;assembly=FinDirector"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:Implementation="clr-namespace:FinDirector.Algo.Implementation;assembly=FinDirector.Algo"
xmlns:Strategies="clr-namespace:FinDirector.Algo.Strategies;assembly=FinDirector.Algo">
<FinDirector:StrategyLoader.Resources>
<Implementation:QuikTraderBuilder x:Key="MyQuik" Title="Мой Quik"
Path="***" Login="***" Password="***" />
<Implementation:PortfolioSelector x:Key="MyFortsPortfolio" Title="Пенсионный фонд кота Мурзика"
PortfolioName="***" />
<!--RIM2 FinamSecurityCode-->
<System:Int32 x:Key="FinamRTSCode">80996</System:Int32>
<Implementation:SecuritySelector x:Key="fRTS"
SecurityCode="RIM2" />
<Implementation:SecuritySelector x:Key="Si"
SecurityCode="SiM2" />
</FinDirector:StrategyLoader.Resources>
<FinDirector:StrategyLoader.Strategies>
<Strategies:StrikeStrategy
TraderBuilder="{StaticResource MyQuik}"
PortfolioSelector="{StaticResource MyFortsPortfolio}"
SecuritySelector="{StaticResource fRTS}"
TimeFrame="0:5:0">
<Strategies:StrikeStrategy.HistoryCandleProvider>
<Implementation:FinamHistoryCandleProvider TimeFrame="1.0:0:0" FinamSecurityCode="{StaticResource FinamRTSCode}" />
</Strategies:StrikeStrategy.HistoryCandleProvider>
<Strategies:StrikeStrategy.SettingsProvider>
<Implementation:RegistrySettingsProvider SubKey = "Software\FinDirector\StrikeStrategy" />
</Strategies:StrikeStrategy.SettingsProvider>
<Strategies:StrikeStrategy.VolumeSizer>
<Implementation:MarginVolumeSizer Ratio="0.2" />
</Strategies:StrikeStrategy.VolumeSizer>
</Strategies:StrikeStrategy>
</FinDirector:StrategyLoader.Strategies>
</FinDirector:StrategyLoader>
Автор статьи — Вадим Чижов