EmulationTrader и MarketTimeChangedInterval в одну миллисекунду.
Atom Ответить
10.01.2012


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

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

Код

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



Спасибо:




10 Ответов
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<Trade> через ITradingStorage.AddTradeStorage. Тогда вы напрямую сделки будете загружать из вашего хранилища через правильный механизм. Или, что еще правильнее, сохранять стаканы через вашу программу с помощью того же IMarketDataStorage<Trade>
Спасибо: apostar

apostar

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


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


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

loading
clippy