23 using System.Collections.Generic;
29 using Newtonsoft.Json;
40 public partial class QCAlgorithm
42 private readonly Dictionary<IntPtr, PythonIndicator> _pythonIndicators =
new Dictionary<IntPtr, PythonIndicator>();
70 return AddData(type, ticker, resolution,
null,
false, 1m);
94 return AddData(type, underlying, resolution,
null,
false, 1m);
110 public Security AddData(PyObject type,
string ticker,
Resolution? resolution, DateTimeZone timeZone,
bool fillForward =
false, decimal leverage = 1.0m)
112 return AddData(type.CreateType(), ticker, resolution, timeZone, fillForward, leverage);
138 return AddData(type.CreateType(), underlying, resolution, timeZone, fillForward, leverage);
154 public Security AddData(Type dataType,
string ticker,
Resolution? resolution, DateTimeZone timeZone,
bool fillForward =
false, decimal leverage = 1.0m)
157 var baseInstance = dataType.GetBaseDataInstance();
158 if (!baseInstance.RequiresMapping())
163 return AddDataImpl(dataType, symbol, resolution, timeZone, fillForward, leverage);
169 throw new InvalidOperationException($
"The custom data type {dataType.Name} requires mapping, but the provided ticker is not in the cache. " +
170 $
"Please add this custom data type using a Symbol or perform this call after " +
171 $
"a Security has been added using AddEquity, AddForex, AddCfd, AddCrypto, AddFuture, AddOption or AddSecurity. " +
172 $
"An example use case can be found in CustomDataAddDataRegressionAlgorithm");
175 return AddData(dataType, underlying, resolution, timeZone, fillForward, leverage);
199 public Security AddData(Type dataType,
Symbol underlying,
Resolution? resolution =
null, DateTimeZone timeZone =
null,
bool fillForward =
false, decimal leverage = 1.0m)
202 return AddDataImpl(dataType, symbol, resolution, timeZone, fillForward, leverage);
222 var dataType = type.CreateType();
226 SetDatabaseEntries(key, properties, exchangeHours);
229 return AddData(dataType, ticker, resolution,
null, fillForward, leverage);
242 Func<OptionFilterUniverse, OptionFilterUniverse> optionFilterUniverse;
243 if (!optionFilter.TryConvertToDelegate(out optionFilterUniverse))
245 throw new ArgumentException(
"Option contract universe filter provided is not a function");
263 private Security AddDataImpl(Type dataType,
Symbol symbol,
Resolution? resolution, DateTimeZone timeZone,
bool fillForward, decimal leverage)
268 if (timeZone !=
null)
281 extendedMarketHours:
true);
284 return AddToUserDefinedUniverse(security,
new List<SubscriptionDataConfig> { config });
292 [DocumentationAttribute(Universes)]
295 Func<IEnumerable<Fundamental>,
object> fundamentalSelector;
298 if (pyObject.TryCreateType(out var type))
303 else if (pyObject.TryConvert(out universe))
307 else if (pyObject.TryConvert(out universe, allowPythonDerivative:
true))
311 else if (pyObject.TryConvertToDelegate(out fundamentalSelector))
319 throw new ArgumentException($
"QCAlgorithm.AddUniverse: {pyObject.Repr()} is not a valid argument.");
333 Func<IEnumerable<CoarseFundamental>,
object> coarseFunc;
334 Func<IEnumerable<FineFundamental>,
object> fineFunc;
346 if (pyfine.TryConvertToDelegate(out coarseFunc))
348 return AddUniverse(dateRule, coarseFunc.ConvertToUniverseSelectionSymbolDelegate());
351 catch (InvalidCastException)
356 if (pyObject.TryCreateType(out var type))
360 else if (pyObject.TryConvert(out
Universe universe) && pyfine.TryConvertToDelegate(out fineFunc))
362 return AddUniverse(universe, fineFunc.ConvertToUniverseSelectionSymbolDelegate());
364 else if (pyObject.TryConvertToDelegate(out coarseFunc) && pyfine.TryConvertToDelegate(out fineFunc))
366 return AddUniverse(coarseFunc.ConvertToUniverseSelectionSymbolDelegate(),
367 fineFunc.ConvertToUniverseSelectionSymbolDelegate());
373 throw new ArgumentException($
"QCAlgorithm.AddUniverse: {pyObject.Repr()} or {pyfine.Repr()} is not a valid argument.");
388 var selector = pySelector.ConvertToDelegate<Func<DateTime, object>>();
389 return AddUniverse(name, resolution, selector.ConvertToUniverseSelectionStringDelegate());
401 var selector = pySelector.ConvertToDelegate<Func<DateTime, object>>();
402 return AddUniverse(name, selector.ConvertToUniverseSelectionStringDelegate());
417 var selector = pySelector.ConvertToDelegate<Func<DateTime, object>>();
418 return AddUniverse(securityType, name, resolution, market, universeSettings, selector.ConvertToUniverseSelectionStringDelegate());
432 return AddUniverse(
T.CreateType(),
null, name,
null,
null,
null, selector);
447 return AddUniverse(
T.CreateType(),
null, name, resolution,
null,
null, selector);
463 return AddUniverse(
T.CreateType(),
null, name, resolution,
null, universeSettings, selector);
478 return AddUniverse(
T.CreateType(),
null, name,
null,
null, universeSettings, selector);
494 return AddUniverse(
T.CreateType(), securityType, name, resolution, market,
null, selector);
510 return AddUniverse(
T.CreateType(), securityType, name, resolution, market, universeSettings, selector);
526 if (market.IsNullOrEmpty())
531 Func<IEnumerable<BaseData>, IEnumerable<Symbol>> wrappedSelector =
null;
532 if (pySelector !=
null)
534 var selector = pySelector.ConvertToDelegate<Func<IEnumerable<IBaseData>,
object>>();
535 wrappedSelector = baseDatas =>
537 var result = selector(baseDatas);
542 return ((
object[])result).Select(x => x is
Symbol symbol ? symbol :
QuantConnect.
Symbol.
Create((
string)x, securityType.Value, market, baseDataType: dataType));
545 return AddUniverseSymbolSelector(dataType, name, resolution, market, universeSettings, wrappedSelector);
557 Func<OptionFilterUniverse, OptionFilterUniverse> convertedOptionChain;
560 if (universe.TryConvert(out universeToChain) && optionFilter.TryConvertToDelegate(out convertedOptionChain))
568 throw new ArgumentException($
"QCAlgorithm.AddChainedEquityOptionUniverseSelectionModel: {universe.Repr()} or {optionFilter.Repr()} is not a valid argument.");
617 if (pyObject.TryConvert(out dataConsolidator))
636 TimeSpan? timeSpan = pyObject.As<TimeSpan>();
637 if (timeSpan !=
default(TimeSpan))
645 throw new ArgumentException(
"Invalid third argument, should be either a valid consolidator or timedelta object. The following exception was thrown: ", e);
666 var convertedIndicator = ConvertPythonIndicator(indicator);
667 switch (convertedIndicator)
671 selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
676 selector?.ConvertToDelegate<Func<IBaseData, decimal>>());
681 selector?.ConvertToDelegate<Func<IBaseData, IBaseDataBar>>());
686 selector?.ConvertToDelegate<Func<IBaseData, TradeBar>>());
691 selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
696 selector?.ConvertToDelegate<Func<IBaseData, BaseData>>());
701 throw new ArgumentException($
"Indicator type {indicator.GetPythonType().Name} is not supported.");
732 var symbols = symbol.ConvertToSymbolEnumerable();
743 private void WarmUpIndicator(IEnumerable<Symbol> symbols, PyObject indicator,
Resolution? resolution =
null, PyObject selector =
null)
746 var convertedIndicator = ConvertPythonIndicator(indicator);
747 switch (convertedIndicator)
750 WarmUpIndicator(symbols, pythonIndicator, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
754 WarmUpIndicator(symbols, dataPointIndicator, resolution, selector?.ConvertToDelegate<Func<IBaseData, decimal>>());
758 WarmUpIndicator(symbols, baseDataBarIndicator, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseDataBar>>());
762 WarmUpIndicator(symbols, tradeBarIndicator, resolution, selector?.ConvertToDelegate<Func<IBaseData, TradeBar>>());
766 WarmUpIndicator(symbols, baseDataIndicator, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
770 WarmUpIndicator(symbols, baseDataIndicator, resolution, selector?.ConvertToDelegate<Func<IBaseData, BaseData>>());
775 throw new ArgumentException($
"Indicator type {indicator.GetPythonType().Name} is not supported.");
786 [DocumentationAttribute(Indicators)]
787 [DocumentationAttribute(HistoricalData)]
802 public void WarmUpIndicator(PyObject symbol, PyObject indicator, TimeSpan period, PyObject selector =
null)
804 var symbols = symbol.ConvertToSymbolEnumerable();
815 private void WarmUpIndicator(IEnumerable<Symbol> symbols, PyObject indicator, TimeSpan period, PyObject selector =
null)
817 var convertedIndicator = ConvertPythonIndicator(indicator);
818 switch (convertedIndicator)
821 WarmUpIndicator(symbols, pythonIndicator, period, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
825 WarmUpIndicator(symbols, dataPointIndicator, period, selector?.ConvertToDelegate<Func<IBaseData, decimal>>());
829 WarmUpIndicator(symbols, baseDataBarIndicator, period, selector?.ConvertToDelegate<Func<IBaseData, IBaseDataBar>>());
833 WarmUpIndicator(symbols, tradeBarIndicator, period, selector?.ConvertToDelegate<Func<IBaseData, TradeBar>>());
837 WarmUpIndicator(symbols, baseDataIndicator, period, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
841 WarmUpIndicator(symbols, baseDataIndicator, period, selector?.ConvertToDelegate<Func<IBaseData, BaseData>>());
846 throw new ArgumentException($
"Indicator type {indicator.GetPythonType().Name} is not supported.");
856 [DocumentationAttribute(Charting)]
857 public void Plot(
string series, PyObject pyObject)
863 Plot(series, indicator);
869 var value = (((dynamic)pyObject).Value as PyObject).GetAndDispose<decimal>();
874 var pythonType = pyObject.GetPythonType().Repr();
875 throw new ArgumentException($
"QCAlgorithm.Plot(): The last argument should be a QuantConnect Indicator object, {pythonType} was provided.");
893 Plot(chart,
new[] { first, second, third, fourth }.Where(x => x !=
null).ToArray());
908 Plot(chart,
new[] { first, second, third, fourth }.Where(x => x !=
null).ToArray());
923 Plot(chart,
new[] { first, second, third, fourth }.Where(x => x !=
null).ToArray());
931 public void PlotIndicator(
string chart, PyObject first, PyObject second =
null, PyObject third =
null, PyObject fourth =
null)
933 var array = GetIndicatorArray(first, second, third, fourth);
934 PlotIndicator(chart, array[0], array[1], array[2], array[3]);
942 public void PlotIndicator(
string chart,
bool waitForReady, PyObject first, PyObject second =
null, PyObject third =
null, PyObject fourth =
null)
944 var array = GetIndicatorArray(first, second, third, fourth);
945 PlotIndicator(chart, waitForReady, array[0], array[1], array[2], array[3]);
960 var resolution = GetSubscription(symbol).
Resolution;
982 return filteredIdentity;
998 var name = $
"{symbol}({fieldName ?? "close
"}_{resolution.ToStringInvariant(null)})";
1003 return filteredIdentity;
1025 public PyObject
History(PyObject tickers,
int periods,
Resolution? resolution =
null,
bool? fillForward =
null,
1027 int? contractDepthOffset =
null,
bool flatten =
false)
1029 if (tickers.TryConvert<
Universe>(out var universe))
1031 resolution ??= universe.Configuration.Resolution;
1032 var requests = CreateBarCountHistoryRequests(
new[] { universe.Symbol }, universe.DataType, periods, resolution, fillForward, extendedMarketHours,
1033 dataMappingMode, dataNormalizationMode, contractDepthOffset);
1037 if (tickers.TryCreateType(out var type))
1039 var requests = CreateBarCountHistoryRequests(
Securities.
Keys, type, periods, resolution, fillForward, extendedMarketHours,
1040 dataMappingMode, dataNormalizationMode, contractDepthOffset);
1044 var symbols = tickers.ConvertToSymbolEnumerable().ToArray();
1048 History(symbols, periods, resolution, fillForward, extendedMarketHours, dataMappingMode, dataNormalizationMode, contractDepthOffset),
1072 public PyObject
History(PyObject tickers, TimeSpan span,
Resolution? resolution =
null,
bool? fillForward =
null,
1074 int? contractDepthOffset =
null,
bool flatten =
false)
1076 return History(tickers,
Time - span,
Time, resolution, fillForward, extendedMarketHours, dataMappingMode, dataNormalizationMode,
1077 contractDepthOffset, flatten);
1099 public PyObject
History(PyObject tickers, DateTime start, DateTime end,
Resolution? resolution =
null,
bool? fillForward =
null,
1101 int? contractDepthOffset =
null,
bool flatten =
false)
1103 if (tickers.TryConvert<
Universe>(out var universe))
1105 resolution ??= universe.Configuration.Resolution;
1106 var requests =
CreateDateRangeHistoryRequests(
new[] { universe.Symbol }, universe.DataType, start, end, resolution, fillForward, extendedMarketHours,
1107 dataMappingMode, dataNormalizationMode, contractDepthOffset);
1111 if (tickers.TryCreateType(out var type))
1114 dataMappingMode, dataNormalizationMode, contractDepthOffset);
1118 var symbols = tickers.ConvertToSymbolEnumerable().ToArray();
1122 History(symbols, start, end, resolution, fillForward, extendedMarketHours, dataMappingMode, dataNormalizationMode, contractDepthOffset),
1147 public PyObject
History(PyObject type, PyObject tickers, DateTime start, DateTime end,
Resolution? resolution =
null,
1148 bool? fillForward =
null,
bool? extendedMarketHours =
null,
DataMappingMode? dataMappingMode =
null,
1149 DataNormalizationMode? dataNormalizationMode =
null,
int? contractDepthOffset =
null,
bool flatten =
false)
1151 var symbols = tickers.ConvertToSymbolEnumerable().ToArray();
1152 var requestedType = type.CreateType();
1154 dataMappingMode, dataNormalizationMode, contractDepthOffset);
1179 public PyObject
History(PyObject type, PyObject tickers,
int periods,
Resolution? resolution =
null,
bool? fillForward =
null,
1181 int? contractDepthOffset =
null,
bool flatten =
false)
1183 var symbols = tickers.ConvertToSymbolEnumerable().ToArray();
1184 var requestedType = type.CreateType();
1185 CheckPeriodBasedHistoryRequestResolution(symbols, resolution, requestedType);
1187 var requests = CreateBarCountHistoryRequests(symbols, requestedType, periods, resolution, fillForward, extendedMarketHours,
1188 dataMappingMode, dataNormalizationMode, contractDepthOffset);
1213 public PyObject
History(PyObject type, PyObject tickers, TimeSpan span,
Resolution? resolution =
null,
bool? fillForward =
null,
1215 int? contractDepthOffset =
null,
bool flatten =
false)
1217 return History(type, tickers,
Time - span,
Time, resolution, fillForward, extendedMarketHours, dataMappingMode, dataNormalizationMode,
1218 contractDepthOffset, flatten);
1241 public PyObject
History(PyObject type,
Symbol symbol, DateTime start, DateTime end,
Resolution? resolution =
null,
bool? fillForward =
null,
1243 int? contractDepthOffset =
null,
bool flatten =
false)
1245 return History(type.CreateType(), symbol, start, end, resolution, fillForward, extendedMarketHours, dataMappingMode,
1246 dataNormalizationMode, contractDepthOffset, flatten);
1268 private PyObject
History(Type type,
Symbol symbol, DateTime start, DateTime end,
Resolution? resolution,
bool? fillForward,
1270 int? contractDepthOffset,
bool flatten)
1273 extendedMarketHours, dataMappingMode, dataNormalizationMode, contractDepthOffset);
1274 if (requests.IsNullOrEmpty())
1276 throw new ArgumentException($
"No history data could be fetched. " +
1277 $
"This could be due to the specified security not being of the requested type. Symbol: {symbol} Requested Type: {type.Name}");
1303 [DocumentationAttribute(HistoricalData)]
1306 int? contractDepthOffset =
null,
bool flatten =
false)
1308 var managedType = type.CreateType();
1309 resolution = GetResolution(symbol, resolution, managedType);
1310 CheckPeriodBasedHistoryRequestResolution(
new[] { symbol }, resolution, managedType);
1312 var marketHours = GetMarketHours(symbol, managedType);
1313 var start = _historyRequestFactory.
GetStartTimeAlgoTz(symbol, periods, resolution.
Value, marketHours.ExchangeHours,
1314 marketHours.DataTimeZone, managedType, extendedMarketHours);
1315 return History(managedType, symbol, start,
Time, resolution, fillForward, extendedMarketHours, dataMappingMode, dataNormalizationMode,
1316 contractDepthOffset, flatten);
1341 int? contractDepthOffset =
null,
bool flatten =
false)
1343 return History(type, symbol,
Time - span,
Time, resolution, fillForward, extendedMarketHours, dataMappingMode, dataNormalizationMode,
1344 contractDepthOffset, flatten);
1359 var pyBenchmark =
PythonUtil.ToFunc<DateTime, decimal>(benchmark);
1360 if (pyBenchmark !=
null)
1378 if (!model.TryConvert(out brokerageModel))
1424 if (securityInitializer1 !=
null)
1442 public string Download(
string address, PyObject headers) =>
Download(address, headers,
null,
null);
1455 public string Download(
string address, PyObject headers,
string userName,
string password)
1457 var dict =
new Dictionary<string, string>();
1459 if (headers !=
null)
1465 if (PyDict.IsDictType(headers))
1467 using var iterator = headers.GetIterator();
1468 foreach (PyObject pyKey
in iterator)
1470 var key = (string)pyKey.AsManagedObject(typeof(
string));
1471 var value = (string)headers.GetItem(pyKey).AsManagedObject(typeof(
string));
1472 dict.Add(key, value);
1477 throw new ArgumentException($
"QCAlgorithm.Fetch(): Invalid argument. {headers.Repr()} is not a dict");
1481 return Download(address, dict, userName, password);
1493 Debug(message.ToSafeString());
1505 Error(message.ToSafeString());
1515 public void Log(PyObject message)
1517 Log(message.ToSafeString());
1527 Quit(message.ToSafeString());
1540 return Consolidate(symbol, period,
null, handler);
1555 var type = GetSubscription(symbol, tickType).
Type;
1559 return Consolidate(symbol, period, tickType, handler.ConvertToDelegate<Action<TradeBar>>());
1564 return Consolidate(symbol, period, tickType, handler.ConvertToDelegate<Action<QuoteBar>>());
1567 return Consolidate(symbol, period, tickType, handler.ConvertToDelegate<Action<BaseData>>());
1580 return Consolidate(symbol, period,
null, handler);
1595 var type = GetSubscription(symbol, tickType).
Type;
1599 return Consolidate(symbol, period, tickType, handler.ConvertToDelegate<Action<TradeBar>>());
1604 return Consolidate(symbol, period, tickType, handler.ConvertToDelegate<Action<QuoteBar>>());
1607 return Consolidate(symbol, period, tickType, handler.ConvertToDelegate<Action<BaseData>>());
1620 return Consolidate(symbol, calendar,
null, handler);
1631 return Schedule.TrainingNow(trainingCode);
1644 return Schedule.Training(dateRule, timeRule, trainingCode);
1659 var type = GetSubscription(symbol, tickType).
Type;
1663 return Consolidate(symbol, calendar, tickType, handler.ConvertToDelegate<Action<TradeBar>>());
1668 return Consolidate(symbol, calendar, tickType, handler.ConvertToDelegate<Action<QuoteBar>>());
1671 return Consolidate(symbol, calendar, tickType, handler.ConvertToDelegate<Action<BaseData>>());
1686 var symbols = symbol.ConvertToSymbolEnumerable();
1687 var convertedIndicator = ConvertPythonIndicator(indicator);
1689 switch (convertedIndicator)
1692 return IndicatorHistory(pythonIndicator, symbols, period, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
1695 return IndicatorHistory(dataPointIndicator, symbols, period, resolution, selector?.ConvertToDelegate<Func<IBaseData, decimal>>());
1698 return IndicatorHistory(baseDataBarIndicator, symbols, period, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseDataBar>>());
1701 return IndicatorHistory(tradeBarIndicator, symbols, period, resolution, selector?.ConvertToDelegate<Func<IBaseData, TradeBar>>());
1704 return IndicatorHistory(baseDataIndicator, symbols, period, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
1707 return IndicatorHistory(baseDataIndicator, symbols, period, resolution, selector?.ConvertToDelegate<Func<IBaseData, BaseData>>());
1711 throw new ArgumentException($
"Indicator type {indicator.GetPythonType().Name} is not supported.");
1743 var symbols = symbol.ConvertToSymbolEnumerable();
1744 var convertedIndicator = ConvertPythonIndicator(indicator);
1746 switch (convertedIndicator)
1749 return IndicatorHistory(pythonIndicator, symbols, start, end, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
1752 return IndicatorHistory(dataPointIndicator, symbols, start, end, resolution, selector?.ConvertToDelegate<Func<IBaseData, decimal>>());
1755 return IndicatorHistory(baseDataBarIndicator, symbols, start, end, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseDataBar>>());
1758 return IndicatorHistory(tradeBarIndicator, symbols, start, end, resolution, selector?.ConvertToDelegate<Func<IBaseData, TradeBar>>());
1761 return IndicatorHistory(baseDataIndicator, symbols, start, end, resolution, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
1764 return IndicatorHistory(baseDataIndicator, symbols, start, end, resolution, selector?.ConvertToDelegate<Func<IBaseData, BaseData>>());
1768 throw new ArgumentException($
"Indicator type {indicator.GetPythonType().Name} is not supported.");
1781 var convertedIndicator = ConvertPythonIndicator(indicator);
1783 switch (convertedIndicator)
1786 return IndicatorHistory(pythonIndicator, history, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
1789 return IndicatorHistory(dataPointIndicator, history, selector?.ConvertToDelegate<Func<IBaseData, decimal>>());
1792 return IndicatorHistory(baseDataBarIndicator, history, selector?.ConvertToDelegate<Func<IBaseData, IBaseDataBar>>());
1795 return IndicatorHistory(tradeBarIndicator, history, selector?.ConvertToDelegate<Func<IBaseData, TradeBar>>());
1798 return IndicatorHistory(baseDataIndicator, history, selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
1801 return IndicatorHistory(baseDataIndicator, history, selector?.ConvertToDelegate<Func<IBaseData, BaseData>>());
1805 throw new ArgumentException($
"Indicator type {indicator.GetPythonType().Name} is not supported.");
1817 public List<OrderTicket>
Liquidate(PyObject symbols,
bool asynchronous =
false,
string tag =
"Liquidated",
IOrderProperties orderProperties =
null)
1819 return Liquidate(symbols.ConvertToSymbolEnumerable(), asynchronous, tag, orderProperties);
1835 return commandWrapper.Run(
this);
1855 return OptionChains(symbols.ConvertToSymbolEnumerable(), flatten);
1863 public string Link(PyObject command)
1865 var payload = ConvertCommandToPayload(command, out var typeName);
1866 return CommandLink(typeName, payload);
1876 var payload = ConvertCommandToPayload(command, out var typeName);
1877 return SendBroadcast(typeName, payload);
1886 private Dictionary<string, object> ConvertCommandToPayload(PyObject command, out
string typeName)
1888 using var _ = Py.GIL();
1891 using var pyType = command.GetPythonType();
1894 return JsonConvert.DeserializeObject<Dictionary<string, object>>(strResult);
1902 private Type GetIndicatorBaseType(Type type)
1904 if (type.BaseType == typeof(
object))
1908 return GetIndicatorBaseType(type.BaseType);
1915 private dynamic[] GetIndicatorArray(PyObject first, PyObject second =
null, PyObject third =
null, PyObject fourth =
null)
1919 var array =
new[] { first, second, third, fourth }
1923 if (x ==
null)
return null;
1926 return x.GetPythonType().TryConvert(out type)
1927 ? x.AsManagedObject(type)
1928 : WrapPythonIndicator(x);
1932 var types = array.Where(x => x !=
null).Select(x => GetIndicatorBaseType(x.GetType())).Distinct();
1934 if (types.Count() > 1)
1936 throw new Exception(
"QCAlgorithm.GetIndicatorArray(). All indicators must be of the same type: data point, bar or tradebar.");
1946 private IndicatorBase ConvertPythonIndicator(PyObject pyIndicator)
1951 convertedIndicator = WrapPythonIndicator(pyIndicator, pythonIndicator);
1953 else if (!pyIndicator.TryConvert(out convertedIndicator))
1955 convertedIndicator = WrapPythonIndicator(pyIndicator);
1958 return convertedIndicator;
1971 if (!_pythonIndicators.TryGetValue(pyObject.Handle, out pythonIndicator))
1973 if (convertedPythonIndicator ==
null)
1975 pyObject.TryConvert(out pythonIndicator);
1979 pythonIndicator = convertedPythonIndicator;
1982 if (pythonIndicator ==
null)
1988 pythonIndicator.SetIndicator(pyObject);
1992 _pythonIndicators.Add(pyObject.Handle, pythonIndicator);
1995 return pythonIndicator;
2001 protected PyObject
GetDataFrame(IEnumerable<Slice> data,
bool flatten, Type dataType =
null)
2004 return flatten ? history : TryCleanupCollectionDataFrame(dataType, history);
2014 return flatten ? history : TryCleanupCollectionDataFrame(typeof(
T), history);
2017 private IEnumerable<T> RemoveMemoizing<T>(IEnumerable<T> data)
2020 if (memoizingEnumerable !=
null)
2024 memoizingEnumerable.
Enabled =
false;
2029 private PyObject TryCleanupCollectionDataFrame(Type dataType, PyObject history)
2035 dynamic dynamic = history;
2040 using var columns =
new PySequence(dynamic.columns);
2041 using var dataKey =
"data".ToPython();
2042 if (columns.Contains(dataKey))
2044 history = dynamic[
"data"];
2048 dynamic.index = dynamic.index.droplevel(
"symbol");