21 using System.Collections.Generic;
30 public partial class QCAlgorithm
32 private readonly List<Func<IBaseData, decimal>> _quoteRequiredFields =
new() {
48 [Obsolete(
"Please use Settings.AutomaticIndicatorWarmUp")]
53 return Settings.AutomaticIndicatorWarmUp;
57 Settings.AutomaticIndicatorWarmUp = value;
73 Resolution? resolution =
null, Func<IBaseData, TradeBar> selector =
null)
76 var accelerationBands =
new AccelerationBands(name, period, width, movingAverageType);
77 InitializeIndicator(accelerationBands, resolution, selector, symbol);
79 return accelerationBands;
94 InitializeIndicator(accumulationDistribution, resolution, selector, symbol);
96 return accumulationDistribution;
113 InitializeIndicator(accumulationDistributionOscillator, resolution, selector, symbol);
115 return accumulationDistributionOscillator;
131 public Alpha A(
Symbol target,
Symbol reference,
int alphaPeriod = 1,
int betaPeriod = 252,
Resolution? resolution =
null, decimal? riskFreeRate =
null, Func<IBaseData, IBaseDataBar> selector =
null)
133 var baseBame = riskFreeRate.HasValue ? $
"A({alphaPeriod},{betaPeriod},{riskFreeRate})" : $
"A({alphaPeriod},{betaPeriod})";
141 var alpha =
new Alpha(name, target, reference, alphaPeriod, betaPeriod, riskFreeRateModel);
142 InitializeIndicator(alpha, resolution, selector, target, reference);
160 InitializeIndicator(averageRange, resolution, selector, symbol);
177 Resolution? resolution =
null, Func<IBaseData, decimal> selector =
null)
179 var name =
CreateIndicatorName(symbol, $
"ARIMA({arOrder},{diffOrder},{maOrder},{period})", resolution);
181 InitializeIndicator(arimaIndicator, resolution, selector, symbol);
183 return arimaIndicator;
200 InitializeIndicator(averageDirectionalIndex, resolution, selector, symbol);
202 return averageDirectionalIndex;
217 var name =
CreateIndicatorName(symbol, $
"AO({fastPeriod},{slowPeriod},{type})", resolution);
218 var awesomeOscillator =
new AwesomeOscillator(name, fastPeriod, slowPeriod, type);
219 InitializeIndicator(awesomeOscillator, resolution, selector, symbol);
221 return awesomeOscillator;
237 InitializeIndicator(averageDirectionalMovementIndexRating, resolution, selector, symbol);
239 return averageDirectionalMovementIndexRating;
261 InitializeIndicator(arnaudLegouxMovingAverage, resolution, selector, symbol);
263 return arnaudLegouxMovingAverage;
281 InitializeIndicator(absolutePriceOscillator, resolution, selector, symbol);
283 return absolutePriceOscillator;
297 return AROON(symbol, period, period, resolution, selector);
314 InitializeIndicator(aroonOscillator, resolution, selector, symbol);
316 return aroonOscillator;
334 InitializeIndicator(averageTrueRange, resolution, selector, symbol);
336 return averageTrueRange;
353 InitializeIndicator(augenPriceSpike, resolution, selector, symbol);
355 return augenPriceSpike;
370 Resolution? resolution =
null, Func<IBaseData, decimal> selector =
null)
373 var bollingerBands =
new BollingerBands(name, period, k, movingAverageType);
374 InitializeIndicator(bollingerBands, resolution, selector, symbol);
376 return bollingerBands;
393 var beta =
new Beta(name, target, reference, period);
394 InitializeIndicator(beta, resolution, selector, target, reference);
412 InitializeIndicator(balanceOfPower, resolution, selector, symbol);
414 return balanceOfPower;
429 Func<IBaseData, decimal> selector =
null)
431 var name =
CreateIndicatorName(symbol, $
"CC({shortRocPeriod},{longRocPeriod},{lwmaPeriod})", resolution);
432 var coppockCurve =
new CoppockCurve(name, shortRocPeriod, longRocPeriod, lwmaPeriod);
433 InitializeIndicator(coppockCurve, resolution, selector, symbol);
453 var correlation =
new Correlation(name, target, reference, period, correlationType);
454 InitializeIndicator(correlation, resolution, selector, target, reference);
474 InitializeIndicator(commodityChannelIndex, resolution, selector, symbol);
476 return commodityChannelIndex;
493 InitializeIndicator(indicator, resolution, selector, symbol);
512 var name =
CreateIndicatorName(symbol, $
"CKS({atrPeriod},{atrMult},{period})", resolution);
513 var indicator =
new ChandeKrollStop(name, atrPeriod, atrMult, period, movingAverageType);
514 InitializeIndicator(indicator, resolution, selector, symbol);
531 InitializeIndicator(chaikinMoneyFlow, resolution, selector, symbol);
533 return chaikinMoneyFlow;
550 InitializeIndicator(chandeMomentumOscillator, resolution, selector, symbol);
552 return chandeMomentumOscillator;
570 var name =
CreateIndicatorName(symbol, $
"CRSI({rsiPeriod},{rsiPeriodStreak},{lookBackPeriod})", resolution);
572 InitializeIndicator(connorsRelativeStrengthIndex, resolution, selector, symbol);
573 return connorsRelativeStrengthIndex;
591 InitializeIndicator(deMarkerIndicator, resolution, selector, symbol);
592 return deMarkerIndicator;
605 [DocumentationAttribute(Indicators)]
609 var donchianChannel =
new DonchianChannel(name, upperPeriod, lowerPeriod);
610 InitializeIndicator(donchianChannel, resolution, selector, symbol);
612 return donchianChannel;
627 return DCH(symbol, period, period, resolution, selector);
643 public Delta D(
Symbol symbol,
Symbol mirrorOption =
null, decimal? riskFreeRate =
null, decimal? dividendYield =
null,
646 var name = InitializeOptionIndicator<Delta>(symbol, out var riskFreeRateModel, out var dividendYieldModel, riskFreeRate, dividendYield, optionModel, resolution);
648 var delta =
new Delta(name, symbol, riskFreeRateModel, dividendYieldModel, mirrorOption, optionModel, ivModel);
649 InitializeOptionIndicator(delta, resolution, symbol, mirrorOption);
669 return D(symbol, mirrorOption, riskFreeRate, dividendYield, optionModel, ivModel, resolution);
685 InitializeIndicator(doubleExponentialMovingAverage, resolution, selector, symbol);
687 return doubleExponentialMovingAverage;
702 public DerivativeOscillator DO(
Symbol symbol,
int rsiPeriod,
int smoothingRsiPeriod,
int doubleSmoothingRsiPeriod,
int signalLinePeriod,
Resolution? resolution =
null, Func<IBaseData, decimal> selector =
null)
704 var name =
CreateIndicatorName(symbol, $
"DO({rsiPeriod},{smoothingRsiPeriod},{doubleSmoothingRsiPeriod},{signalLinePeriod})", resolution);
705 var derivativeOscillator =
new DerivativeOscillator(name, rsiPeriod, smoothingRsiPeriod, doubleSmoothingRsiPeriod, signalLinePeriod);
706 InitializeIndicator(derivativeOscillator, resolution, selector, symbol);
708 return derivativeOscillator;
724 InitializeIndicator(detrendedPriceOscillator, resolution, selector, symbol);
726 return detrendedPriceOscillator;
759 InitializeIndicator(exponentialMovingAverage, resolution, selector, symbol);
761 return exponentialMovingAverage;
779 InitializeIndicator(easeOfMovementValue, resolution, selector, symbol);
781 return easeOfMovementValue;
796 var resolution = GetSubscription(symbol).
Resolution;
815 RegisterIndicator<IBaseData>(symbol, filteredIdentity, resolution, selector);
816 return filteredIdentity;
832 var name = Invariant($
"{symbol}({fieldName ?? "close
"}_{resolution})");
834 RegisterIndicator<IBaseData>(symbol, filteredIdentity,
ResolveConsolidator(symbol, resolution), selector);
835 return filteredIdentity;
852 var indicator =
new ForceIndex(name, period, type);
853 InitializeIndicator(indicator, resolution, selector, symbol);
872 InitializeIndicator(fisherTransform, resolution, selector, symbol);
874 return fisherTransform;
893 InitializeIndicator(fractalAdaptiveMovingAverage, resolution, selector, symbol);
895 return fractalAdaptiveMovingAverage;
911 public Gamma G(
Symbol symbol,
Symbol mirrorOption =
null, decimal? riskFreeRate =
null, decimal? dividendYield =
null,
914 var name = InitializeOptionIndicator<Gamma>(symbol, out var riskFreeRateModel, out var dividendYieldModel, riskFreeRate, dividendYield, optionModel, resolution);
916 var gamma =
new Gamma(name, symbol, riskFreeRateModel, dividendYieldModel, mirrorOption, optionModel, ivModel);
917 InitializeOptionIndicator(gamma, resolution, symbol, mirrorOption);
937 return G(symbol, mirrorOption, riskFreeRate, dividendYield, optionModel, ivModel, resolution);
952 InitializeIndicator(heikinAshi, resolution, selector, symbol);
973 InitializeIndicator(hurstExponent, resolution, selector, symbol);
974 return hurstExponent;
992 public HilbertTransform HT(
Symbol symbol,
int length, decimal inPhaseMultiplicationFactor, decimal quadratureMultiplicationFactor,
Resolution? resolution =
null, Func<IBaseData, decimal> selector =
null)
994 var name =
CreateIndicatorName(symbol, $
"HT({length}, {inPhaseMultiplicationFactor}, {quadratureMultiplicationFactor})", resolution);
995 var hilbertTransform =
new HilbertTransform(length, inPhaseMultiplicationFactor, quadratureMultiplicationFactor);
996 InitializeIndicator(hilbertTransform, resolution, selector, symbol);
998 return hilbertTransform;
1014 InitializeIndicator(hullMovingAverage, resolution, selector, symbol);
1016 return hullMovingAverage;
1032 InitializeIndicator(indicator, resolution, selector, symbol);
1053 int senkouADelayPeriod,
int senkouBDelayPeriod,
Resolution? resolution =
null, Func<IBaseData, TradeBar> selector =
null)
1055 var name =
CreateIndicatorName(symbol, $
"ICHIMOKU({tenkanPeriod},{kijunPeriod},{senkouAPeriod},{senkouBPeriod},{senkouADelayPeriod},{senkouBDelayPeriod})", resolution);
1056 var ichimokuKinkoHyo =
new IchimokuKinkoHyo(name, tenkanPeriod, kijunPeriod, senkouAPeriod, senkouBPeriod, senkouADelayPeriod, senkouBDelayPeriod);
1057 InitializeIndicator(ichimokuKinkoHyo, resolution, selector, symbol);
1059 return ichimokuKinkoHyo;
1073 var resolution = GetSubscription(symbol).
Resolution;
1074 return Identity(symbol, resolution, selector, fieldName);
1091 InitializeIndicator(identity, resolution, selector, symbol);
1105 public Identity Identity(
Symbol symbol, TimeSpan resolution, Func<IBaseData, decimal> selector =
null,
string fieldName =
null)
1107 var name = Invariant($
"{symbol}({fieldName ?? "close
"},{resolution})");
1128 var name = InitializeOptionIndicator<ImpliedVolatility>(symbol, out var riskFreeRateModel, out var dividendYieldModel, riskFreeRate, dividendYield, optionModel, resolution);
1130 var iv =
new ImpliedVolatility(name, symbol, riskFreeRateModel, dividendYieldModel, mirrorOption, optionModel);
1131 InitializeOptionIndicator(iv, resolution, symbol, mirrorOption);
1146 return KAMA(symbol, period, 2, 30, resolution, selector);
1162 var name =
CreateIndicatorName(symbol, $
"KAMA({period},{fastEmaPeriod},{slowEmaPeriod})", resolution);
1164 InitializeIndicator(kaufmanAdaptiveMovingAverage, resolution, selector, symbol);
1166 return kaufmanAdaptiveMovingAverage;
1183 InitializeIndicator(kaufmanEfficiencyRatio, resolution, selector, symbol);
1185 return kaufmanEfficiencyRatio;
1203 var keltnerChannels =
new KeltnerChannels(name, period, k, movingAverageType);
1204 InitializeIndicator(keltnerChannels, resolution, selector, symbol);
1206 return keltnerChannels;
1221 var logReturn =
new LogReturn(name, period);
1222 InitializeIndicator(logReturn, resolution, selector, symbol);
1240 InitializeIndicator(leastSquaresMovingAverage, resolution, selector, symbol);
1242 return leastSquaresMovingAverage;
1259 InitializeIndicator(linearWeightedMovingAverage, resolution, selector, symbol);
1261 return linearWeightedMovingAverage;
1278 var name =
CreateIndicatorName(symbol, $
"MACD({fastPeriod},{slowPeriod},{signalPeriod})", resolution);
1280 InitializeIndicator(movingAverageConvergenceDivergence, resolution, selector, symbol);
1282 return movingAverageConvergenceDivergence;
1298 InitializeIndicator(meanAbsoluteDeviation, resolution, selector, symbol);
1300 return meanAbsoluteDeviation;
1318 InitializeIndicator(mesaAdaptiveMovingAverage, resolution, selector, symbol);
1319 return mesaAdaptiveMovingAverage;
1337 var marketProfile =
new VolumeProfile(name, period, valueAreaVolumePercentage, priceRangeRoundOff);
1338 InitializeIndicator(marketProfile, resolution, selector, symbol);
1340 return marketProfile;
1355 public TimeProfile TP(
Symbol symbol,
int period = 2, decimal valueAreaVolumePercentage = 0.70m, decimal priceRangeRoundOff = 0.05m,
Resolution resolution =
Resolution.Daily, Func<IBaseData, TradeBar> selector =
null)
1358 var marketProfile =
new TimeProfile(name, period, valueAreaVolumePercentage, priceRangeRoundOff);
1359 InitializeIndicator(marketProfile, resolution, selector, symbol);
1361 return marketProfile;
1377 InitializeIndicator(timeSeriesForecast, resolution, selector, symbol);
1379 return timeSeriesForecast;
1395 var maximum =
new Maximum(name, period);
1398 if (selector ==
null)
1400 var subscription = GetSubscription(symbol);
1401 if (typeof(
TradeBar).IsAssignableFrom(subscription.Type))
1404 selector = x => ((
TradeBar)x).High;
1408 InitializeIndicator(maximum, resolution, selector, symbol);
1426 InitializeIndicator(moneyFlowIndex, resolution, selector, symbol);
1428 return moneyFlowIndex;
1445 var massIndex =
new MassIndex(name, emaPeriod, sumPeriod);
1446 InitializeIndicator(massIndex, resolution, selector, symbol);
1463 var midPoint =
new MidPoint(name, period);
1464 InitializeIndicator(midPoint, resolution, selector, symbol);
1481 var midPrice =
new MidPrice(name, period);
1482 InitializeIndicator(midPrice, resolution, selector, symbol);
1500 var minimum =
new Minimum(name, period);
1503 if (selector ==
null)
1505 var subscription = GetSubscription(symbol);
1506 if (typeof(
TradeBar).IsAssignableFrom(subscription.Type))
1513 InitializeIndicator(minimum, resolution, selector, symbol);
1530 var momentum =
new Momentum(name, period);
1531 InitializeIndicator(momentum, resolution, selector, symbol);
1548 var name =
CreateIndicatorName(symbol, $
"MOMERSION({minPeriod},{fullPeriod})", resolution);
1550 InitializeIndicator(momersion, resolution, selector, symbol);
1569 InitializeIndicator(momentumPercent, resolution, selector, symbol);
1571 return momentumPercent;
1587 InitializeIndicator(normalizedAverageTrueRange, resolution, selector, symbol);
1589 return normalizedAverageTrueRange;
1606 InitializeIndicator(onBalanceVolume, resolution, selector, symbol);
1608 return onBalanceVolume;
1625 var pivotPointsHighLow =
new PivotPointsHighLow(name, lengthHigh, lengthLow, lastStoredValues);
1626 InitializeIndicator(pivotPointsHighLow, resolution, selector, symbol);
1628 return pivotPointsHighLow;
1646 InitializeIndicator(percentagePriceOscillator, resolution, selector, symbol);
1648 return percentagePriceOscillator;
1664 var name =
CreateIndicatorName(symbol, $
"PSAR({afStart},{afIncrement},{afMax})", resolution);
1666 InitializeIndicator(parabolicStopAndReverse, resolution, selector, symbol);
1668 return parabolicStopAndReverse;
1685 InitializeIndicator(regressionChannel, resolution, selector, symbol);
1687 return regressionChannel;
1703 InitializeIndicator(relativeMovingAverage, resolution, selector, symbol);
1705 return relativeMovingAverage;
1723 InitializeIndicator(rateOfChange, resolution, selector, symbol);
1725 return rateOfChange;
1742 InitializeIndicator(rateOfChangePercent, resolution, selector, symbol);
1744 return rateOfChangePercent;
1760 InitializeIndicator(rateOfChangeRatio, resolution, selector, symbol);
1762 return rateOfChangeRatio;
1780 InitializeIndicator(relativeStrengthIndex, resolution, selector, symbol);
1782 return relativeStrengthIndex;
1799 InitializeIndicator(relativeVigorIndex, resolution, selector, symbol);
1801 return relativeVigorIndex;
1820 return relativeDailyVolume;
1836 public Rho R(
Symbol symbol,
Symbol mirrorOption =
null, decimal? riskFreeRate =
null, decimal? dividendYield =
null,
1839 var name = InitializeOptionIndicator<Rho>(symbol, out var riskFreeRateModel, out var dividendYieldModel, riskFreeRate, dividendYield, optionModel, resolution);
1841 var rho =
new Rho(name, symbol, riskFreeRateModel, dividendYieldModel, mirrorOption, optionModel, ivModel);
1842 InitializeOptionIndicator(rho, resolution, symbol, mirrorOption);
1862 return R(symbol, mirrorOption, riskFreeRate, dividendYield, optionModel, ivModel, resolution);
1880 Resolution? resolution =
null, Func<IBaseData, decimal> selector =
null)
1882 var name =
CreateIndicatorName(symbol, $
"SRSI({rsiPeriod},{stochPeriod},{kSmoothingPeriod},{dSmoothingPeriod})", resolution);
1884 InitializeIndicator(indicator, resolution, selector, symbol);
1899 Resolution? resolution =
null, Func<IBaseData, IBaseDataBar> selector =
null)
1902 var strend =
new SuperTrend(name, period, multiplier, movingAverageType);
1903 InitializeIndicator(strend, resolution, selector, symbol);
1922 var baseBame = riskFreeRate.HasValue ? $
"SR({sharpePeriod},{riskFreeRate})" : $
"SR({sharpePeriod})";
1928 var sharpeRatio =
new SharpeRatio(name, sharpePeriod, riskFreeRateModel);
1929 InitializeIndicator(sharpeRatio, resolution, selector, symbol);
1946 var name =
CreateIndicatorName(symbol, $
"SORTINO({sortinoPeriod},{minimumAcceptableReturn})", resolution);
1947 var sortinoRatio =
new SortinoRatio(name, sortinoPeriod, minimumAcceptableReturn);
1948 InitializeIndicator(sortinoRatio, resolution, selector, symbol);
1950 return sortinoRatio;
1967 decimal keltnerMultiplier = 1.5m,
Resolution? resolution =
null, Func<IBaseData, IBaseDataBar> selector =
null)
1969 var name =
CreateIndicatorName(symbol, $
"SM({bollingerPeriod}, {bollingerMultiplier}, {keltnerPeriod}, {keltnerMultiplier})", resolution);
1970 var squeezeMomentum =
new SqueezeMomentum(name, bollingerPeriod, bollingerMultiplier, keltnerPeriod, keltnerMultiplier);
1971 InitializeIndicator(squeezeMomentum, resolution, selector, symbol);
1972 return squeezeMomentum;
1989 InitializeIndicator(simpleMovingAverage, resolution, selector, symbol);
1991 return simpleMovingAverage;
2009 var name =
CreateIndicatorName(symbol, $
"STC({cyclePeriod},{fastPeriod},{slowPeriod})", resolution);
2010 var schaffTrendCycle =
new SchaffTrendCycle(name, cyclePeriod, fastPeriod, slowPeriod, movingAverageType);
2011 InitializeIndicator(schaffTrendCycle, resolution, selector, symbol);
2013 return schaffTrendCycle;
2031 InitializeIndicator(indicator, resolution, selector, symbol);
2048 InitializeIndicator(standardDeviation, resolution, selector, symbol);
2050 return standardDeviation;
2066 var name =
CreateIndicatorName(symbol, $
"TDD({period},{minimumAcceptableReturn})", resolution);
2068 InitializeIndicator(targetDownsideDeviation, resolution, selector, symbol);
2070 return targetDownsideDeviation;
2085 Func<IBaseData, TradeBar> selector =
null)
2088 var stochastic =
new Stochastic(name, period, kPeriod, dPeriod);
2089 InitializeIndicator(stochastic, resolution, selector, symbol);
2105 return STO(symbol, period, period, 3, resolution, selector);
2122 InitializeIndicator(premierStochasticOscillator, resolution, selector, symbol);
2123 return premierStochasticOscillator;
2138 var sum =
new Sum(name, period);
2139 InitializeIndicator(sum, resolution, selector, symbol);
2159 var swissArmyKnife =
new SwissArmyKnife(name, period, delta, tool);
2160 InitializeIndicator(swissArmyKnife, resolution, selector, symbol);
2162 return swissArmyKnife;
2178 public Theta T(
Symbol symbol,
Symbol mirrorOption =
null, decimal? riskFreeRate =
null, decimal? dividendYield =
null,
2181 var name = InitializeOptionIndicator<Theta>(symbol, out var riskFreeRateModel, out var dividendYieldModel, riskFreeRate, dividendYield, optionModel, resolution);
2183 var theta =
new Theta(name, symbol, riskFreeRateModel, dividendYieldModel, mirrorOption, optionModel, ivModel);
2184 InitializeOptionIndicator(theta, resolution, symbol, mirrorOption);
2204 return T(symbol, mirrorOption, riskFreeRate, dividendYield, optionModel, ivModel, resolution);
2220 var t3MovingAverage =
new T3MovingAverage(name, period, volumeFactor);
2221 InitializeIndicator(t3MovingAverage, resolution, selector, symbol);
2223 return t3MovingAverage;
2239 InitializeIndicator(tripleExponentialMovingAverage, resolution, selector, symbol);
2241 return tripleExponentialMovingAverage;
2260 var name =
CreateIndicatorName(symbol, $
"TSI({longTermPeriod},{shortTermPeriod},{signalPeriod})", resolution);
2261 var trueStrengthIndex =
new TrueStrengthIndex(name, longTermPeriod, shortTermPeriod, signalPeriod, signalType);
2262 InitializeIndicator(trueStrengthIndex, resolution, selector, symbol);
2264 return trueStrengthIndex;
2279 InitializeIndicator(trueRange, resolution, selector, symbol);
2297 InitializeIndicator(triangularMovingAverage, resolution, selector, symbol);
2299 return triangularMovingAverage;
2314 var trix =
new Trix(name, period);
2315 InitializeIndicator(trix, resolution, selector, symbol);
2333 var name =
CreateIndicatorName(symbol, $
"ULTOSC({period1},{period2},{period3})", resolution);
2335 InitializeIndicator(ultimateOscillator, resolution, selector, symbol);
2337 return ultimateOscillator;
2353 public Vega V(
Symbol symbol,
Symbol mirrorOption =
null, decimal? riskFreeRate =
null, decimal? dividendYield =
null,
2356 var name = InitializeOptionIndicator<Vega>(symbol, out var riskFreeRateModel, out var dividendYieldModel, riskFreeRate, dividendYield, optionModel, resolution);
2358 var vega =
new Vega(name, symbol, riskFreeRateModel, dividendYieldModel, mirrorOption, optionModel, ivModel);
2359 InitializeOptionIndicator(vega, resolution, symbol, mirrorOption);
2376 InitializeIndicator(variableIndexDynamicAverage, resolution, selector, symbol);
2378 return variableIndexDynamicAverage;
2390 [Obsolete(
"'VAR' is obsolete please use 'V' instead")]
2393 return V(symbol, period, resolution, selector);
2408 var variance =
new Variance(name, period);
2409 InitializeIndicator(variance, resolution, selector, symbol);
2426 var valueAtRisk =
new ValueAtRisk(name, period, confidenceLevel);
2427 InitializeIndicator(valueAtRisk, resolution, selector, symbol);
2446 InitializeIndicator(volumeWeightedAveragePriceIndicator, resolution, selector, symbol);
2448 return volumeWeightedAveragePriceIndicator;
2463 return intradayVwap;
2480 InitializeIndicator(indicator, resolution, selector, symbol);
2497 var indicator =
new Vortex(name, period);
2498 InitializeIndicator(indicator, resolution, selector, symbol);
2517 InitializeIndicator(williamsPercentR, resolution, selector, symbol);
2519 return williamsPercentR;
2537 InitializeIndicator(wilderMovingAverage, resolution, selector, symbol);
2539 return wilderMovingAverage;
2554 Func<IBaseData, TradeBar> selector =
null)
2558 InitializeIndicator(si, resolution, selector, symbol);
2575 Func<IBaseData, TradeBar> selector =
null)
2579 InitializeIndicator(asi, resolution, selector, symbol);
2594 return TRIN(symbols.ToArray(), resolution, selector);
2609 foreach (var symbol
in symbols)
2613 InitializeIndicator(trin, resolution, selector, symbols);
2630 foreach (var symbol
in symbols)
2634 InitializeIndicator(adr, resolution, selector, symbols.ToArray());
2651 foreach (var symbol
in symbols)
2655 InitializeIndicator(advr, resolution, selector, symbols.ToArray());
2672 foreach (var symbol
in symbols)
2676 InitializeIndicator(adDiff, resolution, selector, symbols.ToArray());
2694 InitializeIndicator(indicator, resolution, selector, symbol);
2710 return MOSC(symbols.ToArray(), fastPeriod, slowPeriod, resolution, selector);
2727 foreach (var symbol
in symbols)
2731 InitializeIndicator(mosc, resolution, selector, symbols);
2748 return MSI(symbols.ToArray(), fastPeriod, slowPeriod, resolution, selector);
2765 foreach (var symbol
in symbols)
2769 InitializeIndicator(msi, resolution, selector, symbols);
2789 InitializeIndicator(indicator, resolution, selector, symbol);
2808 InitializeIndicator(zeroLagExponentialMovingAverage, resolution, selector, symbol);
2810 return zeroLagExponentialMovingAverage;
2823 public ZigZag ZZ(
Symbol symbol, decimal sensitivity = 0.05m,
int minTrendLength = 1,
Resolution? resolution =
null, Func<IBaseData, IBaseDataBar> selector =
null)
2825 var name =
CreateIndicatorName(symbol, $
"ZZ({sensitivity},{minTrendLength})", resolution);
2826 var zigZag =
new ZigZag(name, sensitivity, minTrendLength);
2827 InitializeIndicator(zigZag, resolution, selector, symbol);
2856 if (!resolution.HasValue && symbolIsNotEmpty)
2858 resolution = GetSubscription(symbol).
Resolution;
2861 var res =
string.Empty;
2888 throw new ArgumentOutOfRangeException(nameof(resolution), resolution,
"resolution parameter is out of range.");
2891 var parts =
new List<string>();
2893 if (symbolIsNotEmpty)
2899 return Invariant($
"{type}({string.Join("_
", parts)})").Replace(
")(",
",");
2916 .GetSubscriptionDataConfigs(symbol)
2919 .ThenBy(x => x.TickType)
2923 subscription = subscriptions.FirstOrDefault(x => tickType ==
null || tickType == x.TickType);
2924 if (subscription ==
null)
2927 subscription = subscriptions.First();
2930 catch (InvalidOperationException)
2933 throw new Exception($
"Please register to receive data for symbol \'{symbol}\' using the AddSecurity() function.");
2935 return subscription;
2946 [DocumentationAttribute(ConsolidatingData)]
2947 [DocumentationAttribute(Indicators)]
2981 selector = selector ?? (x => x.Value);
2983 RegisterConsolidator(symbol, consolidator,
null, indicator);
2988 var value = selector(consolidated);
2989 indicator.Update(
new IndicatorDataPoint(consolidated.Symbol, consolidated.EndTime, value));
3054 var selectorToUse = selector ?? (x => (
T)x);
3056 RegisterConsolidator(symbol, consolidator,
null, indicator);
3059 var type = typeof(
T);
3060 if (!type.IsAssignableFrom(consolidator.
OutputType))
3066 selectorToUse = consolidated => (
T)(
object)
new IndicatorDataPoint(consolidated.Symbol, consolidated.EndTime, consolidated.Value);
3070 throw new ArgumentException($
"Type mismatch found between consolidator and indicator for symbol: {symbol}." +
3071 $
"Consolidator outputs type {consolidator.OutputType.Name} but indicator expects input type {type.Name}"
3079 var value = selectorToUse(consolidated);
3080 indicator.Update(value);
3103 foreach (var consolidator
in indicator.Consolidators)
3108 indicator.Consolidators.Clear();
3136 if (AssertIndicatorHasWarmupPeriod(indicator))
3167 var history = GetIndicatorWarmUpHistory(symbols, indicator, period, out var identityConsolidator);
3168 if (history == Enumerable.Empty<
Slice>())
return;
3171 selector ??= (x => x.Value);
3173 Action<IBaseData> onDataConsolidated = bar =>
3176 indicator.Update(input);
3179 WarmUpIndicatorImpl(symbols, period, onDataConsolidated, history, identityConsolidator);
3209 if (AssertIndicatorHasWarmupPeriod(indicator))
3227 var history = GetIndicatorWarmUpHistory(symbols, indicator, period, out var identityConsolidator);
3228 if (history == Enumerable.Empty<
Slice>())
return;
3231 selector ??= GetDefaultSelector<T>();
3234 Action<T> onDataConsolidated = bar =>
3236 indicator.Update(selector(bar));
3239 WarmUpIndicatorImpl(symbols, period, onDataConsolidated, history, identityConsolidator);
3257 private Func<IBaseData, T> GetDefaultSelector<T>()
3275 private IEnumerable<Slice> GetIndicatorWarmUpHistory(IEnumerable<Symbol> symbols,
IIndicator indicator, TimeSpan timeSpan, out
bool identityConsolidator)
3277 identityConsolidator =
false;
3278 if (!AssertIndicatorHasWarmupPeriod(indicator))
3280 return Enumerable.Empty<
Slice>();
3286 var resolution = timeSpan.ToHigherResolutionEquivalent(
false);
3288 identityConsolidator = resolution.ToTimeSpan() == timeSpan;
3289 var resolutionTicks = resolution.ToTimeSpan().
Ticks;
3290 if (resolutionTicks != 0)
3292 periods *= (int)(timeSpan.Ticks / resolutionTicks);
3297 return History(symbols, periods, resolution, dataNormalizationMode: GetIndicatorHistoryDataNormalizationMode(indicator));
3299 catch (ArgumentException e)
3301 Debug($
"{indicator.Name} could not be warmed up. Reason: {e.Message}");
3304 return Enumerable.Empty<
Slice>();
3307 private bool AssertIndicatorHasWarmupPeriod(
IIndicator indicator)
3311 if (!_isEmitWarmupInsightWarningSent)
3313 Debug($
"Warning: the 'WarmUpIndicator' feature only works with indicators which inherit from '{nameof(IIndicatorWarmUpPeriodProvider)}'" +
3314 $
" and define a warm up period, setting property 'WarmUpPeriod' with a value > 0." +
3315 $
" The provided indicator of type '{indicator.GetType().Name}' will not be warmed up.");
3316 _isEmitWarmupInsightWarningSent =
true;
3323 private void WarmUpIndicatorImpl<T>(IEnumerable<Symbol> symbols, TimeSpan period, Action<T> handler, IEnumerable<Slice> history,
bool identityConsolidator)
3326 var consolidators = symbols.ToDictionary(symbol => symbol, symbol =>
3331 consolidator = Consolidate(symbol, period, handler);
3335 if (identityConsolidator)
3337 period = TimeSpan.Zero;
3340 var providedType = typeof(
T);
3341 if (providedType.IsAbstract)
3343 var dataType = SubscriptionManager.LookupSubscriptionConfigDataTypes(
3344 symbol.SecurityType,
3347 symbol.IsCanonical())
3349 .OrderByDescending(tuple => LeanData.IsCommonLeanDataType(tuple.Item1))
3350 .ThenBy(tuple => tuple.Item2).First();
3352 consolidator = CreateConsolidator(period, dataType.Item1, dataType.Item2);
3357 var tickType = LeanData.GetCommonTickTypeForCommonDataTypes(providedType, symbol.SecurityType);
3358 consolidator = CreateConsolidator(period, providedType, tickType);
3363 return consolidator;
3366 foreach (var slice
in history)
3368 foreach (var (symbol, consolidator) in consolidators)
3370 var consolidatorInputType = consolidator.
InputType;
3371 if (slice.TryGet(consolidatorInputType, symbol, out var data))
3373 consolidator.
Update(data);
3379 foreach (var (symbol, consolidator) in consolidators)
3383 DateTime currentTime;
3384 if (
Securities.TryGetValue(symbol, out var security))
3386 currentTime = security.LocalTime;
3391 currentTime =
UtcTime.ConvertFromUtc(exchangeHours.TimeZone);
3394 consolidator.
Scan(currentTime);
3408 [DocumentationAttribute(ConsolidatingData)]
3409 [DocumentationAttribute(Indicators)]
3413 return CreateConsolidator(symbol,
null, tickType,
null, resolution,
null);
3428 return CreateConsolidator(symbol,
null, tickType, timeSpan,
null,
null);
3441 if (period.Ticks == 0)
3443 return CreateIdentityConsolidator(consolidatorInputType);
3448 if (typeof(
TradeBar).IsAssignableFrom(consolidatorInputType))
3455 if (typeof(
QuoteBar).IsAssignableFrom(consolidatorInputType))
3462 if (typeof(
Tick).IsAssignableFrom(consolidatorInputType))
3478 if (typeof(
DynamicData).IsAssignableFrom(consolidatorInputType))
3497 return Consolidate(symbol, period,
TickType.Trade, handler);
3510 return Consolidate(symbol, period,
TickType.Trade, handler);
3523 return Consolidate(symbol, period.ToTimeSpan(),
TickType.Quote, handler);
3536 return Consolidate(symbol, period,
TickType.Quote, handler);
3555 return Consolidate(symbol, period, tickType, handler);
3571 return Consolidate(symbol,
null, tickType, handler,
null, period);
3587 return Consolidate(symbol,
null, tickType, handler, period,
null);
3600 return Consolidate(symbol, calendar,
TickType.Quote, handler);
3613 return Consolidate(symbol, calendar,
TickType.Trade, handler);
3632 return Consolidate(symbol, calendar, tickType, handler);
3648 return Consolidate(symbol, calendar, tickType, handler,
null,
null);
3663 return IndicatorHistory(indicator,
new[] { symbol }, period, resolution, selector);
3679 if (warmupPeriod > 0 && period > 0)
3683 var history =
History(symbols, period + warmupPeriod, resolution, dataNormalizationMode: GetIndicatorHistoryDataNormalizationMode(indicator));
3700 return IndicatorHistory(indicator,
new[] { symbol }, period, resolution, selector);
3717 if (warmupPeriod > 0 && period > 0)
3721 var history =
History(symbols, period + warmupPeriod, resolution, dataNormalizationMode: GetIndicatorHistoryDataNormalizationMode(indicator));
3737 return IndicatorHistory(indicator,
new[] { symbol }, span, resolution, selector);
3784 return IndicatorHistory(indicator,
new[] { symbol }, span, resolution, selector);
3800 var history =
History(symbols, GetIndicatorAdjustedHistoryStart(indicator, symbols, start, end, resolution), end, resolution, dataNormalizationMode: GetIndicatorHistoryDataNormalizationMode(indicator));
3817 return IndicatorHistory(indicator,
new[] { symbol }, start, end, resolution, selector);
3834 return IndicatorHistory(indicator,
new[] { symbol }, start, end, resolution, selector);
3851 var history =
History(symbols, GetIndicatorAdjustedHistoryStart(indicator, symbols, start, end, resolution), end, resolution, dataNormalizationMode: GetIndicatorHistoryDataNormalizationMode(indicator));
3864 selector ??= (x => x.Value);
3865 return IndicatorHistory(indicator, history, (bar) => indicator.Update(
new IndicatorDataPoint(bar.Symbol, bar.EndTime, selector(bar))), GetDataTypeFromSelector(selector));
3878 selector ??= GetDefaultSelector<T>();
3879 return IndicatorHistory(indicator, history, (bar) => indicator.Update(selector(bar)));
3889 var consolidator = CreateConsolidator(symbol, calendar, tickType, period, resolution, typeof(T));
3890 if (handler !=
null)
3893 consolidator.DataConsolidated += (sender, consolidated) => handler((T)consolidated);
3896 RegisterConsolidator(symbol, consolidator, tickType, indicatorBase:
null);
3898 return consolidator;
3901 private IDataConsolidator CreateConsolidator(Symbol symbol, Func<DateTime, CalendarInfo> calendar,
TickType? tickType, TimeSpan? period,
Resolution? resolution, Type consolidatorType)
3904 var subscription = GetSubscription(symbol, tickType);
3908 if (period.HasValue && period.Value < subscription.Increment || resolution.HasValue && resolution.Value < subscription.Resolution)
3910 throw new ArgumentException($
"Unable to create {symbol} consolidator because {symbol} is registered for " +
3911 Invariant($
"{subscription.Resolution.ToStringInvariant()} data. Consolidators require higher resolution data to produce lower resolution data.")
3916 if (calendar !=
null)
3919 consolidator = CreateConsolidator(calendar, subscription.Type, subscription.TickType);
3924 if (!period.HasValue && !resolution.HasValue)
3926 period = subscription.Increment;
3929 if (period.HasValue && period.Value == subscription.Increment || resolution.HasValue && resolution.Value == subscription.Resolution)
3931 consolidator = CreateIdentityConsolidator(subscription.Type);
3935 if (resolution.HasValue)
3939 consolidator =
new MarketHourAwareConsolidator(Settings.DailyPreciseEndTime, resolution.Value, subscription.Type, subscription.TickType,
3940 Settings.DailyConsolidationUseExtendedMarketHours && subscription.ExtendedMarketHours);
3942 period = resolution.Value.ToTimeSpan();
3944 consolidator ??= CreateConsolidator(period.Value, subscription.Type, subscription.TickType);
3948 if (consolidatorType !=
null && !consolidatorType.IsAssignableFrom(consolidator.
OutputType))
3950 throw new ArgumentException(
3951 $
"Unable to consolidate with the specified handler because the consolidator's output type " +
3952 $
"is {consolidator.OutputType.Name} but the handler's input type is {subscription.Type.Name}.");
3954 return consolidator;
3957 private IDataConsolidator CreateConsolidator(Func<DateTime, CalendarInfo> calendar, Type consolidatorInputType,
TickType tickType)
3961 if (typeof(
TradeBar).IsAssignableFrom(consolidatorInputType))
3968 if (typeof(
QuoteBar).IsAssignableFrom(consolidatorInputType))
3975 if (typeof(
Tick).IsAssignableFrom(consolidatorInputType))
3985 if (typeof(
DynamicData).IsAssignableFrom(consolidatorInputType))
3997 private static IDataConsolidator CreateIdentityConsolidator(Type consolidatorInputType)
3999 if (typeof(
TradeBar).IsAssignableFrom(consolidatorInputType))
4003 else if (typeof(
QuoteBar).IsAssignableFrom(consolidatorInputType))
4007 else if (typeof(
Tick).IsAssignableFrom(consolidatorInputType))
4011 else if (typeof(
DynamicData).IsAssignableFrom(consolidatorInputType))
4022 Func<IBaseData, decimal> selector =
null, params Symbol[] symbols)
4024 var dataType = GetDataTypeFromSelector(selector);
4025 foreach (var symbol
in symbols)
4027 RegisterIndicator(symbol, indicator, ResolveConsolidator(symbol, resolution, dataType), selector);
4030 if (Settings.AutomaticIndicatorWarmUp)
4032 WarmUpIndicator(symbols, indicator, resolution, selector);
4037 Func<IBaseData, T> selector =
null, params Symbol[] symbols)
4040 foreach (var symbol
in symbols)
4042 RegisterIndicator(symbol, indicator, resolution, selector);
4045 if (Settings.AutomaticIndicatorWarmUp)
4047 WarmUpIndicator(symbols, indicator, resolution, selector);
4053 RegisterIndicator(symbol, indicator, ResolveConsolidator(symbol, resolution, typeof(
QuoteBar)));
4054 RegisterIndicator(symbol.Underlying, indicator, ResolveConsolidator(symbol.Underlying, resolution));
4055 var symbols =
new List<Symbol> { symbol, symbol.Underlying };
4056 if (mirrorOption !=
null)
4058 RegisterIndicator(mirrorOption, indicator, ResolveConsolidator(mirrorOption, resolution, typeof(
QuoteBar)));
4059 symbols.Add(mirrorOption);
4062 if (Settings.AutomaticIndicatorWarmUp)
4064 WarmUpIndicator(symbols, indicator, resolution);
4072 var name = CreateIndicatorName(symbol,
4073 $
"{typeof(T).Name}({riskFreeRate},{dividendYield},{OptionIndicatorBase.GetOptionModel(optionModel, symbol.ID.OptionStyle)})",
4076 riskFreeRateModel = riskFreeRate.HasValue
4081 if (dividendYield.HasValue)
4096 indicatorBase?.Consolidators.Add(consolidator);
4102 private DateTime GetIndicatorAdjustedHistoryStart(
IndicatorBase indicator, IEnumerable<Symbol> symbols, DateTime start, DateTime end,
Resolution? resolution =
null)
4105 if (warmupPeriod != 0)
4108 if (warmupPeriod > 0)
4110 foreach (var request
in CreateDateRangeHistoryRequests(symbols, start, end, resolution))
4112 var adjustedStart = _historyRequestFactory.GetStartTimeAlgoTz(request.StartTimeUtc, request.Symbol, warmupPeriod, request.Resolution,
4113 request.ExchangeHours, request.DataTimeZone, request.DataType, request.IncludeExtendedMarketHours);
4114 if (adjustedStart < start)
4116 start = adjustedStart;
4132 return dataNormalizationMode;
4141 var indicatorType = indicator.GetType();
4143 var indicatorsDataPointPerProperty = indicatorType.GetProperties()
4144 .Where(x => x.PropertyType.IsGenericType && x.Name !=
"Consolidators" && x.Name !=
"Window")
4149 var indicatorsDataPointsByTime =
new List<IndicatorDataPoints>();
4150 var lastConsumedTime = DateTime.MinValue;
4154 if (newInputPoint ==
null || lastConsumedTime == newInputPoint.
EndTime)
4158 lastConsumedTime = newInputPoint.
EndTime;
4162 for (var i = 0; i < indicatorsDataPointPerProperty.Count; i++)
4164 var newPoint = indicatorsDataPointPerProperty[i].UpdateValue();
4171 if (!indicator.IsReady)
4176 if (lastPoint ==
null || lastPoint.
Time != newInputPoint.
Time)
4181 consumeLastPoint(newInputPoint);
4183 lastPoint = newInputPoint;
4187 indicator.Updated += callback;
4191 history.PushThrough(bar => updateIndicator(bar), dataType);
4196 foreach (var dataDictionary
in history.Get<T>())
4198 foreach (var dataPoint
in dataDictionary.Values)
4200 updateIndicator(dataPoint);
4205 consumeLastPoint(lastPoint);
4206 indicator.Updated -= callback;
4208 return new IndicatorHistory(indicatorsDataPointsByTime, indicatorsDataPointPerProperty,
4210 () => PandasConverter.GetIndicatorDataFrame(indicatorsDataPointPerProperty.Select(x =>
new KeyValuePair<
string, List<IndicatorDataPoint>>(x.Name, x.Values))),
4211 isThreadSafe:
false));
4214 private Type GetDataTypeFromSelector(Func<IBaseData, decimal> selector)
4216 Type dataType =
null;
4217 if (_quoteRequiredFields.Any(x => ReferenceEquals(selector, x)))
4221 else if (ReferenceEquals(selector, Field.Volume))