← 戻る

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

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

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


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
Alexander

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

apostar
apostar 著者

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

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

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

Mikhail Sukhov
Mikhail Sukhov

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

apostar
apostar 著者

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

Mikhail Sukhov
Mikhail Sukhov

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

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

apostar
apostar 著者

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


    /// <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
Mikhail Sukhov

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

apostar
apostar 著者

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

Mikhail Sukhov
Mikhail Sukhov

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

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

apostar
apostar 著者

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