Тестирование в версии 4.2.3.14, проблема


Тестирование в версии 4.2.3.14, проблема
Atom Reply
6/30/2014


Камрады, стал мигрировать с 4.2.2.16 на 4.2.3.14 - код, ессно, перестал пахать.

Ниже mainWindow. Буду признателен, если кто ткнёт мну носом в то, где у мну косяк - не происходит отработка ни стратегии (не вызывается ProcessCandle), ни отрисовка индикаторов.
Где у мну руки из опы?

Тут происходит основное действо.

Код


        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (Path.Text.IsEmpty())
            {
                MessageBox.Show(this, "Путь не выбран.");
                return;
            }

            var storageRegistry = new StorageRegistry
			{
				// изменяем путь, используемый по умолчанию
				DefaultDrive = new LocalMarketDataDrive(Path.Text)
			};

            var secCode = "RIU4";
			var board = ExchangeBoard.GetOrCreateBoard("Forts");

            var security = new Security
            {
                Id = "RIU4@FORTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
                Code = secCode,
                PriceStep = 10,
                StepPrice = 2,
                MinPrice = 10,
                MaxPrice = 1000000,
                MarginBuy = 10000, // задаем ГО
                MarginSell = 10000,
                Board = ExchangeBoard.Forts,
            };

            var portfolio = new Portfolio
            {
                Name = "TEST",
                BeginValue = 500000m,
                CurrentValue = 500000m,
                Board = ExchangeBoard.GetBoard(instruments.First().strategyParams.exchange),
            };

            realTimeTradeEmulation = new HistoryEmulationConnector(new List<Security>() { security }, new List<Portfolio>() { portfolio } , storageRegistry)
            {
                MarketEmulator =
                {
                    Settings =
                    {
                        UseCandlesTimeFrame = System.TimeSpan.Zero,
                        MatchOnTouch = true,
                    }
                },
                StorageRegistry = storageRegistry,
            };

            realTimeTradeEmulation.NewSecurities += securities =>
            {
                if (securities.All(s => s != security))
                    return;

                realTimeTradeEmulation.RegisterSecurity(security);
                realTimeTradeEmulation.RegisterTrades(security);
                realTimeTradeEmulation.RegisterPortfolio(portfolio);

                realTimeTradeEmulation.RegisterMarketDepth(security);
                realTimeTradeEmulation.RegisterMarketDepth(new TrendMarketDepthGenerator(realTimeTradeEmulation.GetSecurityId(security))
                {
                    Interval = TimeSpan.FromMilliseconds(30),
                    MaxAsksDepth = 10,
                    MaxBidsDepth = 10,
                    UseTradeVolume = true,
                    MaxVolume = 100,
                    MinSpreadStepCount = 2,  // минимальный генерируемый спред - 2 минимальных шага цены
                    MaxSpreadStepCount = 2, // не генерировать спрэд между лучшим бид и аск больше чем 5 минимальных шагов цены - нужно чтобы при генерации из свечей не получалось слишком широкого спреда.
                    MaxPriceStepCount = 2	// максимальное количество шагов между ценами,
                });
            };

            realTimeTradeEmulation.NewPortfolios += myPortfolios => this.GuiAsync(() => _portfolios.Portfolios.AddRange(myPortfolios));
            realTimeTradeEmulation.NewStopOrders += stopOrders => this.GuiAsync(() => _orders.Orders.AddRange(stopOrders));
            realTimeTradeEmulation.NewOrders += orders => this.GuiAsync(() => _orders.Orders.AddRange(orders));

            realTimeTradeEmulation.NewMyTrades += trades => this.GuiAsync(() =>
            {
                instruments.ForEach(elem =>
                {
                    if (elem.isFormed)
                    {
                        var currentElemTrades = trades.Where(t => elem.strategy.Orders.Any(o => o == t.Order));
                        this.GuiAsync(() => _trades.Trades.AddRange(currentElemTrades));

                        currentElemTrades.ToList().ForEach(strategyTrade =>
                        {
                            var tradeTime = elem.strategy.lastWorkedCandle == null ? strategyTrade.Order.Time : elem.strategy.lastWorkedCandle.OpenTime;
                            this.GuiAsync(() => elem.chart.ProcessValues(tradeTime, new Dictionary<IChartElement, object> { { elem.tradesIndicator, strategyTrade } }));
                        });
                    }
                });
            });

            realTimeTradeEmulation.StateChanged += (oldState, newState) =>
            {
                if (realTimeTradeEmulation.State == EmulationStates.Stopped)
                {
                    this.GuiAsync(() =>
                    {
                        if (realTimeTradeEmulation.IsFinished)
                            MessageBox.Show("Закончено");
                        else
                            MessageBox.Show("Отменено");
                    });
                }
                else if (realTimeTradeEmulation.State == EmulationStates.Started)
                {
                    realtimeCandleManager.Processing += (s, candle) =>
                    {
                        if (candle.State == CandleStates.Finished)
                            _buffer.Add(candle);
                    };

                    realtimeCandleManager.Start(instruments.First().series);
                    instruments.First().strategy.Start();
                }
            };

            realTimeTradeEmulation.Connect();
            realTimeTradeEmulation.StartExport();

            realtimeCandleManager = new CandleManager(realTimeTradeEmulation);

            CreateStrategyFromInstrument(security, instruments.First().strategyParams, instruments.First(), portfolio);

            realTimeTradeEmulation.Start(From, To);
        }



Тут задаются параметры стратегии.

