Здравствуйте.
Подскажите, как правильно создать 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)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Добрый день.
Могли бы вы конкретизировать ваш вопрос? Если ваш вопрос как создавать индекс, то вы его задаёте правильно. Ещё можно использовать ExpressionIndexSecurity.
Ок.
Проблема на строчке _spreadCandleManager.Start(_spreadCandleSeries); (Исключение - System.InvalidOperationException: "Инструмент S#:SBER@TQBR, Native:,Type: не найден.")
1 вопрос. Как убрать исключение?
2 вопрос. Как получить переменную _spreadTimeFrameCandles = _leg1TimeFrameCandles - _leg2TimeFrameCandles ? (_leg1TimeFrameCandles и _leg2TimeFrameCandles исторические 1-мин свечи, загруженные из локального хранилища.)
Возможно разрешив вопрос 1, вопрос 2 отпадёт.
В конструктор HistoryConnector передаётся список доступных инструментов. Среди них нет необходимого. Поэтому возникает ошибка.
Так же вы можете напрямую загрузить свечи по индексу из хранилища.
Исключение
Код _spreadSecurity, _historyEmulationConnector, _spreadCandleSeries, _spreadCandleManager.
Можно загрузить данные напрямую из хранилища, используя Storage API
Данные Sber и sberp, я загружаю из локального хранилища. Но данных их спреда (разницы) у меня в хранилище нет.
Мне нужно сохранить данные спреда в локальном хранилище?
Вы можете строить спред напрямую из хранящихся у вас данных. Storage API умеет строить сразу для индексов данные их компонентов.
Возможно я что-то просмотрел в документации. Будьте добры, скиньте пожалуйста ссылку на документацию или на код.
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 О нём шла речь?
С Наступающим Вас!
Хранилище работает с индексом как с обычным инструментом. Отдельно для каждого типа инструмента нет документации так как хранилище универсальное.
_leg1TimeFrameCandles = LoadTimeFrameCandlesFromStorage(_leg1Security, _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);
C помощью метода LoadTimeFrameCandlesFromStorage загружаю свечи: _leg1TimeFrameCandles - Ок, _leg2TimeFrameCandles - Ок, _spreadTestTimeFrameCandles - не Ок, хотя с индексом работаю как с обычным инструментом. Я что-то путаю?
Аналогична ситуация и с ExpressionIndexSecurity _spreadTestSecurity = new ExpressionIndexSecurity() { Id = "Index1", Expression = "SBER@TQBR-SBERP@TQBR", Type = SecurityTypes.Stock, Board = ExchangeBoard.MicexTqbr };
Для этого необходимо использовать специальные компилятор, зарегистрированный при старте программы:
Детальная информация
Данных не найдено
Обращается по пути, которого нет

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));
Добрый день
Попробуйте такой код