Для изменения размера нажмите или перетащите

Свечи

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

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

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

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

sample timeframecandles
sample rangecandles

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

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

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

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

    C#
    _connector.CandleSeriesProcessing += Connector_CandleSeriesProcessing;
    ...
    
    private void Connector_CandleSeriesProcessing(CandleSeries candleSeries, Candle candle)
    {
        Chart.Draw(_candleElement, candle);
    }
    
    ...
    Примечание Примечание
    Для отображения свечей используется графический компонент Chart.
  3. Далее передаём в коннектор созданную серию свечей и запускаем получение данных через SubscribeCandles:

    C#
    ...
    _connector.SubscribeCandles(_candleSeries, DateTime.Today.Subtract(TimeSpan.FromDays(30)), DateTime.Now);    
    ...

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

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

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

    C#
    ...
    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 можно задать некоторые свойства:

    • BuildCandlesMode задает режим построения свечей. По умолчанию задан LoadAndBuild, что говорит о том, что будут запрошены готовые данные, или построены из заданного в свойстве BuildCandlesFrom типа данных. Также можно установить Load для запроса только готовых данных. Или Build, для построения из заданного в свойстве BuildCandlesFrom типа данных без запроса готовых данных.

    • При построении свечей необходимо задать свойство BuildCandlesFrom, которое говорит о том, какой именно тип данных используется как источник (Level1, MarketDepth, Trades и тд. ).

    • Для некоторых типов данных необходимо дополнительно указать свойство BuildCandlesField, из которого будут построены данные. Например, для Level1 можно указать BestAskPrice, что говорт о том, что свечи будут строиться из свойства BestAskPrice данных Level1.

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

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

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

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

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

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

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

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

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

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

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

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

      C#
      _candleSeries = new CandleSeries(typeof(PnFCandle), security, new PnFArg() { BoxSize = 0.1m, ReversalAmount =1})
      {
          BuildCandlesMode = MarketDataBuildModes.Build,
          BuildCandlesFrom = MarketDataTypes.Trades,
      };
Следующие шаги