← Zurück

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

Камрады, стал мигрировать с 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;
        }


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

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

Rebelion
Rebelion Autor

Сделал логирование в файл на 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.

Mikhail Sukhov
Mikhail Sukhov

SampleHistoryTesting запускали?

Rebelion
Rebelion Autor

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

wednesday
wednesday

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

wednesday
wednesday

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

wednesday
wednesday

Доброго дня. К сожалению в 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.