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

EmulationTrader и MarketTimeChangedInterval в одну миллисекунду.
Atom
10.01.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




Спасибо:


Alexander

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


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

Спасибо:

apostar

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


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

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

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

Спасибо:

Mikhail Sukhov

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


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

Спасибо:

apostar

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


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

Спасибо:

Mikhail Sukhov

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


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

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

Спасибо:

apostar

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


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


    /// <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)
        {
            .......
        }

Спасибо:

Mikhail Sukhov

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


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

Спасибо:

apostar

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


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

Спасибо:

Mikhail Sukhov

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


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

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

Спасибо: apostar

apostar

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


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

Спасибо:


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

loading
clippy