← Zurück

Как зарегистрировать свой CandleBuilder?

Добрый день. Как зарегистрировать свой CandleBuilder? Следующий код _connector.Adapter.CandleBuilderProvider.Register(new TickCandleBuilder()); - НЕРАБОЧИЙ Спасибо.

War dieses Thema hilfreich?

Thema teilen

Kommentare (4)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Sprite
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);
         }
     }
    

    }

Учитывая что это не задокументировано, то с каждым апдейтом надо проверять на работоспособность.

Greenn
Greenn
Greenn Autor

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?

Greenn
Greenn Autor

sprite:

Greenn: Благодарю за ответ) О не покажите реализацию классов: RangeXVCandleBuilder, RangeXVCandle, RangeXVCandleMessage? https://github.com/StockSharp/StockSharp/blob/master/Algo/Candles/Compression/CandleBuilder.cs#L607 https://github.com/StockSharp/StockSharp/blob/master/Messages/CandleMessage.cs#L495 https://github.com/StockSharp/StockSharp/blob/master/Algo/Candles/Candle.cs#L427

Супер!!!! Спасибо Вам ОГРОМНЕЙШЕЕ. Буду разбираться