EmulationTrader и MarketTimeChangedInterval в одну миллисекунду.

EmulationTrader и MarketTimeChangedInterval в одну миллисекунду.
Atom
1/10/2012
apostar


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

Имеется следующий код для тестирования стратегии:


var emulationTrader = new EmulationTrader(allSecurities, new[] { traderInfo.Portfolio })
	{ 
		MarketTimeChangedInterval = TimeSpan.FromMilliseconds(1),
		WorkingTime = Exchange.Rts.WorkingTime,
		DaysInMemory = 1,
		LoadingThreadCount = 6,
	};

При этом если используется

MarketTimeChangedInterval = TimeSpan.FromMilliseconds(1)

то программа зависает после инициализации генераторов трейдов и стаканов, если же используется большее разрешение для MarketTimeChangedInterval, например

MarketTimeChangedInterval = TimeSpan.FromSeconds(1)

то все работает нормально. Не подскажите, с чем это может быть связано?

Используется S# 4.0.14




Thanks:


Alexander

Avatar
Date: 1/10/2012
Reply


А действительно ли нужен такой MarketTimeChangedInterval для тестирования?

Thanks:

apostar

Avatar
Date: 1/11/2012
Reply


Идея следующая: Для того чтобы проверить корректность работы робота, есть две одновременно работающих стратегии: одна торговая (trading) и одна (dump quotes) которая записывает стаканы в файл по наступлению события Trader.QuotesChanged. А также есть сторонний софт (testing), который умеет обрабатывать файл созданный dump quotes стратегией и эмулировать работу торговой модели, реализованной в trading.

Чтобы убедится что trading работает правильно с математической точки зрения, результаты работы testing и trading (который в режиме тестирования работает с EmuationTrader и генераторами стаканов по файлу из dump quotes) должны совпасть. Поскольку генератор стаканов не может сам сгенерировать стакан в нужное ему время, я беру минимальное разрешение времени с которым может записаться стакан в dump quotes и возвращаю true из MarketDepthGenerator.IsTimeToGenerate в нужные мне моменты времени. Минимальное разрешение времени в моем случае - одна миллисекунда, а с ней EmulationTrader не хочет работать.

Возможно, Вы уже решали подобные задачи и можете посоветовать альтернативный подход, который был бы более "нативным" для S#.

Thanks:

Mikhail Sukhov

Avatar
Date: 1/11/2012
Reply


Неясен один момент. У вас есть стаканы и вы по ним тестируете или же стаканов нет и вы их эмулируете?

Thanks:

apostar

Avatar
Date: 1/11/2012
Reply


У меня есть стаканы, сохраненные в файл. При тестировании они попадают в EmulationTrader через написанный мной MarketDepthGenerator.

Thanks:

Mikhail Sukhov

Avatar
Date: 1/11/2012
Reply


apostar: У меня есть стаканы, сохраненные в файл. При тестировании они попадают в EmulationTrader через написанный мной MarketDepthGenerator.

Стаканы загружаются автоматически, через EmulationTrader.Storage. Как и сделки. MarketDepthGenerator нужен для генерации стакана. Другими словами, или загрузка из хранилища, или генерация.

Thanks:

apostar

Avatar
Date: 1/12/2012
Reply


Михаил, в этих терминах - генерация.


    /// <summary>
    /// Market depth generator based on dump file.
    /// </summary>
    public sealed class DumpMarketDepthGenerator : MarketDepthGenerator
    {
        /// <summary>
        /// The piecewise constant interpolation curve.
        /// </summary>
        private readonly PciCurve curve;

        /// <summary>
        /// Сгенерировать маркет-данные.
        /// </summary>
        /// <param name="data">Маркет-данные.</param><param name="time">Текущее время.</param>
        public override void Generate(MarketDepth data, DateTime time)
        {
            .......
        }

Thanks:

Mikhail Sukhov

Avatar
Date: 1/12/2012
Reply


Все правильно. Но если стаканы уже сохранены, генерировать их не нужно. И нет необходимости писать генератор свой.

Thanks:

apostar

Avatar
Date: 1/12/2012
Reply


Михаил, спасибо за ответ. Дело в том что стаканы сохранены в моем собственном формате, про который S# ничего не знает. Сохраненные стаканы загружаются и попадают в DumpMarketDepthGenerator как PciCurve curve.

Thanks:

Mikhail Sukhov

Avatar
Date: 1/12/2012
Reply


apostar: Михаил, спасибо за ответ. Дело в том что стаканы сохранены в моем собственном формате, про который S# ничего не знает. Сохраненные стаканы загружаются и попадают в DumpMarketDepthGenerator как PciCurve curve.

Тогда лучше подменить реализацию IMarketDataStorage через ITradingStorage.AddTradeStorage. Тогда вы напрямую сделки будете загружать из вашего хранилища через правильный механизм. Или, что еще правильнее, сохранять стаканы через вашу программу с помощью того же IMarketDataStorage

Thanks: apostar

apostar

Avatar
Date: 1/12/2012
Reply


Михаил, спасибо большое, попробую и отпишусь в этой ветке о результатах - вдруг кому-то еще пригодится эта информация.

Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy