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


Борюсь с проблемой, которую не получается пока никак локализовать.
Сделал класс 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;
        }
}



Спасибо:




6 Ответов
Alexander

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


Перенёс тему куда надо.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 31.08.2011
Ответить


Итого, сколько раз создается EmulationTrader?
Спасибо:

valenock

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


В данном случае это не важно - работает только первый вызов при последовательном создании FileStorage.
Аналогично, не работают несколько параллельных FileStorage из одной директории BasePath - тики в EmulationTrader отдаёт только первый из них.
Это можно проверить, закомментировав в коде паузу между вызовами
Код
while (!test.IsFinished()) System.Threading.Thread.Sleep(10000); 

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 31.08.2011
Ответить


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

valenock

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


нашёл суть проблемы !
Код
   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

Фотография
Автор статей Программист Трейдер
Дата: 02.09.2011
Ответить


valenock Перейти
нашёл суть проблемы !
Код
   var test = new HistoryTest()
                {
                    PathHistoryStorage = PathHistoryStorage,
                    Security = _rts

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


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


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

loading
clippy