Код

        private void CreateStrategyFromInstrument(Security currentSecurity, StrategyParameters currentParams, InstrumentDescription instrument, Portfolio portfolio)
        {
            instrument.portfolio = portfolio;

            realTimeTradeEmulation.TransactionAdapter.SendInMessage(instrument.portfolio.ToMessage());
            realTimeTradeEmulation.TransactionAdapter.SendInMessage(new PortfolioChangeMessage
            {
                PortfolioName = instrument.portfolio.Name
            }.Add(PositionChangeTypes.BeginValue, instrument.portfolio.BeginValue));

            instrument.series = new CandleSeries(typeof(RangeCandle), currentSecurity, new Unit((decimal)instrument.strategyParams.candleSize));
            instrument.strategy = new StockBotStrategy(instrument.series, currentParams)
            {
                Volume = 1,
                Security = currentSecurity,
                Portfolio = instrument.portfolio,
                Connector = realTimeTradeEmulation,
            };

            instrument.strategy.Log += OnLog;

            TabItem addedItem;
            stockCharts.Items.Add(addedItem = new TabItem() { Header = currentParams.name, Content = new Chart() });

            instrument.chart = (Chart)addedItem.Content;

            if (((Chart)addedItem.Content).Areas.IsEmpty())
                ((Chart)addedItem.Content).Areas.Add(new ChartArea());

            instrument.area = ((Chart)addedItem.Content).Areas.Last();
               
            instrument.area.Elements.Add(instrument.candleElem = new ChartCandleElement());            

            #region new filters

            instrument.area.Elements.Add(instrument.kalmanExt = new ChartIndicatorElement()
                                        {
                                            Indicator = (IIndicator)instrument.strategy.kalmanSeries,
                                            Title = "Фильтр Калмана",
                                            Color = Colors.Black,
                                        });

            instrument.area.Elements.Add(instrument.bBandUpExt = new ChartIndicatorElement()
                                        {
                                            Indicator = (IIndicator)instrument.strategy.upperBandExt,
                                            Title = "Верхняя линия Боллинджера",
                                            Color = Colors.Blue,
                                        });

            instrument.area.Elements.Add(instrument.bBandDownExt = new ChartIndicatorElement()
                                        {
                                            Indicator = (IIndicator)instrument.strategy.lowerBandExt,
                                            Title = "Нижняя линия Боллинджера",
                                            Color = Colors.Blue,
                                        });

            instrument.area.Elements.Add(instrument.tradesIndicator = new ChartTradeElement()
                                        {
                                            BuyColor = Colors.Green,
                                            SellColor = Colors.Red,
                                            IsLegend = true,
                                        });

            #endregion            

            ((TabItem)(stockCharts.Items.GetItemAt(0))).Focus();

            instrument.strategy.strategyTimeStarting = DateTime.Now;
            instrument.isFormed = true;
        }



Заранее признателен, уже замучился искать, почему у меня историческая эмуляшка не отрабатывает...

Tags:


Thanks:




6 Answers
Rebelion

Avatar
Training
Date: 7/1/2014
Reply


Сделал логирование в файл на ProcessDataError - получаю следующие сообщения массово. Хз, почему.

Текущее время 01/01/0001 10:00:00 должно быть в интервале от 06/24/2014 00:00:00 до 06/26/2014 00:00:00.
Имя параметра: currentTime
Текущее время 01/01/0001 10:00:00 должно быть в интервале от 06/24/2014 00:00:00 до 06/26/2014 00:00:00.
Имя параметра: currentTime
Текущее время 01/01/0001 10:00:00 должно быть в интервале от 06/24/2014 00:00:00 до 06/26/2014 00:00:00.
Имя параметра: currentTime
Текущее время 01/01/0001 10:00:00 должно быть в интервале от 06/24/2014 00:00:00 до 06/26/2014 00:00:00.
Имя параметра: currentTime
Текущее время 01/01/0001 10:00:00 должно быть в интервале от 06/24/2014 00:00:00 до 06/26/2014 00:00:00.
Topic starter
Thanks:

Rebelion

Avatar
Training
Date: 7/2/2014
Reply


Переставил гидру на версию 4.2.x.y - всё сразу заработало. 4.2.3.x версия работать с HistoryEmulator'ом не хочет хоть убей.
Topic starter
Thanks:

wednesday

Avatar
Date: 7/2/2014
Reply


Да. У меня точно такая же ошибка возникает при использовании тиковых данных из новой гидры в SampleHistoryTest 4.2.3.14.
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 7/2/2014
Reply


SampleHistoryTesting запускали?
Thanks:

wednesday

Avatar
Date: 7/2/2014
Reply


Да, у меня SampleHistoryTesting не работает с тиками загруженными с помощью новой версии гидры, но работает с тиками старых версий.
Thanks:

wednesday

Avatar
Date: 7/3/2014
Reply


Доброго дня. К сожалению в S# Api 4.2.3.20 в SampleHistoryTest ошибка сохранилась.Текст ошибки тот же:

00:00:00 до 07/03/2014 00:00:00.
Имя параметра: currentTime
в StockSharp.Algo.Testing.HistorySessionHolder.UpdateCurrentTime(DateTime currentTime)
в StockSharp.Algo.Testing.EmulationMessageAdapter.OnSendInMessage(Message message)
в StockSharp.Messages.MessageAdapter`1.OnInMessageProcessor(Message message, IMessageAdapter adapter)
2014/06/25 00:00:00.000|Error |HistoryEmulationConnector|System.ArgumentOutOfRangeException: Текущее время 01/01/0001 10:00:00 должно быть в интервале от 06/25/2014 00:00:00 до 07/03/2014 00:00:00.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy