Свечи |
S# поддерживает следующие виды:
Как работать со свечами, показано в примере SampleConnection, который расположен в папке Samples/Common/SampleConnection.
На следующих рисунках представлены графики TimeFrameCandle и RangeCandle:
Создадим серию свечей CandleSeries:
...
_candleSeries = new CandleSeries(CandleSettingsEditor.Settings.CandleType, security, CandleSettingsEditor.Settings.Arg);
...
Все необходимые методы для получения свечей реализованы в классе Connector.
Для получения свечей необходимо подписаться на событие ConnectorCandleSeriesProcessing, сигнализирующее о появлении нового значения для обработки:
_connector.CandleSeriesProcessing += Connector_CandleSeriesProcessing; ... private void Connector_CandleSeriesProcessing(CandleSeries candleSeries, Candle candle) { Chart.Draw(_candleElement, candle); } ...
![]() |
---|
Для отображения свечей используется графический компонент Chart. |
Далее передаём в коннектор созданную серию свечей и запускаем получение данных через SubscribeCandles:
...
_connector.SubscribeCandles(_candleSeries, DateTime.Today.Subtract(TimeSpan.FromDays(30)), DateTime.Now);
...
После этого этапа начнёт вызываться событие ConnectorCandleSeriesProcessing.
Событии ConnectorCandleSeriesProcessing вызывается не только при появлении новой свечи, но и при изменении текущей.
Если же нужно отображать только "целые" свечи, то необходимо проверить свойство 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 можно задать некоторые свойства:
BuildCandlesMode задает режим построения свечей. По умолчанию задан LoadAndBuild, что говорит о том, что будут запрошены готовые данные, или построены из заданного в свойстве BuildCandlesFrom типа данных. Также можно установить Load для запроса только готовых данных. Или Build, для построения из заданного в свойстве BuildCandlesFrom типа данных без запроса готовых данных.
Рассмотрим несколько примеров построения разных типов свечей:
Так как большинство источников предоставляют свечи стандартных таймфреймом, то для получения таких свечей достаточно задать тип и таймфрейм:
_candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromMinutes(5));
Если необходимо просто загрузить готовые свечи, то необходимо задать свойство BuildCandlesMode в 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, };
Так как не существует источников, предоставляющих готового профиля объема, его тоже необходимо строить из другого типа данных. Для прорисовки профиля объема необходимо установить свойство IsCalcVolumeProfile в true, а также BuildCandlesMode в Build. И указать тип данных из которого будет построен профиль объема. В данном случае это Trades:
_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 контрактов. В качестве источника данных для построения используется середина спреда стакана.
_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, };