Table of Contents

Стаканы (инкрементальные и обычные)

В случае транслирование внешней торговой системой полных стаканов (стакан присылается целиком при каждом изменении), необходимо отправлять его ввиде сообщения:

// получаем стакана от торговой системы
private void SessionOnOrderBook(string pair, OrderBook book)
{
		SendOutMessage(new QuoteChangeMessage
		{
			SecurityId = pair.ToStockSharp(),
			Bids = book.Bids.Select(e => new QuoteChange(e.Price, e.Size)).ToArray(),
			Asks = book.Asks.Select(e => new QuoteChange(e.Price, e.Size)).ToArray(),
			ServerTime = book.Time,
		});
}

В случае транслирование внешней торговой системой инкрементальных стаканов (транслируются только изменения ценовых уровне, а не весь стакан целиком), в адаптере необходимо прописать логику как построения снэпшота стакана (если он не транслируется), так и отдачи изменений стакана. Для этого необходимо использовать свойство QuoteChangeMessage.State:

// получаем снэпшот стакана от торговой системы
private void SessionOnOrderBookSnapshot(string pair, OrderBook book)
{
		SendOutMessage(new QuoteChangeMessage
		{
			SecurityId = pair.ToStockSharp(),
			Bids = book.Bids.Select(e => new QuoteChange(e.Price, e.Size)).ToArray(),
			Asks = book.Asks.Select(e => new QuoteChange(e.Price, e.Size)).ToArray(),
			ServerTime = book.Time,
			State = QuoteChangeStates.SnapshotComplete, // <- указываем, что текущее сообщение является снэпшотом,
			// и необходимо сбросить состояние стакана новым снимком
		});
}

Для отправки инкрементальных сообщений код аналогичен, но устанавливается признак изменения стакана. Если у котировки QuoteChange.Volume значение равно 0, то это является признаком для удаления ценового уровня:

// получаем изменения стакана стакана
private void SessionOnOrderBookIncrement(string pair, OrderBook book)
{
		SendOutMessage(new QuoteChangeMessage
		{
			SecurityId = pair.ToStockSharp(),
			Bids = book.Bids.Select(e => new QuoteChange(e.Price, e.Size)).ToArray(), // <- с нулевым объемом котировки интепретируются как удаляемые
			Asks = book.Asks.Select(e => new QuoteChange(e.Price, e.Size)).ToArray(),
			ServerTime = book.Time,
			State = QuoteChangeStates.Increment, // <- указываем, что текущее сообщение является инкрементальным
		});
}

Последним шагом является переопределение свойства IMessageAdapter.IsSupportOrderBookIncrements, которое укажет, что в цепочке адаптеров необходимо при подключении добавить OrderBookIncrementMessageAdapter (подробнее Вспомогательные адаптеры) :

public partial class MyOwnMessageAdapter : MessageAdapter
{
	// ...
	
	/// <inheritdoc />
	public override bool IsSupportOrderBookIncrements => true;
}