[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470538&hash=5489cd9b16a7da27&hd=3[/vk]
Провести полное тестирование на случайных данных.
В проекте, приложенному к данному уроку, реализовать возможность выбора режима тестирования на случайных данных.
Проект TestingAndTrading
Файл MainWindow.cs
Начиная с версии S# 4.1.19.1 статус подключения коннектора вынесен в специальное свойство ExportState, которое может принимать значения:
Disconnected - Не активно,
Disconnecting - В процессе отключения,
Connected - В процессе подключения,
Connecting - Подключение активно,
Failed - Ошибка подключения
Таким образом, теперь нет свойства IsExportStarted, а статус экспорта данных мы можем получать от свойства ExportState.
Было:
Code
protected override void OnClosing(CancelEventArgs e)
{
if (_trader != null && _trader.IsExportStarted)
_trader.StopExport();
_myTradesWindow.Close();
base.OnClosing(e);
}
Стало:
Code
protected override void OnClosing(CancelEventArgs e)
{
if (_trader != null && _trader.ExportState == ConnectionStates.Connected)
_trader.StopExport();
_myTradesWindow.Close();
base.OnClosing(e);
}
В версии S# 4.1.19.1 конструктор класса RealTimeEmulationTrader принимает еще и список портфелей, которыми он будет оперировать, кроме экземпляра коннектора.
Мы просто создаем список и в качестве элемента этого списка передаем портфель, который был выбран пользователем.
Было:
Code
private void ConnectBtn_Click(object sender, RoutedEventArgs e)
{
if (!_isRealTimeTesting && !_isHistoricalDataTesting)
// создаем обычного трейдера
_trader = new QuikTrader(QuikTerminal.GetDefaultPath());
else if (_isRealTimeTesting)
// создаем RealTimeEmulationTrader для тестирования на рыночных данных
_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(QuikTerminal.GetDefaultPath()));
else if (_isHistoricalDataTesting)
{
// создаем хранилище
var storage = new StorageRegistry();
// указываем путь к хранилищу
((LocalMarketDataDrive) storage.DefaultDrive).Path = @"C:\HistoryData";
((LocalMarketDataDrive) storage.DefaultDrive).UseAlphabeticPath = true;
// создаем инструмент для тестирования
_security = new Security
{
Id = "RIU3@FORTS",
Code = "RIU3",
Name = "RTS-9.13",
MinStepSize = 10,
MinStepPrice = 2,
ExchangeBoard = ExchangeBoard.Forts
};
// создаем портфель для тестирования
_portfolio = new Portfolio {Name = "test account"};
// создаем EmulationTrader для тестирования на исторических данных
_trader = new EmulationTrader(new[] {_security}, new[] {_portfolio})
{
StorageRegistry = storage, // передаем хранилище EmulationTrader
MarketTimeChangedInterval = _timeFrame, // указываем интервал прихода события о смене времени
UseMarketDepth = true, // указываем использовать стаканы для эмуляции
UseCandlesTimeFrame = _timeFrame // загружаем свечи с указаным тайм - фрэймом
};
// если данные по стаканам отсутствуют,
// генерируем стакан для эмуляции на основании
// цен последних сделок или свечек
var mdGenerator = new TrendMarketDepthGenerator(_security)
{
Interval = TimeSpan.FromSeconds(1), // время обновления стакана
MaxAsksDepth = 1, // максимальное количество асков в стакане
MaxBidsDepth = 1, // максимальное количество бидов в стакане
UseTradeVolume = true, // использовать обьем последней сделки для генерации обьема лучших котировок
MaxSpreadStepCount = 5, // максимальный размер спрэда
MinSpreadStepCount = 2 // минимальный размер спрэда
};
// регистрируем стакан
((EmulationTrader) _trader).RegisterMarketDepth(mdGenerator);
}
_trader.NewSecurities += securities => this.GuiAsync(() => MySecurities.ItemsSource = securities);
_trader.NewPortfolios += portfolios => this.GuiAsync(() => MyPortfolios.ItemsSource = portfolios);
_trader.NewOrders += orders => this.GuiAsync(() => _myTradesWindow.MyOrders.Orders.AddRange(orders));
_trader.Connected += _trader.StartExport;
_trader.Connect();
}
Стало:
Code
private void ConnectBtn_Click(object sender, RoutedEventArgs e)
{
if (!_isRealTimeTesting && !_isHistoricalDataTesting)
// создаем обычного трейдера
_trader = new QuikTrader(QuikTerminal.GetDefaultPath());
else if (_isRealTimeTesting)
// создаем RealTimeEmulationTrader для тестирования на рыночных данных
_trader = new RealTimeEmulationTrader(new QuikTrader(QuikTerminal.GetDefaultPath()),
new List<Portfolio> { (Portfolio)MyPortfolios.SelectedItem });
else if (_isHistoricalDataTesting)
{
// создаем хранилище
var storage = new StorageRegistry();
// указываем путь к хранилищу
((LocalMarketDataDrive) storage.DefaultDrive).Path = @"C:\HistoryData";
((LocalMarketDataDrive) storage.DefaultDrive).UseAlphabeticPath = true;
// создаем инструмент для тестирования
_security = new Security
{
Id = "RIU3@FORTS",
Code = "RIU3",
Name = "RTS-9.13",
MinStepSize = 10,
MinStepPrice = 2,
ExchangeBoard = ExchangeBoard.Forts
};
// создаем портфель для тестирования
_portfolio = new Portfolio {Name = "test account"};
// создаем EmulationTrader для тестирования на исторических данных
_trader = new EmulationTrader(new[] {_security}, new[] {_portfolio})
{
StorageRegistry = storage, // передаем хранилище EmulationTrader
MarketTimeChangedInterval = _timeFrame, // указываем интервал прихода события о смене времени
UseMarketDepth = true, // указываем использовать стаканы для эмуляции
UseCandlesTimeFrame = _timeFrame // загружаем свечи с указаным тайм - фрэймом
};
// если данные по стаканам отсутствуют,
// генерируем стакан для эмуляции на основании
// цен последних сделок или свечек
var mdGenerator = new TrendMarketDepthGenerator(_security)
{
Interval = TimeSpan.FromSeconds(1), // время обновления стакана
MaxAsksDepth = 1, // максимальное количество асков в стакане
MaxBidsDepth = 1, // максимальное количество бидов в стакане
UseTradeVolume = true, // использовать обьем последней сделки для генерации обьема лучших котировок
MaxSpreadStepCount = 5, // максимальный размер спрэда
MinSpreadStepCount = 2 // минимальный размер спрэда
};
// регистрируем стакан
((EmulationTrader) _trader).RegisterMarketDepth(mdGenerator);
}
_trader.NewSecurities += securities => this.GuiAsync(() => MySecurities.ItemsSource = securities);
_trader.NewPortfolios += portfolios => this.GuiAsync(() => MyPortfolios.ItemsSource = portfolios);
_trader.NewOrders += orders => this.GuiAsync(() => _myTradesWindow.MyOrders.Orders.AddRange(orders));
_trader.Connected += _trader.StartExport;
_trader.Connect();
}
Версия 4.1.19 требует явного указания размера начальной позиции портфеля, на момент тестирования, иначе, просто не будет хватать средств для выполнения тестирования.
Было:
Code
// создаем портфель для тестирования
_portfolio = new Portfolio { Name = "test account"};
Стало:
Code
// создаем портфель для тестирования
_portfolio = new Portfolio { Name = "test account", BeginValue = 1000000};