← 戻る

Создание WeightedIndexSecurity из исторических данных (получить исторический спред 2-х инструментов)

Здравствуйте.

Подскажите, как правильно создать WeightedIndexSecurity из исторических данных?

Имею: Security _leg1Security = new Security() ; Security _leg2Security = new Security() ;

DateTime from = new DateTime(2017, 1, 3).ChangeKind(DateTimeKind.Utc); DateTime to = new DateTime(2017, 1, 4).ChangeKind(DateTimeKind.Utc);

private TimeSpan _timeFrame = TimeSpan.FromMinutes(1);

В переменных _leg1TimeFrameCandles и _leg2TimeFrameCandles исторические 1-мин свечи, загруженные из локального хранилища.

_portfolio = new Portfolio { Name = "Test Account", BeginValue = 1000000, };

WeightedIndexSecurity _spreadSecurity = new WeightedIndexSecurity() { Id = "Index1", Board = ExchangeBoard.Forts }; _spreadSecurity.Weights.Add(_leg1Security.Id.ToSecurityId(), Convert.ToDecimal(1)); _spreadSecurity.Weights.Add(_leg2Security.Id.ToSecurityId(), Convert.ToDecimal(-1));

        var securityList = new List<Security> { _spreadSecurity };
        var portfolioList = new List<Portfolio> { _portfolio };

_historyEmulationConnector = new HistoryEmulationConnector(securityList, portfolioList); _spreadCandleSeries = new CandleSeries(typeof(TimeFrameCandle), _spreadSecurity, TimeSpan.FromMinutes(1)) ;

        ConfigManager.RegisterService<ISecurityProvider>(_historyEmulationConnector);

        CandleManager _spreadCandleManager = new CandleManager(_historyEmulationConnector);

_spreadCandleManager.Processing += DrawSpreadCandle;

        _spreadCandleManager.Start(_spreadCandleSeries); (Исключение - System.InvalidOperationException: "Инструмент S#:SBER@TQBR, Native:,Type: не найден.")

private void DrawSpreadCandle(CandleSeries series, Candle candle) { Debug.WriteLine(string.Format("series= {0}, candle= {1}, candleseries= {2}", series.Security.Id, candle.Security.Id, _spreadCandleSeries.Security.Id));

        var data = new ChartDrawData();
        data.Group(candle.OpenTime).Add(_spreadChartCandleElement, candle);

        try
        {
            Chart.Draw(data);
        }
        catch (Exception ex)
        {
        }
    }

Как получить исторический спред этих 2-х инструментов?

コメント (17)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Support
Support

Добрый день.

Могли бы вы конкретизировать ваш вопрос? Если ваш вопрос как создавать индекс, то вы его задаёте правильно. Ещё можно использовать ExpressionIndexSecurity.

Дмитрий_
Дмитрий_ 著者

Ок.

Проблема на строчке _spreadCandleManager.Start(_spreadCandleSeries); (Исключение - System.InvalidOperationException: "Инструмент S#:SBER@TQBR, Native:,Type: не найден.")

1 вопрос. Как убрать исключение?

2 вопрос. Как получить переменную _spreadTimeFrameCandles = _leg1TimeFrameCandles - _leg2TimeFrameCandles ? (_leg1TimeFrameCandles и _leg2TimeFrameCandles исторические 1-мин свечи, загруженные из локального хранилища.)

Возможно разрешив вопрос 1, вопрос 2 отпадёт.

Support
Support

В конструктор HistoryConnector передаётся список доступных инструментов. Среди них нет необходимого. Поэтому возникает ошибка.

Так же вы можете напрямую загрузить свечи по индексу из хранилища.

Дмитрий_
Дмитрий_ 著者
  1. "В конструктор HistoryConnector передаётся список доступных инструментов. Среди них нет необходимого. Поэтому возникает ошибка." Перепроверил, все инструменты есть. Снимок.PNG Снимок1.PNG

Исключение Снимок3.PNG

Код _spreadSecurity, _historyEmulationConnector, _spreadCandleSeries, _spreadCandleManager. Снимок2.PNG

  1. "Так же вы можете напрямую загрузить свечи по индексу из хранилища." Вы имеете ввиду передачу загруженных свечей в _historyEmulationConnector, используя _historyEmulationConnector.RegisterHistorySource?
Support
Support

Можно загрузить данные напрямую из хранилища, используя Storage API

Дмитрий_
Дмитрий_ 著者

Данные Sber и sberp, я загружаю из локального хранилища. Но данных их спреда (разницы) у меня в хранилище нет.

Дмитрий_
Дмитрий_ 著者

Мне нужно сохранить данные спреда в локальном хранилище?

Support
Support

Вы можете строить спред напрямую из хранящихся у вас данных. Storage API умеет строить сразу для индексов данные их компонентов.

Дмитрий_
Дмитрий_
Дмитрий_ 著者

Возможно я что-то просмотрел в документации. Будьте добры, скиньте пожалуйста ссылку на документацию или на код.

Support
Support

http://doc.stocksharp.ru/html/e4a57b52-bd14-4640-a7c7-0979dba1ad0a.htm

