Files
quantconnect--lean/ToolBox/LeanParser.cs
T
Gerardo Salazar 4c085ff853 Adds Indexes and Index Options asset types (Backtesting/Live, IB only) (#5379)
* Add support for Index SecurityType  🚀 (#5364)

* Add Index SecurityType  🚀

* Extend SecurityIdentifier & Lean Data classes with Index support

* Add Index SecurityType  🚀

* Extend SecurityIdentifier & Lean Data classes with Index support

* Fixes

* Added index cross basic template demonstration

* WIP: Prototype index security type for LEAN as non tradable asset

* Re-adds Index entries to MHDB after rebase

* First steps to getting Index Options running

  * Looks at any instance where we pattern match for an option type
    and replaces it with a generic call to `.IsOption()` for easier
    extensibility in the future for additional option security types

  * Adds IndexOption security and misc. classes

  * Misc. changes, mainly related to any sort of special casing of
    equity options and made index options take the same path

* Enables index options data for backtesting

  * Adds new index options market hours to MHDB
  * Misc. bug fixes for index options
  * WIP: add live support for index options and indexes
  * Use OptionMarginModel for Index Options because they both use the
    same calculation for margin requirements

* Fixes contract not found errors on SPX index options and SPX index in IB

  * Turns out index options' last trading day is the day before expiry,
    which IB was expecting the last trading day.

* Add index option test cases (temp)

* LiveOptionChainProvider fix, use Symbol vs. ticker

  * Description updates to regression algorithms

* Fixes bug in live trading for indexes and index options

  * Adds overridable minimum price variation symbol property
  * Adds variable sized minimum price variation for index options
  * Adjusts symbol properties for index options
  * Misc. bug fixes

* Fixes option assignment simulation for European options

  * Updates index options regression algorithms (WIP)

* Fixes bug where index option exercise would trade index underlying

  * Fixes bugs where SecurityType.Index was getting flagged as tradable

* Regression algorithms updates and addresses review

  * Misc. style fixes and refactoring + a few bug fixes
  * Updates regression algorithms to run without runtime errors
  * Adds data for regression algos

* Sets DefaultOptionStyle on Canonical and support index options

* Update regression algos statistics

* Removes bad line in regression algorithm causing build to fail

* Minor tweaks

* Address review add comment about quoteBar parse scale

Co-authored-by: Balamurali Pandranki <balamurali@live.com>
Co-authored-by: Jared Broad <jaredbroad@gmail.com>
Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2021-03-12 20:46:23 -03:00

96 lines
3.8 KiB
C#

/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.IO;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using QuantConnect.ToolBox.AlgoSeekOptionsConverter;
using QuantConnect.Util;
namespace QuantConnect.ToolBox
{
/// <summary>
/// Provides an implementation of <see cref="IStreamParser"/> that reads files in the lean format
/// </summary>
public class LeanParser : IStreamParser
{
/// <summary>
/// Parses the specified input stream into an enumerable of data
/// </summary>
/// <param name="source">The source file corresponding the the stream</param>
/// <param name="stream">The input stream to be parsed</param>
/// <returns>An enumerable of base data</returns>
public IEnumerable<BaseData> Parse(string source, Stream stream)
{
var pathComponents = LeanDataPathComponents.Parse(source);
var tickType = pathComponents.Filename.ToLowerInvariant().Contains("_trade")
? TickType.Trade
: TickType.Quote;
var dataType = GetDataType(pathComponents.SecurityType, pathComponents.Resolution, tickType);
var factory = (BaseData) Activator.CreateInstance(dataType);
// ignore time zones here, i.e, we're going to emit data in the data time zone
var config = new SubscriptionDataConfig(dataType, pathComponents.Symbol, pathComponents.Resolution, TimeZones.Utc, TimeZones.Utc, false, true, false);
using (var reader = new StreamReader(stream))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return factory.Reader(config, line, pathComponents.Date, false);
}
}
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
}
private Type GetDataType(SecurityType securityType, Resolution resolution, TickType tickType)
{
if (resolution == Resolution.Tick)
{
return typeof (Tick);
}
switch (securityType)
{
case SecurityType.Base:
case SecurityType.Equity:
return typeof (TradeBar);
case SecurityType.Cfd:
case SecurityType.Forex:
case SecurityType.Crypto:
return typeof (QuoteBar);
case SecurityType.Option:
case SecurityType.FutureOption:
case SecurityType.IndexOption:
if (tickType == TickType.Trade) return typeof (TradeBar);
if (tickType == TickType.Quote) return typeof (QuoteBar);
break;
}
var parameters = string.Join(" | ", securityType, resolution, tickType);
throw new NotImplementedException("LeanParser.GetDataType has not yet implemented: " + parameters);
}
}
}