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


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


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

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

Code

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


При этом если используется
Code
MarketTimeChangedInterval = TimeSpan.FromMilliseconds(1)

то программа зависает после инициализации генераторов трейдов и стаканов, если же используется большее разрешение для MarketTimeChangedInterval, например
Code
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 Go to
У меня есть стаканы, сохраненные в файл. При тестировании они попадают в EmulationTrader через написанный мной MarketDepthGenerator.


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

apostar

Avatar
Date: 1/12/2012
Reply


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

Code

    /// <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 Go to
Михаил, спасибо за ответ. Дело в том что стаканы сохранены в моем собственном формате, про который S# ничего не знает.
Сохраненные стаканы загружаются и попадают в DumpMarketDepthGenerator как PciCurve curve.


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

apostar

Avatar
Date: 1/12/2012
Reply


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


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

loading
clippy