Table of Contents

Свечи

S# поддерживает следующие виды:

  • TimeFrameCandle - свеча на основе временного отрезка, таймфрейма. Можно задавать как популярные отрезки (минутки, часовики, дневные), так и кастомизированные. Например, 21 секунда, 4.5 минуты и т.д.
  • RangeCandle - свеча ценового разброса. Новая свеча создается, когда появляется сделка с ценой, выходящей за допустимые пределы. Допустимый предел формируется каждый раз на основе цены первой сделки.
  • VolumeCandle - свеча формируется до тех пор, пока суммарно по сделкам не будет превышен объем. Если новая сделка превышает допустимый объем, то она попадает уже в новую свечу.
  • TickCandle - то же самое, что и VolumeCandle, только в качестве ограничения вместо объема берется количество сделок.
  • PnFCandle - свеча пункто-цифрового графика (график крестики-нолики).
  • RenkoCandle - Рэнко свеча.

Как работать со свечами, показано в примере SampleConnection, который расположен в папке Samples/Common/SampleConnection.

На следующих рисунках представлены графики TimeFrameCandle и RangeCandle:

sample timeframecandles

sample rangecandles

Запуск получения данных

  1. Создадим серию свечей CandleSeries:

    ...
    _candleSeries = new CandleSeries(CandleSettingsEditor.Settings.CandleType, security, CandleSettingsEditor.Settings.Arg);
    ...		
    
    
  2. Все необходимые методы для получения свечей реализованы в классе Connector.

    Для получения свечей необходимо подписаться на событие Connector.CandleSeriesProcessing, сигнализирующее о появлении нового значения для обработки:

    _connector.CandleSeriesProcessing += Connector_CandleSeriesProcessing;
    ...
    private void Connector_CandleSeriesProcessing(CandleSeries candleSeries, Candle candle)
    {
     Chart.Draw(_candleElement, candle);
    }
    ...
    
    
    Tip

    Для отображения свечей используется графический компонент Chart.

  3. Далее передаём в коннектор созданную серию свечей и запускаем получение данных через Connector.Subscribe(StockSharp.Algo.Subscription subscription ):

    ...
    _connector.Subscribe(_candleSeries);
    ...
    
    
    

    После этого этапа начнёт вызываться событие Connector.CandleSeriesProcessing.

  4. Событии Connector.CandleSeriesProcessing вызывается не только при появлении новой свечи, но и при изменении текущей.

    Если же нужно отображать только "целые" свечи, то необходимо проверить свойство Candle.State пришедшей свечи:

    ...
    private void Connector_CandleSeriesProcessing(CandleSeries candleSeries, Candle candle)
    {
        if (candle.State == CandleStates.Finished) 
        {
           var chartData = new ChartDrawData();
           chartData.Group(candle.OpenTime).Add(_candleElement, candle);
           Chart.Draw(chartData);
        }
    }
    ...
    
    
  5. Для CandleSeries можно задать некоторые свойства:

  6. Рассмотрим несколько примеров построения разных типов свечей:

    • Так как большинство источников предоставляют свечи стандартных таймфреймом, то для получения таких свечей достаточно задать тип и таймфрейм:

      _candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromMinutes(5));
      
      
    • Если необходимо просто загрузить готовые свечи, то необходимо задать свойство CandleSeries.BuildCandlesMode в MarketDataBuildModes.Load:

      _candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromMinutes(5))
      {
         BuildCandlesMode = MarketDataBuildModes.Load,
      };	
      
      
    • Если источник не предоставляет свечей необходимого таймфрейма, то их можно построить из других маркет данных. Ниже приведен приме построения свечей с таймфреймом 21 секунда из сделок:

      _candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromSeconds(21))
      {
         BuildCandlesMode = MarketDataBuildModes.Build,
         BuildCandlesFrom = MarketDataTypes.Trades,
      };	
      
      
    • Если источник данных не предоставляет ни свечей, ни сделок свечи можно построить из спреда стакана:

      _candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromSeconds(21))
      {
         BuildCandlesMode = MarketDataBuildModes.Build,
         BuildCandlesFrom = MarketDataTypes.MarketDepth,
         BuildCandlesField = Level1Fields.SpreadMiddle,
      };	
      
      
    • Так как не существует источников, предоставляющих готового профиля объема, его тоже необходимо строить из другого типа данных. Для прорисовки профиля объема необходимо установить свойство CandleSeries.IsCalcVolumeProfile в true, а также CandleSeries.BuildCandlesMode в MarketDataBuildModes.Build. И указать тип данных из которого будет построен профиль объема. В данном случае это MarketDataTypes.Trades:

      _candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromMinutes(5))
      {
         BuildCandlesMode = MarketDataBuildModes.Build,
         BuildCandlesFrom = MarketDataTypes.Trades,
          IsCalcVolumeProfile = true,
      };	
      
      
    • Так как большинство источников данных не предоставляют готовые свечей, кроме TimeFrameCandle, то остальные типы свечей строятся аналогично профилю объема. Необходимо указать свойство CandleSeries.BuildCandlesMode в MarketDataBuildModes.Build или MarketDataBuildModes.LoadAndBuild. А также задать свойство CandleSeries.BuildCandlesFrom и свойство CandleSeries.BuildCandlesField если необходимо.

      Следующий код демонстрирует построение VolumeCandle с объемом в 1000 контрактов. В качестве источника данных для построения используется середина спреда стакана.

      _candleSeries = new CandleSeries(typeof(VolumeCandle), security, 1000m)
      {
         BuildCandlesMode = MarketDataBuildModes.LoadAndBuild,
         BuildCandlesFrom = MarketDataTypes.MarketDepth,
         BuildCandlesField = Level1Fields.SpreadMiddle,
      };
      
      
    • Следующий код демонстрирует построение TickCandle в 1000 сделок. В качестве источника данных для построения используются сделки.

      
      _candleSeries = new CandleSeries(typeof(TickCandle), security, 1000)
      {
         BuildCandlesMode = MarketDataBuildModes.Build,
         BuildCandlesFrom = MarketDataTypes.Trades,
      };
      
      
    • Следующий код демонстрирует построение RangeCandle с диапазоном в 0.1 у.е. В качестве источника данных для построения используется лучшая покупка стакана:

      _candleSeries = new CandleSeries(typeof(RangeCandle), security, new Unit(0.1m))
      {
         BuildCandlesMode = MarketDataBuildModes.LoadAndBuild,
          BuildCandlesFrom = MarketDataTypes.MarketDepth,
          BuildCandlesField = Level1Fields.BestBid,
      };
      
      
    • Следующий код демонстрирует построение RenkoCandle. В качестве источника данных для построения используется цена последней сделки из Level1:

      _candleSeries = new CandleSeries(typeof(RenkoCandle), security, new Unit(0.1m))
      {
         BuildCandlesMode = MarketDataBuildModes.LoadAndBuild,
          BuildCandlesFrom = MarketDataTypes.Level1,
          BuildCandlesField = Level1Fields.LastTradePrice,
      };
      
      
    • Следующий код демонстрирует построение PnFCandle. В качестве источника данных для построения используются сделки.

      _candleSeries = new CandleSeries(typeof(PnFCandle), security, new PnFArg() { BoxSize = 0.1m, ReversalAmount =1})
      {
         BuildCandlesMode = MarketDataBuildModes.Build,
         BuildCandlesFrom = MarketDataTypes.Trades,
      };	
      
      

Следующие шаги

График

Паттерны

Собственный тип свечей