ohlcv.jl
1 @doc "Columns for OHLCV data: timestamp, open, high, low, close, volume" 2 const OHLCV_COLUMNS = [:timestamp, :open, :high, :low, :close, :volume] 3 @doc "Count of [`OHLCV_COLUMNS`](@ref)" 4 const OHLCV_COLUMNS_COUNT = length(OHLCV_COLUMNS) 5 @doc "The timestamp column of [`OHLCV_COLUMNS`](@ref)" 6 const OHLCV_COLUMNS_TS = setdiff(OHLCV_COLUMNS, [:timestamp]) 7 @doc "Only the OHLC columns of [`OHLCV_COLUMNS`](@ref)" 8 const OHLCV_COLUMNS_NOV = setdiff(OHLCV_COLUMNS, [:timestamp, :volume]) 9 10 @doc "Similar to a StructArray (and should probably be replaced by it), used for fast conversion." 11 const OHLCVTuple = Tuple{Vector{DateTime},(Vector{Float64} for _ in 1:5)...} 12 @doc "Default `OHLCVTuple` value." 13 function ohlcvtuple() 14 (DateTime[], (Float64[] for _ in 2:(length(OHLCV_COLUMNS)))...) 15 end 16 Base.append!(a::T, b::T) where {T<:OHLCVTuple} = foreach(splat(append!), zip(a, b)) 17 Base.axes(o::OHLCVTuple) = ((Base.OneTo(size(v, 1)) for v in o)...,) 18 Base.axes(o::OHLCVTuple, i) = Base.OneTo(size(o[i], 1)) 19 Base.getindex(o::OHLCVTuple, i, j) = o[j][i] 20 Base.push!(o::OHLCVTuple, tup::Tuple) = begin 21 for i in 1:length(tup) 22 push!(o[i], tup[i]) 23 end 24 end 25 26 @doc "Construct an OHLCV dataframe backed by an `OHLCVTuple`." 27 to_ohlcv(v::OHLCVTuple) = DataFrame([v...], OHLCV_COLUMNS) 28 propagate_ohlcv!(args...; kwargs...) = error("not implemented")