Свечи
S# поддерживает следующие виды:
- TimeFrameCandle - свеча на основе временного отрезка, таймфрейма. Можно задавать как популярные отрезки (минутки, часовики, дневные), так и кастомизированные. Например, 21 секунда, 4.5 минуты и т.д.
- RangeCandle - свеча ценового разброса. Новая свеча создается, когда появляется сделка с ценой, выходящей за допустимые пределы. Допустимый предел формируется каждый раз на основе цены первой сделки.
- VolumeCandle - свеча формируется до тех пор, пока суммарно по сделкам не будет превышен объем. Если новая сделка превышает допустимый объем, то она попадает уже в новую свечу.
- TickCandle - то же самое, что и VolumeCandle, только в качестве ограничения вместо объема берется количество сделок.
- PnFCandle - свеча пункто-цифрового графика (график крестики-нолики).
- RenkoCandle - Рэнко свеча.
Как работать со свечами, показано в примере SampleConnection, который расположен в папке Samples/Common/SampleConnection.
На следующих рисунках представлены графики TimeFrameCandle и RangeCandle:
Запуск получения данных
Создадим серию свечей CandleSeries:
... _candleSeries = new CandleSeries(CandleSettingsEditor.Settings.CandleType, security, CandleSettingsEditor.Settings.Arg); ...
Все необходимые методы для получения свечей реализованы в классе Connector.
Для получения свечей необходимо подписаться на событие Connector.CandleSeriesProcessing, сигнализирующее о появлении нового значения для обработки:
_connector.CandleSeriesProcessing += Connector_CandleSeriesProcessing; ... private void Connector_CandleSeriesProcessing(CandleSeries candleSeries, Candle candle) { Chart.Draw(_candleElement, candle); } ...
Tip
Для отображения свечей используется графический компонент Chart.
Далее передаём в коннектор созданную серию свечей и запускаем получение данных через Connector.Subscribe(StockSharp.Algo.Subscription subscription ):
... _connector.Subscribe(_candleSeries); ...
После этого этапа начнёт вызываться событие Connector.CandleSeriesProcessing.
Событии 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); } } ...
Для CandleSeries можно задать некоторые свойства:
- CandleSeries.BuildCandlesMode задает режим построения свечей. По умолчанию задан MarketDataBuildModes.LoadAndBuild, что говорит о том, что будут запрошены готовые данные, или построены из заданного в свойстве CandleSeries.BuildCandlesFrom типа данных. Также можно установить MarketDataBuildModes.Load для запроса только готовых данных. Или MarketDataBuildModes.Build, для построения из заданного в свойстве CandleSeries.BuildCandlesFrom типа данных без запроса готовых данных.
- При построении свечей необходимо задать свойство CandleSeries.BuildCandlesFrom, которое говорит о том, какой именно тип данных используется как источник (MarketDataTypes.Level1, MarketDataTypes.MarketDepth, MarketDataTypes.Trades и тд. ).
- Для некоторых типов данных необходимо дополнительно указать свойство CandleSeries.BuildCandlesField, из которого будут построены данные. Например, для MarketDataTypes.Level1 можно указать Level1Fields.BestAskPrice, что говорт о том, что свечи будут строиться из свойства Level1Fields.BestAskPrice данных MarketDataTypes.Level1.
Рассмотрим несколько примеров построения разных типов свечей:
Так как большинство источников предоставляют свечи стандартных таймфреймом, то для получения таких свечей достаточно задать тип и таймфрейм:
_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, };