Часть 6 - Тотальный апгрейдИтак имеем S#.Shell на основе S#.API 4.1.15.0 и решаемся на апгрейд до версии 4.2.2.16.
Сразу же получаем множество заменой iTrader на Connector, и еще с десяток проблемных мелочей типа замены свойств, которые решаются в течение получаса
Но так же вылезают две более серьезные проблемы, о которых имеет смысл тут рассказать.
1. В XAML отваливается весь CommandBinding с тупым сообщением "Член не распознан"))
Как единственное найденное 100% работающее решение данной проблемы - перенос всего CommandBindingа из XAML в программный код.
Для этого делаем три простых шага:
1) в MainWindow.xaml полностью удаляем содержание раздела <Window.CommandBindings> и привязки команд типа Command="{x:Static Robot:MainWindow.ConnectCommand}", а вместо этого для каждого элемента, которому необходимо привязать RoutedCommand задаем имя через тег x:Name
2) в MainWindow.xaml.cs создаем новую процедуру private void InitializeCommands(), в которой для каждого управляющего элемента создаем связь через класс CommandBinding (на примере пункта меню "Подключиться"):
Code
CommandBinding ccBinding1 = new CommandBinding(ConnectCommand, ExecutedConnect, CanExecuteConnect);
this.CommandBindings.Add(ccBinding1);
miConnect.Command = ConnectCommand;
где ConnectCommand - исходная RoutedCommand,
ExecutedConnect - основная процедура для выполнения,
CanExecuteConnect - связанная проверочная процедура возможности выполнения основной процедуры,
miConnect - название элемента пункта меню "Подключиться",
далее в тоже процедуре InitializeCommands() создаем необходимые элементы для быстрых клавиш:
Code
KeyGesture OpenKeyGesture1 = new KeyGesture(Key.P,ModifierKeys.Control);
InputBinding KeyBinding1 = new KeyBinding(SettingsCommand, OpenKeyGesture1);
this.InputBindings.Add(KeyBinding1);
3) вызываем InitializeCommands() в теле процедуры MainWindow().
2. В S#.API версии 4.2.2.16 обнаруживаем, что в режиме эмуляции ни один из коннекторов (проверено на AlfaTrader/TransaqTrader) не получает портфели. Соответственно тестирование в эмуляции невозможно.
Для решения этой проблемы делаем два шага:
1) создаем в классе ConnectionEngine свойство IsEmulation:
Code
public bool IsEmulation { get { return settings.Emulation; } }
2)добавляем в код процедуры StartStrategy специальную проверку на режим эмуляции и в случае оного, создаем тестовый портфель, который и привязываем к коннектору:
Code
var portfolio = ConnectionEngine.Instance.Trader.Portfolios.FirstOrDefault(p => p.Name == strategy.Params.Portfolio);
if (portfolio == null)
{
if (ConnectionEngine.Instance.IsEmulation)
{
var portf = new Portfolio{Name = "TestAcc",BeginValue = 1000000,CurrentValue = 1000000};
ConnectionEngine.Instance.Trader.RegisterPortfolio(portf);
ConnectionEngine.Instance.Trader.TransactionAdapter.SendInMessage(portf.ToMessage());
var pcm =new PortfolioChangeMessage{PortfolioName = portf.Name}.Add(PositionChangeTypes.BeginValue, portf.BeginValue);
ConnectionEngine.Instance.Trader.TransactionAdapter.SendInMessage(pcm);
var pcm2 = new PortfolioChangeMessage { PortfolioName = portf.Name }.Add(PositionChangeTypes.CurrentValue, portf.CurrentValue);
ConnectionEngine.Instance.Trader.TransactionAdapter.SendInMessage(pcm2);
strategy.Portfolio = portf;
strategy.AddWarningLog("Создан портфель {0} для запуска стратегии", portf.Name);
}
else
{
strategy.AddErrorLog("Не найден портфель {0} для запуска стратегии", strategy.Params.Portfolio);
return;
}
}
else
strategy.Portfolio = portfolio;
Вуаля- все работает как нужно!