57 public Stochastic(
string name,
int period,
int kPeriod,
int dPeriod)
60 _maximum =
new Maximum(name +
"_Max", period);
61 _minimum =
new Minimum(name +
"_Min", period);
62 _sumFastK =
new Sum(name +
"_SumFastK", kPeriod);
63 _sumSlowK =
new Sum(name +
"_SumD", dPeriod);
66 input => ComputeFastStoch(input),
67 fastStoch => _maximum.IsReady
71 input => ComputeStochK(kPeriod, input),
72 stochK => _sumFastK.IsReady
77 input => ComputeStochD(dPeriod),
78 stochD => _sumSlowK.IsReady
93 : this($
"STO({period},{kPeriod},{dPeriod})", period, kPeriod, dPeriod)
113 _maximum.Update(input.
Time, input.
High);
114 _minimum.Update(input.
Time, input.
Low);
131 if (_maximum.IsReady)
133 var denominator = _maximum.Current.Value - _minimum.Current.Value;
136 if (denominator == 0m)
141 var numerator = input.
Close - _minimum.Current.Value;
142 fastStoch = numerator / denominator;
143 _sumFastK.Update(input.
Time, fastStoch);
145 return fastStoch * 100;
154 private decimal ComputeStochK(
int constantK,
IBaseData input)
158 if (_sumFastK.IsReady)
160 stochK = _sumFastK.Current.Value / constantK;
161 _sumSlowK.Update(input.
Time, stochK);
171 private decimal ComputeStochD(
int constantD)
175 if (_sumSlowK.IsReady)
177 stochD = _sumSlowK.Current.Value / constantD;