/ Data / src / ohlcv.jl
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")