Trading algorítmico para .NET y Python✦86+ conectores · exchanges · brókers · cripto✦S#.Designer · backtest · optimizar · en vivo✦Una comunidad de 31,451+ traders y desarrolladores✦Trading algorítmico para .NET y Python✦86+ conectores · exchanges · brókers · cripto✦S#.Designer · backtest · optimizar · en vivo✦Una comunidad de 31,451+ traders y desarrolladores✦
Добрый день. Как зарегистрировать свой CandleBuilder? Следующий код _connector.Adapter.CandleBuilderProvider.Register(new TickCandleBuilder()); - НЕРАБОЧИЙ
Спасибо.
Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.
В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код.
Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно.
Т.е. в сумме:
Регистрируем в платформе свои типы сообщений и маркет даты.
Регистрируем в системном конвертере сообщений (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?
Comentarios (4)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.
В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код. Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно. Т.е. в сумме:
Регистрируем в платформе свои типы сообщений и маркет даты.
Регистрируем в системном конвертере сообщений (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?
Супер!!!! Спасибо Вам ОГРОМНЕЙШЕЕ. Буду разбираться