Sprite
|
Date: 5/7/2021
|
|
|
|
Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.
В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код. Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно. Т.е. в сумме: 1. Регистрируем в платформе свои типы сообщений и маркет даты. 2. Регистрируем в системном конвертере сообщений (MessageConverterHelper) свои типы. 3. Регистрируем свой тип свечей в системном классе StockSharp.Messages.Extensions 4. Как правильно делать сообщения, аргументы свечей, билдер тоже нужно смотреть не в примерах, а в исходниках библиотеки.
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); } } }
Учитывая что это не задокументировано, то с каждым апдейтом надо проверять на работоспособность.
|
Greenn
|
Date: 5/7/2021
|
|
|
|
sprite Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.
В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код. Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно. Т.е. в сумме: 1. Регистрируем в платформе свои типы сообщений и маркет даты. 2. Регистрируем в системном конвертере сообщений (MessageConverterHelper) свои типы. 3. Регистрируем свой тип свечей в системном классе StockSharp.Messages.Extensions 4. Как правильно делать сообщения, аргументы свечей, билдер тоже нужно смотреть не в примерах, а в исходниках библиотеки.
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?
|