S#

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


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


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

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

Имею:
Security _leg1Security = new Security() { Id = "SBER@TQBR" };
Security _leg2Security = new Security() { Id = "SBERP@TQBR" };

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)) { BuildCandlesMode = BuildCandlesModes.Build };

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

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


Добрый день.

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

Дмитрий Антипов

Фотография
Курсы
Дата: 26.12.2017
Ответить


Ок.

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

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

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

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

Support

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


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

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

Дмитрий Антипов

Фотография
Курсы
Дата: 27.12.2017
Ответить


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

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

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

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


Автор топика
Спасибо:

Support

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


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

Дмитрий Антипов

Фотография
Курсы
Дата: 28.12.2017
Ответить


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

Дмитрий Антипов

Фотография
Курсы
Дата: 28.12.2017
Ответить


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

Support

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


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

Дмитрий Антипов

Фотография
Курсы
Дата: 28.12.2017
Ответить


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

Support

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


http://doc.stocksharp.ru...0-a7c7-0979dba1ad0a.htm

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

Дмитрий Антипов

Фотография
Курсы
Дата: 31.12.2017
Ответить


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

С Наступающим Вас!
Автор топика
Спасибо:

Support

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


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

Дмитрий Антипов

Фотография
Курсы
Дата: 05.01.2018
Ответить


_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 - не Ок, хотя с индексом работаю как с обычным инструментом. Я что-то путаю?
Автор топика
Спасибо:

Дмитрий Антипов

Фотография
Курсы
Дата: 05.01.2018
Ответить


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

Дмитрий Антипов

Фотография
Курсы
Дата: 09.01.2018
Ответить


Детальная информация
Снимок.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

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


Добрый день

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

Код
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);
Спасибо: Иван З. Дмитрий Антипов

Support

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


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


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

Код
ConfigManager.RegisterService<ICompilerService>(new RoslynCompilerService());


Спасибо: Иван З. Дмитрий Антипов


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

loading
clippy