Урок 8. Тестирование


Видео-уроки: Тестирование стратегий

[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.

Было:


        protected override void OnClosing(CancelEventArgs e)
        {
            if (_trader != null && _trader.IsExportStarted)
                _trader.StopExport();

            _myTradesWindow.Close();
            base.OnClosing(e);
        }

Стало:


        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 принимает еще и список портфелей, которыми он будет оперировать, кроме экземпляра коннектора. Мы просто создаем список и в качестве элемента этого списка передаем портфель, который был выбран пользователем.

Было:


        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();
        }

Стало:


        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 требует явного указания размера начальной позиции портфеля, на момент тестирования, иначе, просто не будет хватать средств для выполнения тестирования. Было:


// создаем портфель для тестирования
_portfolio = new Portfolio { Name = "test account"};

Стало:


// создаем портфель для тестирования
_portfolio = new Portfolio { Name = "test account", BeginValue = 1000000};


Теги:


Спасибо:


< 1 2 
IvanB

Фотография
Дата: 22.12.2013
Ответить


Николай, причина была в том, что на торги не хватало средств в портфеле:


// создаем портфель для тестирования
_portfolio = new Portfolio { Name = "test account"};

если изменить:


// создаем портфель для тестирования
_portfolio = new Portfolio { Name = "test account", BeginValue = 1000000};

Либо по новой закачайте проект с сервера, там он исправлен, либо сами измените так, как показано выше.

Спасибо:

Николай

Фотография
Дата: 24.12.2013
Ответить


Иван, спасибо. Действительно данное изменение помогло.

Спасибо:

JaguarFX

Фотография
Дата: 25.01.2014
Ответить


В версии API 4.2.1.7 уже не работает конструктов класса TrendMarketDepthGenerator с параметром Security, как это указано в примере для версии 4.1.19.1:var mdGenerator = new TrendMarketDepthGenerator(_security)

Согласно описанию конструктор требует объект типа StockSharp.Messages.SecurityId:
public TrendMarketDepthGenerator(StockSharp.Messages.SecurityId securityId)

Но наиболее очевидный вариант создания этого объекта, который вроде не вызывает ошибок с т.зр. VS2012: var mdGenerator = new TrendMarketDepthGenerator(new SecurityId(_security)); в дальнейшем при попытке зарегистрировать стакан в трейдере через метод RegisterMarketDepth(mdGenerator) дает ошибку {"Значение не может быть неопределенным.\r\nИмя параметра: secCode"}. См. принт-скрин.

Прошу сообшить как в версии API 4.2.1.7 правильно создать TrendMarketDepthGenerator.

EmulErr-1.jpg 420 KB (381)
Спасибо:

Mikhail Sukhov

Фотография
Дата: 25.01.2014
Ответить


lebedevsrg: Прошу сообшить как в версии API 4.2.1.7 правильно создать TrendMarketDepthGenerator.

_connector.RegisterTrades(new RandomWalkTradeGenerator(_connector.GetSecurityId(security)));
_connector.RegisterMarketDepth(new TrendMarketDepthGenerator(_connector.GetSecurityId(security)) { GenerateDepthOnEachTrade = false });
Спасибо: JaguarFX

whitebar

Фотография
Дата: 17.02.2014
Ответить


Здравствуйте!

С помощью Гидры скачал сделки и свечи по Сбербанку с сайта Финама за 2013-й и 2014-й года. Взял пример SampleHistoryTesting из StockSharp 4.2.2.6, в коде окна MainWindow.xaml.cs поменял инструмент с RIZ2@FORTS на SBER@EQBR.

Поменял даты начала и окончания тестирования на соответствующие загруженной истории. Запустил тестирование на тиках, нет не одной сделки. Такое впечатление, что HistoryEmulationTrader вообще не видит историю.

И еще один момент. Когда Гидра показывает мне список загруженных сделок за дату, направление сделок (Buy/Sell) пустое. Это нормально, особенность Гидры, изменения на стороне Финама?

Кто нибудь сталкивался с подобным? Подскажите, пожалуйста, в какую сторону копать.

Спасибо!

Спасибо:

whitebar

Фотография
Дата: 20.02.2014
Ответить


Здравствуйте! Предыдущий вопрос по историческому тестированию снимается. Скачал с сайта версию 4.2.2.15, все заработало.

Спасибо:

Николай

Фотография
Дата: 11.03.2014
Ответить


Ребята, верните доступ к курсам.

Не одно видео не отображается не из S#, не из C#.

Спасибо:

Mikhail Sukhov

Фотография
Дата: 11.03.2014
Ответить


Спасибо:
< 1 2 

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy