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

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


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

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

Класс использую так: [code=csharp]
for (var i = 1000; i < 30000; i+= 1000) { var storage = new TradingStorage(new FileStorage(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(); } [/code]

Сам класс: [code=csharp]
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;
    }

}[/code]




Спасибо:


Alexander

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


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

Спасибо:

Mikhail Sukhov

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


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

Спасибо:

valenock

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


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

Спасибо:

Mikhail Sukhov

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


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

Спасибо:

valenock

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


нашёл суть проблемы ! [code=csharp] var test = new HistoryTest() { PathHistoryStorage = PathHistoryStorage, Security = _rts [/code] т.е. каждому EmulationTest передаётся по ссылке одна и та же Security Видимо, тестер хранит в ней какие-то данные для теста, в lastTrade дату последней сделки или ещё что ... Исправление на создание новой Security каждый раз решает проблему. [code=csharp] 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, }, [/code]

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

Спасибо:

Mikhail Sukhov

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


[quote=valenock;10763]нашёл суть проблемы ! [code=csharp] var test = new HistoryTest() { PathHistoryStorage = PathHistoryStorage, Security = _rts [/code] т.е. каждому EmulationTest передаётся по ссылке одна и та же Security [/quote]

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

Спасибо:


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

loading
clippy