Skip to content

Commit 0622f43

Browse files
authored
Fix issues with the IchimokuKinkoHyo indicator (#9135)
* Fix issues with IchimokuKinkoHyo indicator * Use indicator extension methods for automatic updates
1 parent 8f0224f commit 0622f43

File tree

2 files changed

+32
-57
lines changed

2 files changed

+32
-57
lines changed

Indicators/IchimokuKinkoHyo.cs

Lines changed: 9 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -147,51 +147,18 @@ public IchimokuKinkoHyo(string name, int tenkanPeriod = 9, int kijunPeriod = 26,
147147
KijunMinimum = new Minimum(name + "_KijunMin", kijunPeriod);
148148
SenkouBMaximum = new Maximum(name + "_SenkouBMaximum", senkouBPeriod);
149149
SenkouBMinimum = new Minimum(name + "_SenkouBMinimum", senkouBPeriod);
150-
DelayedTenkanSenkouA = new Delay(name + "DelayedTenkan", senkouADelayPeriod);
151-
DelayedKijunSenkouA = new Delay(name + "DelayedKijun", senkouADelayPeriod);
152-
DelayedMaximumSenkouB = new Delay(name + "DelayedMax", senkouBDelayPeriod);
153-
DelayedMinimumSenkouB = new Delay(name + "DelayedMin", senkouBDelayPeriod);
154-
Chikou = new Delay(name + "_Chikou", senkouADelayPeriod);
155-
156-
SenkouA = new FunctionalIndicator<IndicatorDataPoint>(
157-
name + "_SenkouA",
158-
input => SenkouA.IsReady ? (DelayedTenkanSenkouA.Current.Value + DelayedKijunSenkouA.Current.Value) / 2 : decimal.Zero,
159-
senkouA => DelayedTenkanSenkouA.IsReady && DelayedKijunSenkouA.IsReady,
160-
() =>
161-
{
162-
Tenkan.Reset();
163-
Kijun.Reset();
164-
});
150+
DelayedMaximumSenkouB = new Delay(name + "DelayedMax", senkouBDelayPeriod).Of(SenkouBMaximum);
151+
DelayedMinimumSenkouB = new Delay(name + "DelayedMin", senkouBDelayPeriod).Of(SenkouBMinimum);
165152

166-
SenkouB = new FunctionalIndicator<IndicatorDataPoint>(
167-
name + "_SenkouB",
168-
input => SenkouB.IsReady ? (DelayedMaximumSenkouB.Current.Value + DelayedMinimumSenkouB.Current.Value) / 2 : decimal.Zero,
169-
senkouA => DelayedMaximumSenkouB.IsReady && DelayedMinimumSenkouB.IsReady,
170-
() =>
171-
{
172-
Tenkan.Reset();
173-
Kijun.Reset();
174-
});
153+
Tenkan = TenkanMaximum.Plus(TenkanMinimum).Over(2m);
154+
DelayedTenkanSenkouA = new Delay(name + "DelayedTenkan", senkouADelayPeriod).Of(Tenkan);
175155

176-
Tenkan = new FunctionalIndicator<IndicatorDataPoint>(
177-
name + "_Tenkan",
178-
input => Tenkan.IsReady ? (TenkanMaximum.Current.Value + TenkanMinimum.Current.Value) / 2 : decimal.Zero,
179-
tenkan => TenkanMaximum.IsReady && TenkanMinimum.IsReady,
180-
() =>
181-
{
182-
TenkanMaximum.Reset();
183-
TenkanMinimum.Reset();
184-
});
156+
Kijun = KijunMaximum.Plus(KijunMinimum).Over(2m);
157+
DelayedKijunSenkouA = new Delay(name + "DelayedKijun", senkouADelayPeriod).Of(Kijun);
185158

186-
Kijun = new FunctionalIndicator<IndicatorDataPoint>(
187-
name + "_Kijun",
188-
input => Kijun.IsReady ? (KijunMaximum.Current.Value + KijunMinimum.Current.Value) / 2 : decimal.Zero,
189-
kijun => KijunMaximum.IsReady && KijunMinimum.IsReady,
190-
() =>
191-
{
192-
KijunMaximum.Reset();
193-
KijunMinimum.Reset();
194-
});
159+
SenkouA = DelayedTenkanSenkouA.Plus(DelayedKijunSenkouA).Over(2m);
160+
SenkouB = DelayedMaximumSenkouB.Plus(DelayedMinimumSenkouB).Over(2m);
161+
Chikou = new Delay(name + "_Chikou", senkouADelayPeriod);
195162
}
196163

197164
/// <summary>
@@ -212,22 +179,10 @@ protected override decimal ComputeNextValue(IBaseDataBar input)
212179
{
213180
TenkanMaximum.Update(input.EndTime, input.High);
214181
TenkanMinimum.Update(input.EndTime, input.Low);
215-
Tenkan.Update(input.EndTime, input.Close);
216-
if (Tenkan.IsReady) DelayedTenkanSenkouA.Update(input.EndTime, Tenkan.Current.Value);
217-
218182
KijunMaximum.Update(input.EndTime, input.High);
219183
KijunMinimum.Update(input.EndTime, input.Low);
220-
Kijun.Update(input.EndTime, input.Close);
221-
if (Kijun.IsReady) DelayedKijunSenkouA.Update(input.EndTime, Kijun.Current.Value);
222-
223-
SenkouA.Update(input.EndTime, input.Close);
224-
225-
SenkouB.Update(input.EndTime, input.Close);
226184
SenkouBMaximum.Update(input.EndTime, input.High);
227-
if (SenkouBMaximum.IsReady) DelayedMaximumSenkouB.Update(input.EndTime, SenkouBMaximum.Current.Value);
228185
SenkouBMinimum.Update(input.EndTime, input.Low);
229-
if (SenkouBMinimum.IsReady) DelayedMinimumSenkouB.Update(input.EndTime, SenkouBMinimum.Current.Value);
230-
231186
Chikou.Update(input.EndTime, input.Close);
232187

233188
return input.Close;

Tests/Indicators/IchimokuKinkoHyoTests.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*
1+
/*
22
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
33
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
44
*
@@ -36,7 +36,7 @@ protected override IndicatorBase<IBaseDataBar> CreateIndicator()
3636

3737
protected override Action<IndicatorBase<IBaseDataBar>, double> Assertion =>
3838
(indicator, expected) =>
39-
Assert.AreEqual(expected, (double) ((IchimokuKinkoHyo) indicator).Tenkan.Current.Value, 1e-3);
39+
Assert.AreEqual(expected, (double)((IchimokuKinkoHyo)indicator).Tenkan.Current.Value, 1e-3);
4040

4141
[Test]
4242
public void ComparesWithExternalDataTenkanMaximum()
@@ -166,5 +166,25 @@ public void ComparesWithExternalDataDelayedMinimumSenkouB()
166166
(ind, expected) => Assert.AreEqual(expected, (double)((IchimokuKinkoHyo)ind).DelayedMinimumSenkouB.Current.Value)
167167
);
168168
}
169+
170+
[Test]
171+
public void ComponentsAreNonZeroWhenIndicatorIsReady()
172+
{
173+
var indicator = new IchimokuKinkoHyo(2, 3, 2, 4, 2, 2);
174+
var date = new DateTime(2017, 1, 1);
175+
176+
for (int i = 1; i <= indicator.WarmUpPeriod; i++)
177+
{
178+
var tradeBar = new TradeBar(date + TimeSpan.FromDays(i), Symbols.SPY,
179+
100 * i, 200 * i, 100 * i, 200 * i, 500 * i);
180+
indicator.Update(tradeBar);
181+
}
182+
183+
Assert.IsTrue(indicator.IsReady);
184+
Assert.AreNotEqual(0m, indicator.Tenkan.Current.Value);
185+
Assert.AreNotEqual(0m, indicator.Kijun.Current.Value);
186+
Assert.AreNotEqual(0m, indicator.SenkouA.Current.Value);
187+
Assert.AreNotEqual(0m, indicator.SenkouB.Current.Value);
188+
}
169189
}
170-
}
190+
}

0 commit comments

Comments
 (0)