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

S# поддерживает 6 видов свечей:

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

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

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

sample timeframecandles
sample rangecandles

Создание CandleManager и запуск получения данных

  1. В самом начале необходимо создать менеджер свечей CandleManager, который, подписываясь на событие IConnectorNewTrades, будет формировать свечи:

    C#
    _trader = new QuikTrader(this.Path.Text);
    _trader.Connect();
    
    ...
    
    _candleManager = new CandleManager(_trader);
    Примечание Примечание

    Если для получения тиковых сделок вместо шлюза IConnector используется источник с другим механизмом, то необходимо реализовать интерфейс StockSharp.Algo.CandlesICandleManagerSource, и передать реализацию в CandleManagerSources.

    В S# существуют следующие реализации данного интерфейса

    Которые стандартно идут в качестве CandleManagerSources при создании CandleManager.

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

    C#
    _candleManager.Processing += DrawCandle;
    
    private void DrawCandle(CandleSeries series, Candle candle)
    {
         ...
    
        wnd.Chart.Draw((ChartCandleElement)wnd.Chart.Areas[0].Elements[0], candle);
    }
    Примечание Примечание
    Для отображения свечей используется графический компонент Chart.
  3. Необходимо объявить, какие именно свечи требуются для робота и запустить получение данных через CandleManagerStart:

    C#
    switch (type)
    {
        case CandleTypes.TimeFrame:
            series = new CandleSeries(typeof(TimeFrameCandle), security, TimeFrame.Value.Value.TimeOfDay);
            break;
        case CandleTypes.Tick:
            series = new CandleSeries(typeof(TickCandle), security, VolumeCtrl.Text.To<int>());
            break;
        case CandleTypes.Volume:
            series = new CandleSeries(typeof(VolumeCandle), security, VolumeCtrl.Text.To<decimal>());
            break;
        case CandleTypes.Range:
            series = new CandleSeries(typeof(RangeCandle), security, PriceRange.Unit);
            break;
        default:
            throw new ArgumentOutOfRangeException();
    }
    
    ...
    
    _candleManager.Start(series);

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

Работа со свечами

  • Если требуется получать уже сформированные свечи по определенным параметрам, нужно вызывать специальные методы, например, для TimeFrameCandle, GetCandles, или для RangeCandle, GetCandles:

    C#
    // получить 100 свечей-пятиминуток для Лукойла
    private Security _lkoh;
    private readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
    private _series;
    
    ...
    
    _series = new CandleSeries(typeof(TimeFrameCandle), _lkoh, _timeFrame);
    
    ...
    
    var candles = _series.GetCandles(100);
  • Если необходимо обратиться к прошедшим свечам по номеру (например, получить 5-ую с конца), то можно использовать метод GetCandleTCandle:

    C#
    // получить 5-ую свечу с конца (нумерация идет от 0, 0 - текущая свеча)
    private Security _lkoh;
    private readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
    private _series;
    
    ...
    
    _series = new CandleSeries(typeof(TimeFrameCandle), _lkoh, _timeFrame);
    
    ...
    
    var prev5Candle = _series.GetCandle<TimeFrameCandle>(5);
Следующие шаги