Здравствуйте.
Подскажите, как правильно создать 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-х инструментов?
Comments (17)
Login or Create account, Log in or register to leave a comment
Добрый день.
Могли бы вы конкретизировать ваш вопрос? Если ваш вопрос как создавать индекс, то вы его задаёте правильно. Ещё можно использовать 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));
Добрый день
Попробуйте такой код