/*
* 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.Linq;
using System.Collections.Generic;
namespace QuantConnect.Data.Auxiliary
{
///
/// Mapping related factor provider. Factors based on price differences on mapping dates
///
public class MappingContractFactorProvider : FactorFile
{
///
///Creates a new instance
///
public MappingContractFactorProvider(string permtick, IEnumerable data, DateTime? factorFileMinimumDate = null)
: base(permtick, data, factorFileMinimumDate)
{
}
///
/// Gets the price scale factor for the specified search date
///
public override decimal GetPriceFactor(DateTime searchDate, DataNormalizationMode dataNormalizationMode, DataMappingMode? dataMappingMode = null, uint contractOffset = 0)
{
if (dataNormalizationMode == DataNormalizationMode.Raw)
{
return 0;
}
var factor = 1m;
if (dataNormalizationMode is DataNormalizationMode.BackwardsPanamaCanal or DataNormalizationMode.ForwardPanamaCanal)
{
// default value depends on the data mode
factor = 0;
}
for (var i = 0; i < ReversedFactorFileDates.Count; i++)
{
var factorDate = ReversedFactorFileDates[i];
if (factorDate.Date < searchDate.Date)
{
break;
}
var factorFileRow = SortedFactorFileData[factorDate];
switch (dataNormalizationMode)
{
case DataNormalizationMode.BackwardsRatio:
{
var row = factorFileRow.FirstOrDefault(row => row.DataMappingMode == dataMappingMode);
if (row != null && row.BackwardsRatioScale.Count > contractOffset)
{
factor = row.BackwardsRatioScale[(int)contractOffset];
}
break;
}
case DataNormalizationMode.BackwardsPanamaCanal:
{
var row = factorFileRow.FirstOrDefault(row => row.DataMappingMode == dataMappingMode);
if (row != null && row.BackwardsPanamaCanalScale.Count > contractOffset)
{
factor = row.BackwardsPanamaCanalScale[(int)contractOffset];
}
break;
}
case DataNormalizationMode.ForwardPanamaCanal:
{
var row = factorFileRow.FirstOrDefault(row => row.DataMappingMode == dataMappingMode);
if (row != null && row.ForwardPanamaCanalScale.Count > contractOffset)
{
factor = row.ForwardPanamaCanalScale[(int)contractOffset];
}
break;
}
default:
throw new ArgumentOutOfRangeException(nameof(dataNormalizationMode));
}
}
return factor;
}
}
}