← Zurück

FileStorage - отдаёт сделки только первый раз ?

Борюсь с проблемой, которую не получается пока никак локализовать. Сделал класс HistoryTest, в котором один метод, который запускает тестирование на истории и выходит, когда оно заканчивается. Первый раз, когда я создаю экземпляр класса и запускаю тестирование на исполнение - всё работает как надо. Второй и последующие разы создаю НОВЫЙ экземпляр класса и не получаю от storageAPI ни новых сделок ни даже NewSecurities не срабатывает ни разу. totalStorageTrades так и остаётся 0.

Это я что-то делаю не так или storageAPI не сбрасывает текущую позицию в файле или счётчик трейдов ?

Класс использую так:

            
for (var i = 1000; i < 30000; i+= 1000)
{
     var storage = new TradingStorage(new FileStorage(PathHistoryStorage)) { BasePath = PathHistoryStorage };
     var test = new HistoryTest()
     {
         PathHistoryStorage = PathHistoryStorage,
         Security = _rts,
         FileLog = fLog,
         EmulationStartTime =  new DateTime(2011, 06, 01),
         EmulationStopTime =  new DateTime(2011, 06, 02, 12, 00, 00),
         storage = storage
     };
     test.RunHistoryTest2(i);
     while (!test.IsFinished()) System.Threading.Thread.Sleep(10000);
     Console.ReadLine();
}

Сам класс:

    
class HistoryTest
{
        public string PathHistoryStorage;
        private EmulationTrader _historyTrader;
        public Security Security;
        private StrategyTest _strategy;
        private DateTime _lastTitleUpdateDate;
        public DateTime EmulationStartTime = new DateTime(2011, 06, 01);
        public DateTime EmulationStopTime = new DateTime(2011, 09, 02);
        public StreamWriter FileLog;
        public TradingStorage storage;

        //---------------------------------------------------------------------------------------------------------------
        //
        //---------------------------------------------------------------------------------------------------------------
        public void RunHistoryTest2(int period)
        {
            // тестовый портфель
            var portfolio = new Portfolio { Name = "TeST" };

            // инициализируем настройки (инструмент в истории обновляется раз в 100ms)
            var timeFrame = TimeSpan.FromSeconds(1);
            _historyTrader = new EmulationTrader(new[] { Security }, new[] { portfolio })
            {
                MarketTimeChangedInterval = timeFrame,
                Storage = storage,
                WorkingTime = Exchange.Rts.WorkingTime,
                DaysInMemory = 1,
            };

            Console.WriteLine("==============================================================");
            _strategy = new StrategyTest
            {
                Volume = 1,
                Portfolio = portfolio,
                Security = Security,
                Trader = _historyTrader,
                period = period,
            };

            _historyTrader.NewSecurities += newSecs => { foreach (var security in newSecs) Console.WriteLine("Актив: " + security.Id + " " + security.Name); };
            var totalStorageTrades = 0;
            _historyTrader.NewTrades += trades =>{ totalStorageTrades += trades.Count(); };
            
            _historyTrader.StateChanged += () =>
            {
                if (_historyTrader.State == EmulationStates.Stopped)
                {
                    Console.WriteLine("TotalStorageTrades = " + totalStorageTrades);
                    Console.WriteLine("FINISHED 1 run...");
                    _strategy.Stop();
                    _strategy.Dispose();
                    _historyTrader.StopExport();
                    _historyTrader.Disconnect();
                    _historyTrader.Dispose();
                    storage.GetTradeStorage(Security).AllDates.GetEnumerator().Reset();
                    storage = null;
                }
                // запускаем стратегию когда эмулятор запустился
                else if (_historyTrader.State == EmulationStates.Started) _strategy.Start();
            };

            // запускаем экспорт, чтобы инициализировать переданными инструментами и портфелями
            // необходимоые свойства HistoryEmulationTrader
            _historyTrader.Connect();
            _historyTrader.StartExport();

            // Запуск начала тестирования: 
            _historyTrader.Start(EmulationStartTime, EmulationStopTime);
        }
        //---------------------------------------------------------------------------------------------------------------
        //
        //---------------------------------------------------------------------------------------------------------------
        public bool IsFinished()
        {
            return _historyTrader == null || _historyTrader.State == EmulationStates.Stopped;
        }
}

War dieses Thema hilfreich?

Thema teilen

Kommentare (6)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

Перенёс тему куда надо.

Mikhail Sukhov
Mikhail Sukhov

Итого, сколько раз создается EmulationTrader?

valenock
valenock Autor

В данном случае это не важно - работает только первый вызов при последовательном создании FileStorage. Аналогично, не работают несколько параллельных FileStorage из одной директории BasePath - тики в EmulationTrader отдаёт только первый из них. Это можно проверить, закомментировав в коде паузу между вызовами

while (!test.IsFinished()) System.Threading.Thread.Sleep(10000); 

Я и отдельный класс HistoryTest перенёс всё, чтобы изолировать проблему.

Mikhail Sukhov
Mikhail Sukhov

Не заметил что FileStorage. Это пока недоделанный класс. Как только доделаем, тут же напишем о нем документацию.

valenock
valenock Autor

нашёл суть проблемы !

   var test = new HistoryTest()
                {
                    PathHistoryStorage = PathHistoryStorage,
                    Security = _rts

т.е. каждому EmulationTest передаётся по ссылке одна и та же Security Видимо, тестер хранит в ней какие-то данные для теста, в lastTrade дату последней сделки или ещё что ... Исправление на создание новой Security каждый раз решает проблему.

   var test = new HistoryTest()
                {
                    PathHistoryStorage = PathHistoryStorage,
                    Security = new Security{
            Id = "SPFB.RTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
            Code = "RI",
            Name = "RTS",
            MinStepSize = 5,
            MinStepPrice = 2,
            Decimals = 0,
            Exchange = Exchange.Rts,
        },

В принципе, это баг, насколько я понимаю так быть не должно.

Mikhail Sukhov
Mikhail Sukhov

valenock: нашёл суть проблемы !

var test = new HistoryTest() { PathHistoryStorage = PathHistoryStorage, Security = _rts

> т.е. каждому EmulationTest передаётся по ссылке одна и та же Security

Подпишитесь на EmulationTrader.ProcessDataError.