Индексные инструменты поддерживаются как обычные.

Дмитрий_
Дмитрий_ 著者

Спасибо за ссылку. Я перечитал её, и не смог найти информацию по построению спреда напрямую из хранящихся у меня данных, но по находящимся там ссылкам нашёл, то что связано со Storage и IndexSecurity. Это класс IndexSecurityMarketDataStorage<T> http://doc.stocksharp.ru/html/T_StockSharp_Algo_Storages_IndexSecurityMarketDataStorage_1.htm О нём шла речь?

С Наступающим Вас!

Support
Support

Хранилище работает с индексом как с обычным инструментом. Отдельно для каждого типа инструмента нет документации так как хранилище универсальное.

Дмитрий_
Дмитрий_ 著者

_leg1TimeFrameCandles = LoadTimeFrameCandlesFromStorage(_leg1Security, _timeFrame, HistoryPath.Folder.ToFullPath(), StorageFormats.Binary, new DateTimeOffset(from), new DateTimeOffset(to));

        _leg2TimeFrameCandles = LoadTimeFrameCandlesFromStorage(_leg2Security,
            _timeFrame,
            HistoryPath.Folder.ToFullPath(),
            StorageFormats.Binary,
            new DateTimeOffset(from),
            new DateTimeOffset(to));

        WeightedIndexSecurity _spreadTestSecurity = new WeightedIndexSecurity()
        {
            Id = "Index1",
            Type= SecurityTypes.Stock,
            Board = ExchangeBoard.MicexTqbr
        };
        _spreadTestSecurity.Weights.Add(_leg1Security.Id.ToSecurityId(), Convert.ToDecimal(1));
        _spreadTestSecurity.Weights.Add(_leg2Security.Id.ToSecurityId(), Convert.ToDecimal(-1));

        _spreadTestTimeFrameCandles = LoadTimeFrameCandlesFromStorage(_spreadTestSecurity,
            _timeFrame,
            HistoryPath.Folder.ToFullPath(),
            StorageFormats.Binary,
            new DateTimeOffset(from),
            new DateTimeOffset(to));

private IEnumerable<Candle> LoadTimeFrameCandlesFromStorage(Security security, TimeSpan timeframe, string path, StorageFormats format, DateTimeOffset from, DateTimeOffset to) { var storageRegistry = new StorageRegistry(); var storage = storageRegistry.GetCandleStorage(typeof(TimeFrameCandle), security, timeframe, new LocalMarketDataDrive(path), format);

        return storage.Load(from, to);
    }

Capture.PNGCapture1.PNGCapture2.PNG

C помощью метода LoadTimeFrameCandlesFromStorage загружаю свечи: _leg1TimeFrameCandles - Ок, _leg2TimeFrameCandles - Ок, _spreadTestTimeFrameCandles - не Ок, хотя с индексом работаю как с обычным инструментом. Я что-то путаю?

Дмитрий_
Дмитрий_ 著者

Аналогична ситуация и с ExpressionIndexSecurity _spreadTestSecurity = new ExpressionIndexSecurity() { Id = "Index1", Expression = "SBER@TQBR-SBERP@TQBR", Type = SecurityTypes.Stock, Board = ExchangeBoard.MicexTqbr };

Support
Support

Дмитрий Антипов: Аналогична ситуация и с ExpressionIndexSecurity _spreadTestSecurity = new ExpressionIndexSecurity() { Id = "Index1", Expression = "SBER@TQBR-SBERP@TQBR", Type = SecurityTypes.Stock, Board = ExchangeBoard.MicexTqbr };

Для этого необходимо использовать специальные компилятор, зарегистрированный при старте программы:

ConfigManager.RegisterService<ICompilerService>(new RoslynCompilerService());
Дмитрий_
Дмитрий_ 著者

Детальная информация Снимок.PNG Снимок1.PNG Данных не найдено Снимок2.PNG Обращается по пути, которого нет Снимок3.PNG Снимок4.PNG

WeightedIndexSecurity _spreadTestSecurity = new WeightedIndexSecurity() { Id = "Index1", Type= SecurityTypes.Stock, Board = ExchangeBoard.MicexTqbr }; _spreadTestSecurity.Weights.Add(_leg1Security.Id.ToSecurityId(), Convert.ToDecimal(1)); _spreadTestSecurity.Weights.Add(_leg2Security.Id.ToSecurityId(), Convert.ToDecimal(-1));

Иван З.
Support
Support

Добрый день

Попробуйте такой код

var basketStorage = new IndexSecurityMarketDataStorage<CandleMessage>(_spreadTestSecurity, tf);

basketStorage.InnerStorages.Add(storageRegistry.GetCandleStorage(typeof(TimeFrameCandle), _leg1Security, tf, new LocalMarketDataDrive(path)));
basketStorage.InnerStorages.Add(storageRegistry.GetCandleStorage(typeof(TimeFrameCandle), _leg2Security, tf, new LocalMarketDataDrive(path)));

var candles = basketStorage.Load(from, to);
Иван З. Дмитрий_