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

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


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




Спасибо:


Sprite

Фотография
Дата: 07.05.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

Greenn

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


[quote=sprite;56148]Документация давно не соответствует актуальному коду. Как это сделать можно понять только путем изучения регистрации встроенных свечей в платформе.

В общем мне пришлось долго возиться чтобы понять что там внутри к чему, но в итоге получил рабочий код. Извиняюсь что выдрал из кода приложения, со спецификой не относящейся к сути вопроса, но думаю понять что нужно сделать можно. Т.е. в сумме:

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

    }

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

Благодарю за ответ) О не покажите реализацию классов: RangeXVCandleBuilder, RangeXVCandle, RangeXVCandleMessage?

Спасибо:

Sprite

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


[quote=Greenn;56149]Благодарю за ответ) О не покажите реализацию классов: RangeXVCandleBuilder, RangeXVCandle, RangeXVCandleMessage?[/quote] 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

Спасибо: Greenn

Greenn

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


[quote=sprite;56150][quote=Greenn;56149]Благодарю за ответ) О не покажите реализацию классов: RangeXVCandleBuilder, RangeXVCandle, RangeXVCandleMessage?[/quote] 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

[/quote]

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

Спасибо:


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

loading
clippy