public void MultiChain() { var identity = new Identity("identity"); var sma = new SimpleMovingAverage(2); var delay = new Delay(2); // create the SMA of the delay of the identity sma.Of(delay.Of(identity)); identity.Update(DateTime.UtcNow, 1m); Assert.IsTrue(identity.IsReady); Assert.IsFalse(delay.IsReady); Assert.IsFalse(sma.IsReady); identity.Update(DateTime.UtcNow, 2m); Assert.IsTrue(identity.IsReady); Assert.IsFalse(delay.IsReady); Assert.IsFalse(sma.IsReady); identity.Update(DateTime.UtcNow, 3m); Assert.IsTrue(identity.IsReady); Assert.IsTrue(delay.IsReady); Assert.IsFalse(sma.IsReady); identity.Update(DateTime.UtcNow, 4m); Assert.IsTrue(identity.IsReady); Assert.IsTrue(delay.IsReady); Assert.IsTrue(sma.IsReady); Assert.AreEqual(1.5m, sma); }
public override void Initialize() { SetStartDate(2013, 10, 7); SetEndDate(2013, 10, 9); SetCash(250000); AddSecurity(SecurityType.Equity, symbol, Resolution.Minute); PSARList.Add(new ParabolicStopAndReverse()); PSARList.Add(new ParabolicStopAndReverse(afStart: 0.1m, afIncrement: 0.1m, afMax: 0.2m)); PSARList.Add(new ParabolicStopAndReverse(afStart: 0.001m, afIncrement: 0.001m, afMax: 0.1m)); RegisterIndicator(symbol, PSARList[0], Resolution.Minute); RegisterIndicator(symbol, PSARList[1], Resolution.Minute); RegisterIndicator(symbol, PSARList[2], Resolution.Minute); testerAcum = 0m; counter = 0; Identity close = new Indicators.Identity("SPY"); RegisterIndicator(symbol, close, Resolution.Minute, Field.Close); var chart = new Chart("SPY"); chart.AddSeries(new Series(close.Name)); chart.AddSeries(new Series(PSARList[0].Name, SeriesType.Scatter)); chart.AddSeries(new Series(PSARList[1].Name, SeriesType.Scatter)); chart.AddSeries(new Series(PSARList[2].Name, SeriesType.Scatter)); PlotIndicator("SPY", close); PlotIndicator("SPY", true, PSARList[0], PSARList[1], PSARList[2]); }
public override void Initialize() { SetStartDate(2013, 10, 7); SetEndDate(2013, 10, 9); SetCash(250000); AddSecurity(SecurityType.Equity, symbol, Resolution.Minute); PSARList.Add(new ParabolicStopAndReverse()); PSARList.Add(new ParabolicStopAndReverse(afStart: 0.1m, afIncrement: 0.1m, afMax: 0.2m)); PSARList.Add(new ParabolicStopAndReverse(afStart: 0.001m, afIncrement: 0.001m, afMax: 0.1m)); RegisterIndicator(symbol, PSARList[0], Resolution.Minute); RegisterIndicator(symbol, PSARList[1], Resolution.Minute); RegisterIndicator(symbol, PSARList[2], Resolution.Minute); testerAcum = 0m; counter = 0; Identity close = new Indicators.Identity("SPY"); RegisterIndicator(symbol, close, Resolution.Minute, Field.Close); var chart = new Chart("SPY"); chart.AddSeries(new Series(close.Name)); chart.AddSeries(new Series(PSARList[0].Name, SeriesType.Scatter)); chart.AddSeries(new Series(PSARList[1].Name, SeriesType.Scatter)); chart.AddSeries(new Series(PSARList[2].Name, SeriesType.Scatter)); PlotIndicator("SPY", close); PlotIndicator("SPY", true, PSARList[0], PSARList[1], PSARList[2]); }
/// <summary> /// Initializes a new instance of the <see cref="HeikinAshi"/> class using the specified name. /// </summary> /// <param name="name">The name of this indicator</param> public HeikinAshi(string name) : base(name) { Open = new Identity(name + "_Open"); High = new Identity(name + "_High"); Low = new Identity(name + "_Low"); Close = new Identity(name + "_Close"); }
/// <summary> /// Initializes a new instance of the VWAP class with a given name and period /// </summary> /// <param name="name">string - the name of the indicator</param> /// <param name="period">The period of the VWAP</param> public VolumeWeightedAveragePriceIndicator(string name, int period) : base(name) { _price = new Identity("Price"); _volume = new Identity("Volume"); // This class will be using WeightedBy indicator extension _vwap = _price.WeightedBy(_volume, period); }
public void TestIdentityInvariants() { // the invariants of the identity indicator is to be ready after // a single sample has been added, and always produce the same value // as the last ingested value var identity = new Identity("test"); Assert.IsFalse(identity.IsReady); const decimal value = 1m; identity.Update(new IndicatorDataPoint(DateTime.UtcNow, value)); Assert.IsTrue(identity.IsReady); Assert.AreEqual(value, identity.Current.Value); }
public void CallsDelegateCorrectly() { var left = new Identity("left"); var right = new Identity("right"); var composite = new CompositeIndicator<IndicatorDataPoint>(left, right, (l, r) => { Assert.AreEqual(left, l); Assert.AreEqual(right, r); return l + r; }); composite.Update(DateTime.Today, 1m); Assert.AreEqual(2m, composite.Current.Value); }
public void NewDataPushesToDerivedIndicators() { var identity = new Identity("identity"); var sma = new SimpleMovingAverage(3); identity.Updated += (sender, consolidated) => { sma.Update(consolidated); }; identity.Update(DateTime.UtcNow, 1m); identity.Update(DateTime.UtcNow, 2m); Assert.IsFalse(sma.IsReady); identity.Update(DateTime.UtcNow, 3m); Assert.IsTrue(sma.IsReady); Assert.AreEqual(2m, sma); }
public void ResetsProperly() { var identity = new Identity("test"); Assert.IsFalse(identity.IsReady); Assert.AreEqual(0m, identity.Current.Value); foreach (var data in TestHelper.GetDataStream(2)) { identity.Update(data); } Assert.IsTrue(identity.IsReady); Assert.AreEqual(2, identity.Samples); identity.Reset(); Assert.IsFalse(identity.IsReady); Assert.AreEqual(0, identity.Samples); }
public void GoLongAndClosePosition() { int _trendPeriod = 5; int _invFisherPeriod = 6; decimal _tolerance = 0.001m; decimal _threshold = 0.9m; DateTime time = DateTime.Now; # region Arrays inputs decimal[] prices = new decimal[15] { 24.51m, 24.51m, 20.88m, 15m, 9.12m, 5.49m, 5.49m, 9.12m, 15m, 20.88m, 24.51m, 24.51m, 20.88m, 15m, 9.12m, }; OrderSignal[] expectedOrders = new OrderSignal[15] { OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goLong , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.closeLong, OrderSignal.doNothing }; # endregion OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length]; Identity VoidIndicator = new Identity("Void"); DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance); for (int i = 0; i < prices.Length; i++) { strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i])); // Update the InverseFisher indicator from here, if not it took 11 bars until the first signal. strategy.InverseFisher.Update(strategy.DecycleTrend.Current); actualOrders[i] = strategy.ActualSignal; if (actualOrders[i] == OrderSignal.goLong) strategy.Position = StockState.longPosition; Console.WriteLine(i + "| Actual Order:" + actualOrders[i]); time.AddDays(1); } Assert.AreEqual(expectedOrders, actualOrders); }
public void PipesDataFirstWeightedBySecond() { const int period = 4; var value = new Identity("Value"); var weight = new Identity("Weight"); var third = value.WeightedBy(weight, period); var data = Enumerable.Range(1, 10).ToList(); var window = Enumerable.Reverse(data).Take(period); var current = window.Sum(x => 2 * x * x) / (decimal)window.Sum(x => x); foreach (var item in data) { value.Update(new IndicatorDataPoint(DateTime.UtcNow, Convert.ToDecimal(2 * item))); weight.Update(new IndicatorDataPoint(DateTime.UtcNow, Convert.ToDecimal(item))); } Assert.AreEqual(current, third.Current.Value); }
public override void Initialize() { SetStartDate(2013, 10, 7); SetEndDate(2013, 10, 11); SetCash(250000); foreach (var symbol in Symbols) { AddSecurity(SecurityType.Equity, symbol, Resolution.Second); // Define an Identity Indicator with the close price. Identity priceIdentityIndicator = new Identity(symbol + "PriceIdentityIndicator"); RegisterIndicator(symbol, priceIdentityIndicator, Resolution.Second, Field.Close); // Define an EMA. ExponentialMovingAverage EMA = new ExponentialMovingAverage("EMA_" + symbol, 100); RegisterIndicator(symbol, EMA, Resolution.Minute, Field.Close); // Inject the Price Identity indicator and the EMA in the Strategy object. StrategyDict.Add(symbol, new NoStrategy(symbol, priceIdentityIndicator, EMA)); stockLogging.Add(symbol, new StringBuilder()); } }
public void GoShortAndClosePosition() { int _period = 7; decimal _tolerance = 0.00001m; decimal _revertPct = 1.015m; DateTime time = DateTime.Now; # region Arrays inputs decimal[] prices = new decimal[20] { 91m, 91m, 91m, 91m, 91m, 91m, 92m, 93m, 94m, 95m, 96m, 97m, 98m, 99m, 100m, 85m, 84m, 83m, 100m, 100m, }; OrderSignal[] expectedOrders = new OrderSignal[20] { OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShortLimit , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.closeShort }; # endregion OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length]; Identity priceIdentity = new Identity("IdentityIndicator"); ITrendStrategy strategy = new ITrendStrategy(priceIdentity, _period, _tolerance, _revertPct, RevertPositionCheck.vsClosePrice); for (int i = 0; i < prices.Length; i++) { priceIdentity.Update(new IndicatorDataPoint(time, prices[i])); actualOrders[i] = strategy.ActualSignal; if (actualOrders[i] == OrderSignal.goShortLimit) strategy.Position = StockState.shortPosition; Console.WriteLine(i + "| Actual Order:" + actualOrders[i]); time.AddDays(1); } Assert.AreEqual(expectedOrders, actualOrders); }
public void ResetsProperly() { DateTime time = DateTime.Parse("2000-01-01"); # region Arrays inputs decimal[] prices = new decimal[10] { 100m, 100m, 100m, 100m, 100m, 100m, 100m, 100m, 100m, 100m }; #endregion Identity priceIdentity = new Identity("IdentityIndicator"); ITrendStrategy strategy = new ITrendStrategy(priceIdentity, 5); for (int i = 0; i < prices.Length; i++) { priceIdentity.Update(new IndicatorDataPoint(time, prices[i])); time.AddDays(1); } Assert.IsTrue(strategy.ITrend.IsReady, "Instantaneous Trend Ready"); Assert.IsTrue(strategy.ITrendMomentum.IsReady, "Instantaneous Trend Momentum Ready"); Assert.IsTrue(strategy.MomentumWindow.IsReady, "Instantaneous Trend Momentum Window Ready"); strategy.Reset(); TestHelper.AssertIndicatorIsInDefaultState(strategy.ITrend); TestHelper.AssertIndicatorIsInDefaultState(strategy.ITrendMomentum); Assert.IsFalse(strategy.MomentumWindow.IsReady, "Instantaneous Trend Momentum Windows was Reset"); }
public void TestingTolerance() { int _period = 7; decimal _tolerance = 0.15m; decimal _revertPct = 1.015m; DateTime time = DateTime.Now; # region Arrays inputs decimal[] prices = new decimal[20] { 99m, 99m, 99m, 99m, 99m, 99m, 99.25m, 99.5m, 99.75m, 100m, 100.25m, 100.5m, 100.75m, 100m, 100m, 100.1m, 100.2m, 100.3m, 100.4m, 100.5m, }; OrderSignal[] expectedOrders = new OrderSignal[20] { OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShortLimit, OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing }; # endregion OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length]; Identity priceIdentity = new Identity("IdentityIndicator"); ITrendStrategy strategy = new ITrendStrategy(priceIdentity, _period, _tolerance, _revertPct, RevertPositionCheck.vsClosePrice); for (int i = 0; i < prices.Length; i++) { priceIdentity.Update(new IndicatorDataPoint(time, prices[i])); actualOrders[i] = strategy.ActualSignal; Console.WriteLine(i + "| Actual Order:" + actualOrders[i]); time.AddDays(1); } Assert.AreEqual(expectedOrders, actualOrders); }
public SymbolData(Symbol symbol, QCAlgorithm algorithm) { Symbol = symbol; Security = algorithm.Securities[symbol]; Close = algorithm.Identity(symbol); ADX = algorithm.ADX(symbol, 14); EMA = algorithm.EMA(symbol, 14); MACD = algorithm.MACD(symbol, 12, 26, 9); // if we're receiving daily _algorithm = algorithm; }
public void MultiChainEMA() { var identity = new Identity("identity"); var delay = new Delay(2); // create the EMA of chained methods var ema = delay.Of(identity).EMA(2, 1); // Assert.IsTrue(ema. == 1); identity.Update(DateTime.UtcNow, 1m); Assert.IsTrue(identity.IsReady); Assert.IsFalse(delay.IsReady); Assert.IsFalse(ema.IsReady); identity.Update(DateTime.UtcNow, 2m); Assert.IsTrue(identity.IsReady); Assert.IsFalse(delay.IsReady); Assert.IsFalse(ema.IsReady); identity.Update(DateTime.UtcNow, 3m); Assert.IsTrue(identity.IsReady); Assert.IsTrue(delay.IsReady); Assert.IsFalse(ema.IsReady); identity.Update(DateTime.UtcNow, 4m); Assert.IsTrue(identity.IsReady); Assert.IsTrue(delay.IsReady); Assert.IsTrue(ema.IsReady); }
public void ResetsProperly() { DateTime time = DateTime.Parse("2000-01-01"); # region Arrays inputs decimal[] prices = new decimal[10] { 100m, 110m, 120m, 130m, 140m, 150m, 160m, 170m, 180m, 190m }; #endregion Identity VoidIndicator = new Identity("Void"); DIFStrategy strategy = new DIFStrategy(VoidIndicator, 5, 5); for (int i = 0; i < prices.Length; i++) { strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i])); strategy.InverseFisher.Update(strategy.DecycleTrend.Current); time.AddDays(1); } Assert.IsTrue(strategy.DecycleTrend.IsReady, "Decycle Trend Ready"); Assert.IsTrue(strategy.InverseFisher.IsReady, "Decycle Inverse Fisher Ready"); Assert.IsTrue(strategy.InvFisherRW.IsReady, "Inverse Fisher Window Ready"); strategy.Reset(); TestHelper.AssertIndicatorIsInDefaultState(strategy.DecycleTrend); TestHelper.AssertIndicatorIsInDefaultState(strategy.InverseFisher); Assert.IsFalse(strategy.InvFisherRW.IsReady, "Inverse Fisher Window was Reset"); }
public void ToleranceTesting() { // This is the same GoLongAndClosePosition Test, only the tolerance is increased to avoid signals. int _trendPeriod = 5; int _invFisherPeriod = 6; decimal _tolerance = 2m; decimal _threshold = 0.9m; DateTime time = DateTime.Now; # region Arrays inputs decimal[] prices = new decimal[15] { 24.51m, 24.51m, 20.88m, 15m, 9.12m, 5.49m, 5.49m, 9.12m, 15m, 20.88m, 24.51m, 24.51m, 20.88m, 15m, 9.12m, }; OrderSignal[] expectedOrders = new OrderSignal[15] { OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing }; # endregion OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length]; Identity VoidIndicator = new Identity("Void"); DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance); for (int i = 0; i < prices.Length; i++) { strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i])); strategy.InverseFisher.Update(strategy.DecycleTrend.Current); actualOrders[i] = strategy.ActualSignal; if (actualOrders[i] == OrderSignal.goLong) strategy.Position = StockState.longPosition; Console.WriteLine(i + "| Actual Order:" + actualOrders[i]); time.AddDays(1); } Assert.AreEqual(expectedOrders, actualOrders); }
public void MinusSubtractsLeftAndRightAfterBothUpdated() { var left = new Identity("left"); var right = new Identity("right"); var composite = left.Minus(right); left.Update(DateTime.Today, 1m); right.Update(DateTime.Today, 1m); Assert.AreEqual(0m, composite.Current.Value); left.Update(DateTime.Today, 2m); Assert.AreEqual(0m, composite.Current.Value); left.Update(DateTime.Today, 3m); Assert.AreEqual(0m, composite.Current.Value); right.Update(DateTime.Today, 4m); Assert.AreEqual(-1m, composite.Current.Value); }
public void RealDataTest() { int _trendPeriod = 5; int _invFisherPeriod = 6; decimal _tolerance = 0.001m; decimal _threshold = 0.9m; DateTime time = DateTime.Now; # region Arrays inputs // Real AMZN minute data decimal[] prices = new decimal[30] { 427.30m, 427.24m, 427.57m, 427.71m, 427.59m, 427.95m, 427.27m, 427.19m, 427.45m, 427.81m, 427.62m, 427.66m, 427.67m, 427.62m, 427.67m, 427.20m, 426.89m, 427.27m, 427.46m, 427.31m, 427.11m, 427.29m, 427.54m, 427.87m, 427.80m, 427.35m, 427.34m, 427.75m, 427.94m, 429.00m, }; OrderSignal[] expectedOrders = new OrderSignal[30] { OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShort , OrderSignal.doNothing , OrderSignal.closeShort, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing , OrderSignal.goShort, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.closeShort, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShort , OrderSignal.closeShort, OrderSignal.doNothing , OrderSignal.doNothing }; # endregion OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length]; Identity VoidIndicator = new Identity("Void"); DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance); for (int i = 0; i < prices.Length; i++) { strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i])); strategy.InverseFisher.Update(strategy.DecycleTrend.Current); actualOrders[i] = strategy.ActualSignal; if (actualOrders[i] == OrderSignal.goShort && strategy.Position == StockState.noInvested) strategy.Position = StockState.shortPosition; if (actualOrders[i] == OrderSignal.closeShort && strategy.Position == StockState.shortPosition) strategy.Position = StockState.noInvested; if (actualOrders[i] == OrderSignal.goLong && strategy.Position == StockState.noInvested) strategy.Position = StockState.longPosition; if (actualOrders[i] == OrderSignal.closeLong && strategy.Position == StockState.longPosition) strategy.Position = StockState.noInvested; Console.WriteLine(i + "| Actual Order:" + actualOrders[i]); Console.WriteLine(strategy.DecycleTrend.Current.ToString()); Console.WriteLine(strategy.InverseFisher.Current.ToString() + "\n"); time = time.AddDays(1); } Assert.AreEqual(expectedOrders, actualOrders); }
public void MultiChainMIN() { var identity = new Identity("identity"); var delay = new Delay(2); // create the MIN of the delay of the identity var min = delay.Of(identity).MIN(2); identity.Update(DateTime.UtcNow, 1m); Assert.IsTrue(identity.IsReady); Assert.IsFalse(delay.IsReady); Assert.IsFalse(min.IsReady); identity.Update(DateTime.UtcNow, 2m); Assert.IsTrue(identity.IsReady); Assert.IsFalse(delay.IsReady); Assert.IsFalse(min.IsReady); identity.Update(DateTime.UtcNow, 3m); Assert.IsTrue(identity.IsReady); Assert.IsTrue(delay.IsReady); Assert.IsFalse(min.IsReady); identity.Update(DateTime.UtcNow, 4m); Assert.IsTrue(identity.IsReady); Assert.IsTrue(delay.IsReady); Assert.IsTrue(min.IsReady); }
public void OverHandlesDivideByZero() { var left = new Identity("left"); var right = new Identity("right"); var composite = left.Over(right); var updatedEventFired = false; composite.Updated += delegate { updatedEventFired = true; }; left.Update(DateTime.Today, 1m); Assert.IsFalse(updatedEventFired); right.Update(DateTime.Today, 0m); Assert.IsFalse(updatedEventFired); // submitting another update to right won't cause an update without corresponding update to left right.Update(DateTime.Today, 1m); Assert.IsFalse(updatedEventFired); left.Update(DateTime.Today, 1m); Assert.IsTrue(updatedEventFired); }
public void MSAFullTest() { #region Fields int idx = 0; int day = 0; DateTime Time = DateTime.Today; DateTime testTime = Time; double amplitude = 1; int shift = 100; int waveLength = 45; IndicatorDataPoint ssObs; Indicator smoothedSeries = new Identity("SmoothedSeries"); MSAStrategy strategy = new MSAStrategy(smoothedSeries, 2, 3, 0m); #endregion Fields #region Warming up Console.WriteLine("Warming up"); do { ssObs = new IndicatorDataPoint(testTime, SineWave(idx, amplitude * idx, waveLength, shift)); smoothedSeries.Update(ssObs); testTime = testTime.AddMinutes(1); idx++; if (idx > 59) { day++; testTime = Time.AddDays(day); idx = 0; switch (day) { case 1: amplitude = 2; shift = 150; waveLength = 15; break; case 2: amplitude = 1.5; shift = 100; waveLength = 20; break; case 3: amplitude = 3; shift = 180; waveLength = 12; break; default: break; } Console.WriteLine("New day: " + day); } } while (!strategy.IsReady); Console.WriteLine("Strategy ready!\nStarting signal test."); #endregion Warming up #region Testing signals var expectedSignals = new Dictionary<int, OrderSignal>(); expectedSignals.Add(34, OrderSignal.goLong); expectedSignals.Add(40, OrderSignal.goShort); expectedSignals.Add(46, OrderSignal.goLong); expectedSignals.Add(52, OrderSignal.goShort); expectedSignals.Add(58, OrderSignal.goLong); for (int i = 0; i < 60; i++) { ssObs = new IndicatorDataPoint(testTime, SineWave(i, amplitude * i, waveLength, shift)); smoothedSeries.Update(ssObs); Console.WriteLine(string.Format("{0}\t|\t{1}\t|\t{2}", i, ssObs.Value.SmartRounding(), strategy.ActualSignal )); if (expectedSignals.ContainsKey(i)) { Assert.AreEqual(expectedSignals[i], strategy.ActualSignal, string.Format("Bar {0} test.", i)); } else { Assert.AreEqual(OrderSignal.doNothing, strategy.ActualSignal, string.Format("Bar {0} test.", i)); } testTime = testTime.AddMinutes(1); } #endregion Testing signals }
public void RealDataTest2() { // Almost the same test, but in this case, the strategy should send a doNothing instead a repeated goShort. int _trendPeriod = 5; int _invFisherPeriod = 6; decimal _tolerance = 0.001m; decimal _threshold = 0.9m; DateTime time = DateTime.Now; # region Arrays inputs // Real AMZN minute data decimal[] prices = new decimal[30] { 428.78m, 428.79m, 428.72m, 428.67m, 428.66m, 428.62m, 428.83m, 428.89m, 428.85m, 428.78m, 428.77m, 429.29m, 429.53m, 429.33m, 429.30m, 429.04m, 429.29m, 428.90m, 428.88m, 429.07m, 429.03m, 429.35m, 429.42m, 429.75m, 430.43m, 430.33m, 430.52m, 430.41m, 430.22m, 430.25m }; OrderSignal[] expectedOrders = new OrderSignal[30] { OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShort , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.closeShort, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing , OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.doNothing, OrderSignal.goShort }; # endregion OrderSignal[] actualOrders = new OrderSignal[expectedOrders.Length]; Identity VoidIndicator = new Identity("Void"); DIFStrategy strategy = new DIFStrategy(VoidIndicator, _trendPeriod, _invFisherPeriod, _threshold, _tolerance); for (int i = 0; i < prices.Length; i++) { strategy.DecycleTrend.Update(new IndicatorDataPoint(time, prices[i])); strategy.InverseFisher.Update(strategy.DecycleTrend.Current); actualOrders[i] = strategy.ActualSignal; if (actualOrders[i] == OrderSignal.goShort && strategy.Position == StockState.noInvested) strategy.Position = StockState.shortPosition; if (actualOrders[i] == OrderSignal.closeShort && strategy.Position == StockState.shortPosition) strategy.Position = StockState.noInvested; if (actualOrders[i] == OrderSignal.goLong && strategy.Position == StockState.noInvested) strategy.Position = StockState.longPosition; if (actualOrders[i] == OrderSignal.closeLong && strategy.Position == StockState.longPosition) strategy.Position = StockState.noInvested; Console.WriteLine(i + "| Actual Order:" + actualOrders[i]); Console.WriteLine(strategy.DecycleTrend.Current.ToString()); Console.WriteLine(strategy.InverseFisher.Current.ToString() + "\n"); time = time.AddDays(1); } Assert.AreEqual(expectedOrders, actualOrders); }
public override void Initialize() { SetStartDate(_startDate); //Set Start Date SetEndDate(_endDate); //Set End Date SetCash(_portfolioAmount); //Set Strategy Cash #region Logging stuff - Initializing Operations Logging transactionLogging.AppendLine("Time,Symbol,Order"); int i = 0; // Only used for logging. #endregion Logging stuff - Initializing Portfolio Logging foreach (string symbol in Symbols) { AddSecurity(SecurityType.Equity, symbol, Resolution.Minute); // Define and register an Identity indicator with the price, this indicator will be // injected in the Strategy. Identity PriceIdentity = new Identity("Price" + symbol); RegisterIndicator(symbol, PriceIdentity, Resolution.Minute, Field.Close); // Define the Strategy Strategy.Add(symbol, new DIFStrategy(PriceIdentity, DecyclePeriod, InvFisherPeriod, Threshold, Tolerance)); // Define the PSAR for each symbol PSARDict.Add(symbol, new ParabolicStopAndReverse(afStart: 0.0001m, afIncrement: 0.0001m)); RegisterIndicator(symbol, PSARDict[symbol], Resolution.Minute); // Define the Share size for each symbol. ShareSize.Add(symbol, (maxLeverage * (1 - leverageBuffer)) / Symbols.Count()); // Fill the stop order dictionary with the symbols keys. StopLossTickets.Add(symbol, null); // Fill the start Psar trailing stop flag dictionary. EnablePsarTrailingStop.Add(symbol, false); // At 15 minutes after market open, check for a entry signal. Schedule.Event("CheckEarlyEntry") .EveryDay() .AfterMarketOpen(symbol, minutesAfterOpen: 15) .Run(() => CheckEarlyEntry(symbol)); #region Logging stuff - Initializing Stock Logging stockLogging.Add(new StringBuilder()); stockLogging[i].AppendLine("Time,Close,Decycle,InvFisher,LightSmoothPrice,Momersion,PSAR,Position"); i++; #endregion Logging stuff - Initializing Stock Logging } // Set flags correctly at market open Schedule.Event("MarketOpen") .EveryDay() .At(9, 29) //.AfterMarketOpen(Symbols[0], minutesAfterOpen: -1) .Run(() => { isMarketJustOpen = true; isMarketAboutToClose = false; Log(string.Format("========== {0} Market Open ==========", Time.DayOfWeek)); }); Schedule.Event("MarketOpenSpan") .EveryDay() .At(9, 50) //.BeforeMarketClose(Symbols[0], minuteBeforeClose: 10) .Run(() => isMarketJustOpen = false); Schedule.Event("MarketAboutToClose") .EveryDay() .At(15, 50) //.BeforeMarketClose(Symbols[0], minuteBeforeClose: 10) .Run(() => isMarketAboutToClose = true); Schedule.Event("MarketClose") .EveryDay() .At(15, 59) //.BeforeMarketClose(Symbols[0], minuteBeforeClose: 10) .Run(() => CloseDay()); }
public void TimesMultipliesLeftAndRightAfterBothUpdated() { var left = new Identity("left"); var right = new Identity("right"); var composite = left.Times(right); left.Update(DateTime.Today, 1m); right.Update(DateTime.Today, 1m); Assert.AreEqual(1m, composite.Current.Value); left.Update(DateTime.Today, 2m); Assert.AreEqual(1m, composite.Current.Value); left.Update(DateTime.Today, 3m); Assert.AreEqual(1m, composite.Current.Value); right.Update(DateTime.Today, 4m); Assert.AreEqual(12m, composite.Current.Value); }