Создание роботов с помощью S#. Часть 4. Использование XAML для загрузки стратегий
В реальном приложении у нас будет много стратегий со своими параметрами, которые проще всего загрузить из XAML файла.
XAML — это декларативный язык разметки. Он упрощает создание пользовательского интерфейса для нашего приложения.
К настоящему моменту мы уже проделали большую работу по разделению бизнес-логики от UI и теперь можем в форме писать кода типа:
Code
StandardStrategy strategy;
StandardStrategy CreateStrategy()
{
var strategy = new StrikeStrategy()
{
TraderBuilder = new QuikTraderBuilder()
{
Path = "***",
Login = "***",
Password = "***"
},
PortfolioSelector = new PortfolioSelector()
{
PortfolioName = "***"
},
SecuritySelector = new SecuritySelector()
{
SecurityCode = "RIM2"
},
HistoryCandleProvider = new FinamHistoryCandleProvider()
{
TimeFrame = TimeSpan.FromHours(1),
FinamSecurityCode = 80996
},
SettingsProvider = new RegistrySettingsProvider()
{
SubKey = @"Software\FinDirector\StrikeStrategy"
},
VolumeSizer = new MarginVolumeSizer()
{
Ratio = 0.2,
MaxCapital = 1000000
},
TimeFrame = TimeSpan.FromMinutes(5)
};
return strategy;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
strategy = CreateStrategy();
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
if (strategy != null && strategy.TraderBuilder != null)
strategy.TraderBuilder.Dispose();
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
if (strategy.ProcessState == ProcessStates.Stopped)
Task.Factory.StartNew(strategy.Start);
}
private void btnStop_Click(object sender, RoutedEventArgs e)
{
strategy.Stop();
}
Получилось совсем немного кода. Тем не менее в реальном приложении у нас будет много стратегий и у каждой будет куча параметров. Чтобы не зашивать их в коде, проще всего загрузить их из XAML файла, таком как в примере из статьи
“Создание роботов с помощью S#. Введение”.
Code
public class StrategyLoader : FrameworkElement
{
public StrategyList Strategies { get; set; }
public StrategyLoader()
{
Strategies = new StrategyList();
}
public static StrategyLoader Load(string location)
{
return (StrategyLoader)XamlReader.Load(new XmlTextReader(location));
}
}
[Serializable]
public class StrategyList : List<StandardStrategy> { }
Теперь изменим метод CreateStrategy нашей формы:
Code
StandardStrategy CreateStrategy()
{
var strategy = StrategyLoader.Load("Strategies.config").Strategies.FirstOrDefault();
return strategy;
}
А в файл Strategies.config поместим все настройки. В коде формы теперь нет ничего лишнего.
Автор статьи: Вадим Чижов