Добрый день. Как зарегистрировать свой CandleBuilder? Следующий код _connector.Adapter.CandleBuilderProvider.Register(new TickCandleBuilder()); - НЕРАБОЧИЙ
Спасибо.
Комментарии (4)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.
В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код.
Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно.
Т.е. в сумме:
Регистрируем в платформе свои типы сообщений и маркет даты.
Регистрируем в системном конвертере сообщений (MessageConverterHelper) свои типы.
Регистрируем свой тип свечей в системном классе StockSharp.Messages.Extensions
Как правильно делать сообщения, аргументы свечей, билдер тоже нужно смотреть не в примерах, а в исходниках библиотеки.
public static class ExtendedDataTypes
{
public static MarketDataTypes CandleRangeXV => (MarketDataTypes)1001;
}
public static class ExtendedMessageTypes
{
public static MessageTypes CandleRangeXV => (MessageTypes)1001;
}
.......
private static void RegisterCandles(Connector connector)
{
RegisterCandle(
connector,
new RangeXVCandleBuilder(new InMemoryExchangeInfoProvider()),
() => new RangeXVCandle(),
() => new RangeXVCandleMessage(),
ExtendedMessageTypes.CandleRangeXV,
ExtendedDataTypes.CandleRangeXV,
str => str.ToUnit(),
arg => arg.ToString());
}
private static void RegisterCandle<TCandle, TMessage, Arg>(Connector connector,
ICandleBuilder candleBuilder,
Func<TCandle> candleCreator,
Func<TMessage> candleMessageCreator,
MessageTypes messageType,
MarketDataTypes dataType,
Func<string, Arg> argParserTo,
Func<Arg, string> argParserFrom) where TCandle : Candle where TMessage : CandleMessage
{
var provider = connector.Adapter.StorageProcessor.CandleBuilderProvider;
var candleType = candleCreator().GetType();
var candleMessageType = candleMessageCreator().GetType();
var candleFileName = candleMessageType.Name.Remove(nameof(Message));
provider.Register(candleBuilder);
if (!MessageConverterHelper.AllCandleTypes.Contains(candleType))
{
MessageConverterHelper.RegisterCandle(candleCreator, candleMessageCreator);
StockSharp.Messages.Extensions.RegisterCandleType(candleMessageType, messageType, dataType, candleFileName, argParserTo, argParserFrom);
}
}
}
Учитывая что это не задокументировано, то с каждым апдейтом надо проверять на работоспособность.
sprite:
Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.
В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код.
Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно.
Т.е. в сумме:
Регистрируем в платформе свои типы сообщений и маркет даты.
Регистрируем в системном конвертере сообщений (MessageConverterHelper) свои типы.
Регистрируем свой тип свечей в системном классе StockSharp.Messages.Extensions
Как правильно делать сообщения, аргументы свечей, билдер тоже нужно смотреть не в примерах, а в исходниках библиотеки.
public static class ExtendedDataTypes
{
public static MarketDataTypes CandleRangeXV => (MarketDataTypes)1001;
}
public static class ExtendedMessageTypes
{
public static MessageTypes CandleRangeXV => (MessageTypes)1001;
}
.......
private static void RegisterCandles(Connector connector)
{
RegisterCandle(
connector,
new RangeXVCandleBuilder(new InMemoryExchangeInfoProvider()),
() => new RangeXVCandle(),
() => new RangeXVCandleMessage(),
ExtendedMessageTypes.CandleRangeXV,
ExtendedDataTypes.CandleRangeXV,
str => str.ToUnit(),
arg => arg.ToString());
}
private static void RegisterCandle<TCandle, TMessage, Arg>(Connector connector,
ICandleBuilder candleBuilder,
Func<TCandle> candleCreator,
Func<TMessage> candleMessageCreator,
MessageTypes messageType,
MarketDataTypes dataType,
Func<string, Arg> argParserTo,
Func<Arg, string> argParserFrom) where TCandle : Candle where TMessage : CandleMessage
{
var provider = connector.Adapter.StorageProcessor.CandleBuilderProvider;
var candleType = candleCreator().GetType();
var candleMessageType = candleMessageCreator().GetType();
var candleFileName = candleMessageType.Name.Remove(nameof(Message));
provider.Register(candleBuilder);
if (!MessageConverterHelper.AllCandleTypes.Contains(candleType))
{
MessageConverterHelper.RegisterCandle(candleCreator, candleMessageCreator);
StockSharp.Messages.Extensions.RegisterCandleType(candleMessageType, messageType, dataType, candleFileName, argParserTo, argParserFrom);
}
}
}
Учитывая что это не задокументировано, то с каждым апдейтом надо проверять на работоспособность.
Благодарю за ответ) О не покажите реализацию классов: RangeXVCandleBuilder, RangeXVCandle, RangeXVCandleMessage?
Комментарии (4)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.
В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код. Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно. Т.е. в сумме:
Регистрируем в платформе свои типы сообщений и маркет даты.
Регистрируем в системном конвертере сообщений (MessageConverterHelper) свои типы.
Регистрируем свой тип свечей в системном классе StockSharp.Messages.Extensions
Как правильно делать сообщения, аргументы свечей, билдер тоже нужно смотреть не в примерах, а в исходниках библиотеки.
public static class ExtendedDataTypes { public static MarketDataTypes CandleRangeXV => (MarketDataTypes)1001; }
public static class ExtendedMessageTypes { public static MessageTypes CandleRangeXV => (MessageTypes)1001; } ....... private static void RegisterCandles(Connector connector) { RegisterCandle( connector, new RangeXVCandleBuilder(new InMemoryExchangeInfoProvider()), () => new RangeXVCandle(), () => new RangeXVCandleMessage(), ExtendedMessageTypes.CandleRangeXV, ExtendedDataTypes.CandleRangeXV, str => str.ToUnit(), arg => arg.ToString()); }
}
Учитывая что это не задокументировано, то с каждым апдейтом надо проверять на работоспособность.
Благодарю за ответ) О не покажите реализацию классов: RangeXVCandleBuilder, RangeXVCandle, RangeXVCandleMessage?
Супер!!!! Спасибо Вам ОГРОМНЕЙШЕЕ. Буду разбираться