Свечи
S# поддерживает следующие виды свечей:
- TimeFrameCandleMessage - свеча на основе временного отрезка, таймфрейма. Можно задавать как популярные отрезки (минутки, часовики, дневные), так и кастомизированные. Например, 21 секунда, 4.5 минуты и т.д.
- RangeCandleMessage - свеча ценового разброса. Новая свеча создается, когда появляется сделка с ценой, выходящей за допустимые пределы. Допустимый предел формируется каждый раз на основе цены первой сделки.
- VolumeCandleMessage - свеча формируется до тех пор, пока суммарно по сделкам не будет превышен объем. Если новая сделка превышает допустимый объем, то она попадает уже в новую свечу.
- TickCandleMessage - то же самое, что и VolumeCandleMessage, только в качестве ограничения вместо объема берется количество сделок.
- PnFCandleMessage - свеча пункто-цифрового графика (график крестики-нолики).
- RenkoCandleMessage - Рэнко свеча.
Как работать со свечами, показано в примере SampleConnection, который расположен в папке Samples/Common/SampleConnection.
На следующих рисунках представлены графики TimeFrameCandleMessage и RangeCandleMessage:
Запуск получения данных
- Для получения свечей создаем подписку с использованием класса Subscription:
// Создаем подписку на 5-минутные свечи
var subscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)), // Тип данных с указанием таймфрейма
security) // Инструмент
{
// Настраиваем дополнительные параметры через свойство MarketData
MarketData =
{
// Период, за который запрашиваем исторические данные (за последние 30 дней)
From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
To = DateTime.Now
}
};
- Для получения свечей необходимо подписаться на событие Connector.CandleReceived, сигнализирующее о появлении нового значения для обработки:
// Подписываемся на событие получения свечей
_connector.CandleReceived += OnCandleReceived;
// Обработчик события получения свечи
private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
// Здесь subscription - это объект подписки, которую мы создали
// candle - полученная свеча
// Проверяем, относится ли свеча к нашей подписке
if (subscription == _candleSubscription)
{
// Отрисовываем свечу на графике
Chart.Draw(_candleElement, candle);
}
}
Tip
Для отображения свечей используется графический компонент Chart.
- Далее запускаем подписку через метод Connector.Subscribe:
// Запускаем подписку
_connector.Subscribe(subscription);
После этого начнет вызываться событие Connector.CandleReceived.
- Событие Connector.CandleReceived вызывается не только при появлении новой свечи, но и при изменении текущей.
Если нужно отображать только "целые" свечи, то необходимо проверить свойство ICandleMessage.State пришедшей свечи:
private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
// Проверяем, относится ли свеча к нашей подписке
if (subscription != _candleSubscription)
return;
// Проверяем, завершена ли свеча
if (candle.State == CandleStates.Finished)
{
// Создаем данные для отрисовки
var chartData = new ChartDrawData();
chartData.Group(candle.OpenTime).Add(_candleElement, candle);
// Отрисовываем свечу на графике
this.GuiAsync(() => Chart.Draw(chartData));
}
}
- Для подписки можно настроить дополнительные параметры:
- Режим построения свечей - определяет, будут ли запрашиваться готовые данные или строиться из другого типа данных:
// Запрос только готовых данных
subscription.MarketData.BuildMode = MarketDataBuildModes.Load;
// Только построение из другого типа данных
subscription.MarketData.BuildMode = MarketDataBuildModes.Build;
// Запрос готовых данных, а если их нет - построение
subscription.MarketData.BuildMode = MarketDataBuildModes.LoadAndBuild;
- Источник для построения свечей - указывает, из какого типа данных строить свечи, если они не доступны напрямую:
// Построение свечей из тиковых сделок
subscription.MarketData.BuildFrom = DataType.Ticks;
// Построение свечей из стаканов
subscription.MarketData.BuildFrom = DataType.MarketDepth;
// Построение свечей из Level1
subscription.MarketData.BuildFrom = DataType.Level1;
- Поле для построения свечей - необходимо указать для некоторых типов данных:
// Построение свечей из лучшей цены покупки в Level1
subscription.MarketData.BuildField = Level1Fields.BestBidPrice;
// Построение свечей из лучшей цены продажи в Level1
subscription.MarketData.BuildField = Level1Fields.BestAskPrice;
// Построение свечей из середины спреда в стакане
subscription.MarketData.BuildField = Level1Fields.SpreadMiddle;
- Профиль объема - расчет профиля объема для свечей:
// Включение расчета профиля объема
subscription.MarketData.IsCalcVolumeProfile = true;
Примеры подписок на различные типы свечей
Свечи с обычным таймфреймом
// 5-минутные свечи
var timeFrameSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security);
_connector.Subscribe(timeFrameSubscription);
Загрузка только исторических свечей
// Загрузка только исторических свечей без перехода в реальное время
var historicalSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security)
{
MarketData =
{
From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
To = DateTime.Today, // Указываем конечную дату
BuildMode = MarketDataBuildModes.Load // Только загрузка готовых данных
}
};
_connector.Subscribe(historicalSubscription);
Построение свечей нестандартного таймфрейма из тиков
// Свечи с таймфреймом 21 секунда, построенные из тиков
var customTimeFrameSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromSeconds(21)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(customTimeFrameSubscription);
Построение свечей из данных стакана
// Свечи, построенные из середины спреда стакана
var depthBasedSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(1)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.MarketDepth,
BuildField = Level1Fields.SpreadMiddle
}
};
_connector.Subscribe(depthBasedSubscription);
Свечи с профилем объема
// 5-минутные свечи с расчетом профиля объема
var volumeProfileSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.LoadAndBuild,
BuildFrom = DataType.Ticks,
IsCalcVolumeProfile = true
}
};
_connector.Subscribe(volumeProfileSubscription);
Свечи по объему
// Свечи по объему (каждая свеча содержит объем в 1000 контрактов)
var volumeCandleSubscription = new Subscription(
DataType.Volume(1000m), // Указываем тип свечи и объем
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(volumeCandleSubscription);
Свечи по количеству сделок
// Свечи по количеству сделок (каждая свеча содержит 1000 сделок)
var tickCandleSubscription = new Subscription(
DataType.Tick(1000), // Указываем тип свечи и количество сделок
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(tickCandleSubscription);
Свечи с ценовым диапазоном
// Свечи с ценовым диапазоном в 0.1 ед.
var rangeCandleSubscription = new Subscription(
DataType.Range(0.1m), // Указываем тип свечи и диапазон цен
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(rangeCandleSubscription);
Рэнко свечи
// Рэнко свечи с шагом 0.1
var renkoCandleSubscription = new Subscription(
DataType.Renko(0.1m), // Указываем тип свечи и размер блока
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(renkoCandleSubscription);
Пункто-цифровые свечи (P&F)
// Пункто-цифровые свечи
var pnfCandleSubscription = new Subscription(
DataType.PnF(new PnfArg { BoxSize = 0.1m, ReversalAmount = 1 }), // Указываем параметры PnF
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(pnfCandleSubscription);