Last Tick Bars - Custom

Last Tick Bars - Custom

#region Namespaces
using System;
#endregion

namespace ScriptCode {
	/// <summary>
	/// Bar type scripts are used for building custom bar types that can be used interchangeably with native bar types throughout the platform.
	/// 
	/// The custom data bars that are built by the script can either be based on tick, minute or daily bars depending on the underlying bar source.
	/// When a bar type script is used by multiple symbols a single script instance is initialized for each one.
	/// </summary>
	public partial class MyBarType : BarTypeScriptBase // NEVER CHANGE THE CLASS NAME
	{
		#region Variables
		// The bar size as specified by the user.
		private double _barSize;
		// The number of ticks in the currently built data bar.
		private int _barCount;
		#endregion

		#region OnInitialize
		/// <summary>
		/// This function is called when a new bar type instance is created.
		/// </summary>
		/// --------------------------------------------------------------------------------------------------
		/// THIS FUNCTION MUST ACCEPT THE BAR SIZE PARAMETER AND SHOULD NOT ACCEPT ANY OTHER PARAMETERS.
		/// --------------------------------------------------------------------------------------------------
		/// <param name="barSize" type="Double" default="1">The bar size of the new bar type being built.</param>
		public void OnInitialize(double barSize) {
			// Set the specified bar size.
			_barSize = barSize;
		}
		#endregion

		#region OnTick
		/// <summary>
		/// This function is called on each new tick of the underlying symbol (see the BarBuilder functions).
		/// </summary>
		/// <param name="tickDateTime">The tick date/time</param>
		/// <param name="price">The tick price</param>
		/// <param name="size">The tick size</param>
		/// <param name="tickType">The tick type (BID, ASK, LAST)</param>
		public override void OnTick(
			long tickDateTime,
			double price,
			double size,
			C_TickType tickType) {
			// Check whether the tick is a last trade.
			if (tickType == C_TickType.LAST_TRADE) {
				// Merge the tick with the current bar.
				BarBuilderMergeTick(tickDateTime, price, size);
				// Increase the bar count.
				_barCount++;
				// Check whether there are enough ticks in the bar.
				if (_barCount == _barSize) {
					// Clear the bar count.
					_barCount = 0;
					// Commit the bar.
					BarBuilderCommitBar();
				}
			}
		}
		#endregion

		#region OnDataBar
		/// <summary>
		/// This function is called on each new OHLCV+OI bar of the underlying symbol (see the BarBuilder functions).
		/// </summary>
		/// <param name="isMissing">Indicates whether the data bar is missing (true) or not (false)</param>
		/// <param name="startDateTime">The data bar start date/time</param>
		/// <param name="endDateTime">The data bar end date/time</param>
		/// <param name="open">The data bar open</param>
		/// <param name="high">The data bar high</param>
		/// <param name="low">The data bar low</param>
		/// <param name="close">The data bar close</param>
		/// <param name="volume">The data bar volume</param>
		/// <param name="openInterest">The data bar open interest</param>
		public override void OnDataBar(
			bool isMissing,
			long startDateTime,
			long endDateTime,
			double open,
			double high,
			double low,
			double close,
			double volume,
			double openInterest) {
			// OnDataBar Content
		}
		#endregion

		#region OnSessionClose
		/// <summary>
		/// This function is called when a trading session for the underlying symbol is closed.
		/// </summary>
		public override void OnSessionClose() {
			// Check whether there is a bar to commit, since ticks were registered.
			if (_barCount > 0) {
				// Clear the bar count.
				_barCount = 0;
				// Commit the current bar.
				BarBuilderCommitBar();
			}
		}
		#endregion
	}
}