このページはまだお使いの言語で利用できません。別の言語版を表示しています。

Candle Creation by the Instruments Basket

To create candles for ContinuousSecurity, WeightedIndexSecurity, or ExpressionIndexSecurity, the same subscription mechanism is used as for regular Security instruments.

Below is an example of creating 1-minute candles for the GZM5 - LKM5 spread:

private Connector _connector;
private Security _instr1;
private Security _instr2;
private WeightedIndexSecurity _indexInstr;
private Subscription _indexSubscription;
private const string _secCode1 = "GZM5";
private const string _secCode2 = "LKM5";
readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(1);
private ChartArea _area;
private ChartCandleElement _candleElement;

// Connection setup and connector configuration
private void ConfigureConnector()
{
	if (_connector.Configure(this))
	{
		_connector.Save().Serialize(_connectorFile);
	}
}

// Chart setup
private void SetupChart()
{
	_area = new ChartArea();
	_chart.Areas.Add(_area);
	_candleElement = new ChartCandleElement();
	_area.Elements.Add(_candleElement);
	
	// Subscribe to candle reception event
	_connector.CandleReceived += OnCandleReceived;
}

// Service registration
private void RegisterServices()
{
	ConfigManager.RegisterService<ISecurityProvider>(_connector);
	ConfigManager.RegisterService<ICompilerService>(new RoslynCompilerService());
}

// Creating index instrument and subscribing to candles
private void CreateIndexAndSubscribe()
{
	// Create index instrument (spread)
	_indexInstr = new WeightedIndexSecurity() 
	{ 
		Board = ExchangeBoard.Nyse, 
		Id = "IndexInstr" 
	};
	
	// Add instruments with weights (1 and -1 for spread)
	_indexInstr.Weights.Add(_instr1, 1);
	_indexInstr.Weights.Add(_instr2, -1);
	
	// Create subscription to index instrument candles
	_indexSubscription = new Subscription(
		DataType.TimeFrame(_timeFrame),  // 1-minute candles
		_indexInstr)  // Our index instrument
	{
		MarketData = 
		{
			// Configure subscription to build candles from ticks
			BuildMode = MarketDataBuildModes.Build,
			BuildFrom = DataType.Ticks,
			
			// Request historical data for 30 days
			From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
			To = DateTime.Now
		}
	};
	
	// Add element to chart and bind it to subscription
	_chart.AddElement(_area, _candleElement, _indexSubscription);
	
	// Start subscription
	_connector.Subscribe(_indexSubscription);
}

// Handler for candle reception event
private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
	// Check if the candle belongs to our subscription
	if (subscription != _indexSubscription)
		return;
	
	// If needed, limit processing to only completed candles
	if (candle.State != CandleStates.Finished)
		return;
	
	// Draw the candle on the chart
	var chartData = new ChartDrawData();
	chartData.Group(candle.OpenTime).Add(_candleElement, candle);
	
	this.GuiAsync(() => _chart.Draw(chartData));
}

// Unsubscribe when closing the application
private void Unsubscribe()
{
	if (_indexSubscription != null)
	{
		_connector.CandleReceived -= OnCandleReceived;
		_connector.UnSubscribe(_indexSubscription);
		_indexSubscription = null;
	}
}

Other Use Cases for Index Subscriptions

Creating a Subscription to Index Candles from Component Candles

// Create subscription to build index candles from component candles
var indexFromCandlesSubscription = new Subscription(
	DataType.TimeFrame(TimeSpan.FromMinutes(5)),
	_indexInstr)
{
	MarketData = 
	{
		// Configure subscription to build from component candles
		BuildMode = MarketDataBuildModes.Build,
		BuildFrom = DataType.TimeFrame(TimeSpan.FromMinutes(5)),
		From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
		To = DateTime.Now
	}
};

// Start subscription
_connector.Subscribe(indexFromCandlesSubscription);

Creating a Subscription to Index Candles from Order Books

// Create subscription to build index candles from order books
var indexFromDepthSubscription = new Subscription(
	DataType.TimeFrame(TimeSpan.FromMinutes(1)),
	_indexInstr)
{
	MarketData = 
	{
		// Configure subscription to build from order books
		BuildMode = MarketDataBuildModes.Build,
		BuildFrom = DataType.MarketDepth,
		BuildField = Level1Fields.SpreadMiddle,  // Use middle of spread
		From = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
		To = DateTime.Now
	}
};

// Start subscription
_connector.Subscribe(indexFromDepthSubscription);

Working with Volatility Index

// Create volatility index based on expression
var volatilityIndex = new ExpressionIndexSecurity
{
	Board = ExchangeBoard.Nyse,
	Id = "VOLX",
	Expression = "StdDev({0}, 20) / SMA({0}, 20) * 100",  // Formula for calculating volatility
};

// Add main instrument to index
volatilityIndex.InnerSecurityIds.Add(_instr1.ToSecurityId());

// Create subscription to volatility index candles
var volatilitySubscription = new Subscription(
	DataType.TimeFrame(TimeSpan.FromMinutes(5)),
	volatilityIndex)
{
	MarketData = 
	{
		BuildMode = MarketDataBuildModes.Build,
		BuildFrom = DataType.Ticks,
		From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
		To = DateTime.Now
	}
};

// Start subscription
_connector.Subscribe(volatilitySubscription);

See also

Continuous Futures

Index