Hello,
I have the following code
using OnlineStatsBase
using IncTA
using IncTA: TechnicalIndicator
using IncTA.SampleData: OPEN_TMPL, HIGH_TMPL, LOW_TMPL, CLOSE_TMPL, VOLUME_TMPL, DATE_TMPL
mutable struct TechnicalIndicatorIterator{T, I}
indicator_type::T
args::Tuple
kwargs::Base.Pairs
iterable_input
input_iterator #::I # should be iterable
indicator_instance::TechnicalIndicator
function TechnicalIndicatorIterator(indicator_type, iterable_input, args...; kwargs...)
ind = indicator_type{eltype(iterable_input)}(args...; kwargs...)
input_iterator = Iterators.Stateful(iterable_input)
new{typeof(indicator_type), typeof(input_iterator)}(indicator_type, args, kwargs, iterable_input, input_iterator, ind)
end
end
function Base.iterate(itr::TechnicalIndicatorIterator, state=0)
iter_result = iterate(itr.input_iterator, state)
if iter_result !== nothing
(element, state) = iter_result
state = nobs(itr.indicator_instance)
fit!(itr.indicator_instance, element)
return (value(itr.indicator_instance), state)
end
end
# Base.eltype(::Type{TechnicalIndicatorIterator}) = Float64
# Base.IteratorEltype(::Type{TechnicalIndicatorIterator}) = Base.HasEltype()
# Base.IteratorSize(::Type{TechnicalIndicatorIterator}) = Base.IsInfinite()
Base.eltype(::Type{TechnicalIndicatorIterator}) = Union{Missing,Float64}
function Iterators.reset!(itr::TechnicalIndicatorIterator)
Iterators.reset!(itr.input_iterator)
itr.indicator_instance = itr.indicator_type{eltype(itr.iterable_input)}(itr.args...; itr.kwargs...)
end
Base.length(itr::TechnicalIndicatorIterator) = length(itr.input_iterator)
# === Usage
# SISO indicator
itr = TechnicalIndicatorIterator(SMA, CLOSE_TMPL; period = 3)
println("First iteration")
for (i, val) in enumerate(itr)
println("$(i): $(val)")
end
println("")
println("Second iteration")
Iterators.reset!(itr)
for (i, val) in enumerate(itr)
println("$(i): $(val)")
end
println("")
println("Third iteration with collect")
# itr = TechnicalIndicatorIterator(SMA, CLOSE_TMPL; period = 3)
# or
Iterators.reset!(itr)
println(collect(itr))
println("")
# SIMO indicator
itr = TechnicalIndicatorIterator(BB, CLOSE_TMPL)
println(collect(itr))
with code from GitHub - femtotrader/IncTA.jl: Julia Incremental Technical Analysis Indicators (inspired by talipp)
I get the following output
First iteration
1: missing
2: missing
3: 10.246666666666668
4: 10.250000000000002
5: 10.50666666666667
6: 10.593333333333335
7: 10.476666666666668
8: 10.376666666666669
9: 9.93666666666667
10: 9.716666666666669
11: 9.376666666666669
12: 9.076666666666668
13: 8.843333333333335
14: 8.543333333333335
15: 8.220000000000002
16: 7.823333333333336
17: 7.306666666666669
18: 7.663333333333336
19: 8.196666666666669
20: 8.920000000000002
21: 9.126666666666669
22: 9.090000000000002
23: 8.876666666666669
24: 8.593333333333335
25: 8.32666666666667
26: 8.150000000000002
27: 8.043333333333337
28: 7.976666666666669
29: 8.07666666666667
30: 7.890000000000003
31: 7.71666666666667
32: 7.746666666666671
33: 8.193333333333337
34: 8.63666666666667
35: 8.980000000000004
36: 9.290000000000004
37: 9.460000000000004
38: 9.493333333333338
39: 9.346666666666671
40: 9.220000000000004
41: 9.120000000000005
42: 9.123333333333338
43: 9.223333333333338
44: 9.053333333333338
45: 9.013333333333339
46: 9.283333333333339
47: 9.886666666666672
48: 10.346666666666671
49: 10.373333333333338
50: 10.273333333333339
Second iteration
1: missing
2: missing
3: 10.246666666666668
4: 10.250000000000002
5: 10.50666666666667
6: 10.593333333333335
7: 10.476666666666668
8: 10.376666666666669
9: 9.93666666666667
10: 9.716666666666669
11: 9.376666666666669
12: 9.076666666666668
13: 8.843333333333335
14: 8.543333333333335
15: 8.220000000000002
16: 7.823333333333336
17: 7.306666666666669
18: 7.663333333333336
19: 8.196666666666669
20: 8.920000000000002
21: 9.126666666666669
22: 9.090000000000002
23: 8.876666666666669
24: 8.593333333333335
25: 8.32666666666667
26: 8.150000000000002
27: 8.043333333333337
28: 7.976666666666669
29: 8.07666666666667
30: 7.890000000000003
31: 7.71666666666667
32: 7.746666666666671
33: 8.193333333333337
34: 8.63666666666667
35: 8.980000000000004
36: 9.290000000000004
37: 9.460000000000004
38: 9.493333333333338
39: 9.346666666666671
40: 9.220000000000004
41: 9.120000000000005
42: 9.123333333333338
43: 9.223333333333338
44: 9.053333333333338
45: 9.013333333333339
46: 9.283333333333339
47: 9.886666666666672
48: 10.346666666666671
49: 10.373333333333338
50: 10.273333333333339
Third iteration with collect
Any[missing, missing, 10.246666666666668, 10.250000000000002, 10.50666666666667, 10.593333333333335, 10.476666666666668, 10.376666666666669, 9.93666666666667, 9.716666666666669, 9.376666666666669, 9.076666666666668, 8.843333333333335, 8.543333333333335, 8.220000000000002, 7.823333333333336, 7.306666666666669, 7.663333333333336, 8.196666666666669, 8.920000000000002, 9.126666666666669, 9.090000000000002, 8.876666666666669, 8.593333333333335, 8.32666666666667, 8.150000000000002, 8.043333333333337, 7.976666666666669, 8.07666666666667, 7.890000000000003, 7.71666666666667, 7.746666666666671, 8.193333333333337, 8.63666666666667, 8.980000000000004, 9.290000000000004, 9.460000000000004, 9.493333333333338, 9.346666666666671, 9.220000000000004, 9.120000000000005, 9.123333333333338, 9.223333333333338, 9.053333333333338, 9.013333333333339, 9.283333333333339, 9.886666666666672, 10.346666666666671, 10.373333333333338, 10.273333333333339]
Any[missing, missing, missing, missing, IncTA.BBVal{Float64}(9.77717927284627, 10.36, 10.942820727153729), IncTA.BBVal{Float64}(9.755975309112376, 10.404, 11.052024690887624), IncTA.BBVal{Float64}(10.115363194397494, 10.48, 10.844636805602507), IncTA.BBVal{Float64}(10.028239094104867, 10.438, 10.847760905895134), IncTA.BBVal{Float64}(9.305738499111383, 10.216000000000001, 11.126261500888619), IncTA.BBVal{Float64}(9.019563990924905, 10.006, 10.992436009075096), IncTA.BBVal{Float64}(8.876288511561853, 9.708, 10.539711488438147), IncTA.BBVal{Float64}(8.255814301108963, 9.376, 10.496185698891036), IncTA.BBVal{Float64}(8.329206765357934, 9.086, 9.842793234642066), IncTA.BBVal{Float64}(7.995698681959224, 8.872, 9.748301318040776), IncTA.BBVal{Float64}(7.350070924215533, 8.478, 9.605929075784466), IncTA.BBVal{Float64}(7.15267288062292, 8.154, 9.15532711937708), IncTA.BBVal{Float64}(6.415783374077041, 7.81, 9.204216625922959), IncTA.BBVal{Float64}(6.484449534246127, 7.77, 9.055550465753871), IncTA.BBVal{Float64}(6.2323092461006855, 7.946, 9.659690753899314), IncTA.BBVal{Float64}(6.418348819446747, 8.23, 10.041651180553254), IncTA.BBVal{Float64}(6.723365536800752, 8.552, 10.380634463199247), IncTA.BBVal{Float64}(8.556678761649321, 9.016, 9.475321238350679), IncTA.BBVal{Float64}(8.281373071774409, 8.958, 9.634626928225591), IncTA.BBVal{Float64}(8.034539875307768, 8.79, 9.54546012469223), IncTA.BBVal{Float64}(7.838586583990741, 8.66, 9.481413416009259), IncTA.BBVal{Float64}(7.528445615268346, 8.372, 9.215554384731654), IncTA.BBVal{Float64}(7.721382251832726, 8.162, 8.602617748167276), IncTA.BBVal{Float64}(7.704500300842469, 8.120000000000001, 8.535499699157533), IncTA.BBVal{Float64}(7.729638750754545, 8.062000000000001, 8.394361249245458), IncTA.BBVal{Float64}(7.428916143346008, 7.900000000000001, 8.371083856653994), IncTA.BBVal{Float64}(7.325285122705569, 7.860000000000001, 8.394714877294433), IncTA.BBVal{Float64}(7.308138905637828, 7.884000000000001, 8.459861094362175), IncTA.BBVal{Float64}(7.0682515921510465, 8.030000000000001, 8.991748407848956), IncTA.BBVal{Float64}(6.999231016444695, 8.196000000000002, 9.392768983555307), IncTA.BBVal{Float64}(7.366648643659813, 8.538000000000002, 9.709351356340191), IncTA.BBVal{Float64}(7.938579312549727, 8.974000000000002, 10.009420687450277), IncTA.BBVal{Float64}(8.542754082581043, 9.224000000000002, 9.905245917418961), IncTA.BBVal{Float64}(8.761956836207837, 9.318000000000001, 9.874043163792166), IncTA.BBVal{Float64}(9.013839411643293, 9.400000000000002, 9.786160588356712), IncTA.BBVal{Float64}(8.902485231168765, 9.368000000000002, 9.83351476883124), IncTA.BBVal{Float64}(8.884796135288251, 9.216000000000003, 9.547203864711754), IncTA.BBVal{Float64}(8.905589329880048, 9.198000000000002, 9.490410670119957), IncTA.BBVal{Float64}(8.900949184560998, 9.206000000000001, 9.511050815439004), IncTA.BBVal{Float64}(8.421485650934436, 9.040000000000001, 9.658514349065566), IncTA.BBVal{Float64}(8.440710176933186, 9.074000000000002, 9.707289823066818), IncTA.BBVal{Float64}(8.249819749758137, 9.304000000000002, 10.358180250241867), IncTA.BBVal{Float64}(8.173679797027926, 9.498000000000003, 10.82232020297208), IncTA.BBVal{Float64}(8.186646740804633, 9.748000000000003, 11.309353259195372), IncTA.BBVal{Float64}(9.16153972797128, 10.096000000000004, 11.030460272028728), IncTA.BBVal{Float64}(9.863185465981628, 10.254000000000003, 10.644814534018378)]
I don’t understand why collect
returns vector of Any.
Is there a solution to avoid it?
I have written a function which return “expected type” (if that’s not missing) IncTA.jl/src/IncTA.jl at 694495dc2546de5b1858bac6bf7aa1a216c9bd15 · femtotrader/IncTA.jl · GitHub
Unfortunately I have not idea why I’m still getting vector of Any.
Some help will be very nice!