Время заявок и сделок отстает от исторического при тестировании

Время заявок и сделок отстает от исторического при тестировании
Atom
15.04.2013
Roma


Время заявок и сделок отстает от исторического при тестировании. Использую EmulationTrader, данные загружаю из истории, закаченой через Гидру. В чем причина, как сделать правильно? Далее куски кода.

private void EmulateClick(object sender, RoutedEventArgs e)
        {
            if (!Directory.Exists(tbPathHistory.Text))
            {
                System.Windows.MessageBox.Show(string.Format("Directory is not found: {0}", tbPathHistory.Text));
                return;
            }

            // хранилище, через которое будет производиться доступ к тиковой и котировочной базе 
            var storageRegistry = new StorageRegistry();

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

            // используем алфавитное хранилище
            ((LocalMarketDataDrive)storageRegistry.DefaultDrive).UseAlphabeticPath = true;

            //===============
            
            // создаем тестовый инструмент, на котором будет производится тестирование 
            _security = new Security
            {
                Id = tbSecurityId.Text,//"RIZ2@RTS",
                // по идентификатору инструмента будет искаться папка с историческими маркет данными
                Code = tbSecurityCode.Text,//"RIZ2",
                Name = tbSecurityName.Text,//"RTS-12.12",
                ExchangeBoard = (ExchangeBoard)cbSecurityExchangeBoard.SelectedItem,//ExchangeBoard.Forts,
            };

            // тестовый портфель 
            _portfolio = new Portfolio { Name = tbPortfolioName.Text, BeginValue = decimal.Parse(tbPortfolioBeginValue.Text) };

            // создаем шлюз для эмуляции 
            // инициализируем настройки (инструмент в истории обновляется раз в секунду) 
            _trader = new EmulationTrader(
                new[] { _security },
                new[] { _portfolio },
                storageRegistry)
            {
                MarketTimeChangedInterval = tpTimeFrame.Value.Value.TimeOfDay,
            };

            _trader.Connect();
            _trader.StartExport();           
        }


_candleSeries.ProcessCandle += candle =>
            {
                //Debug.Print("{0}", candle);

                var candleBounds = timeFrame.GetCandleBounds(_candleSeries.Security);

                if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounds.Min)
                {
                    var valueSma = _indicatorSma.Process(candle);
                    var chartValueSma = new ChartIndicatorValue(_indicatorSma, valueSma);

                    var valueStohastic = _indicator.Process(candle);
                    var chartValueStohastic = new ChartIndicatorValue(_indicator, valueStohastic);

                    this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>()
                        {
                            {_chartCandleElement, candle},
                            {_chartIndicatorSmaElement, chartValueSma},
                            {_chartIndicatorStohasticElement, chartValueStohastic}
                        }));
                }
            };


strategy.WhenNewMyTrades()
                        .Do(mytrades => this.GuiAsync(
                            () =>
                                {
                                    Debug.WriteLine("NewMyTrades: " + mytrades.Count());
                                    mytrades.ForEach(
                                        t => Chart.ProcessValues(t.Trade.Time, new Dictionary<IChartElement, object>()
                                            {
                                                {_tradeElement, t}
                                            }));
                                }))
                            .Apply();

strategy.WhenOrderRegistered()
                       .Do(order =>
                           {
                               Debug.WriteLine("OrderRegistered: " + order.Volume.ToString());
                               this.GuiAsync(
                                   () => Chart.ProcessValues(order.Time, new Dictionary<IChartElement, object>()
                                       {
                                           {_orderElement, order}
                                       }));

                           })
                       .Apply();




Спасибо:


Roma

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


Я вышел из ситуации приавлением целого числа 6 к времени при отрисовки метки заявки и сделки, код:


strategy.WhenNewMyTrades()
                        .Do(mytrades => this.GuiAsync(
                            () =>
                                {
                                    Debug.WriteLine("NewMyTrades: " + mytrades.Count());
                                    mytrades.ForEach(
                                        t => Chart.ProcessValues(t.Trade.Time+TimeSpan.FromHours(6), new Dictionary<IChartElement, object>()
                                            {
                                                {_tradeElement, t}
                                            }));
                                }))
                            .Apply();

strategy.WhenOrderRegistered()
                       .Do(order =>
                           {
                               Debug.WriteLine("OrderRegistered: " + order.Volume.ToString());
                               this.GuiAsync(
                                   () => Chart.ProcessValues(order.Time+TimeSpan.FromHours(6), new Dictionary<IChartElement, object>()
                                       {
                                           {_orderElement, order}
                                       }));

                           })
                       .Apply();

Спасибо:

Иван З.

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


Здравствуйте! Посмотрите вот здесь, может поможет. http://www.stocksharp.com/forum/3324/Raznoie-vriemia/

Спасибо:

Moadip

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


Траблы возникают, если временнАя зона компа отлична от московской. Чтобы в логах и у сделок время было правильное надо сделать следующее:

У инструментов надо выставлять:

ExchangeBoard = ExchangeBoard.Forts

Сделать наследника от EmulationTrader и в нем переопределить GetMarketTime


	public class EmulationTraderEx : EmulationTrader
	{
		public override DateTime GetMarketTime(Exchange exchange)
		{
			return MarketEmulator.CurrentTime;
		}
	}

Временная зона эмулятора - Москва. TimeSpan.FromHours(4) потому что лето.


EmulationTraderEx trader;

...

((MarketEmulator)trader.MarketEmulator).EmulatorTimeZone = TimeZoneInfo.CreateCustomTimeZone("Custom", TimeSpan.FromHours(4), "Custom", "Custom");

Спасибо:


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

loading
clippy