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

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


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

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

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

[code=csharp]

    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);
    }

[/code]

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

[code=csharp] 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;
    }

[/code]

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


Теги:


Спасибо:


Rebelion

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


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

Спасибо:

Rebelion

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


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

Спасибо:

wednesday

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


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

Спасибо:

Mikhail Sukhov

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


SampleHistoryTesting запускали?

Спасибо:

wednesday

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


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

Спасибо:

wednesday

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


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

Спасибо:


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

loading
clippy