{-# language OverloadedStrings #-} module Main where -- import Control.Arrow ((***), (&&&)) import Graphics.Rendering.Plot.Light -- import Graphics.Rendering.Plot.Light.PlotTypes import qualified Data.Attoparsec.Text as A import qualified Attoparsec.Time.Text as AT import qualified Data.Text as T import qualified Data.Text.IO as T (readFile, writeFile) import Data.Scientific (Scientific, toRealFloat) import Text.Blaze.Svg.Renderer.String (renderSvg) import qualified Data.Colour.Names as C import Control.Applicative ((<|>)) import Data.Time (Day, TimeOfDay) -- import Data.Parsers fname = "data/forex" xPlot = 400 yPlot = 300 fnameOut = "data/forex_plot_5.svg" fdat = FigureData xPlot yPlot 0.1 0.9 0.1 0.85 10 main = print "timeseries example unavailable for now" -- main = do -- dat <- T.readFile fname -- let pd = A.parseOnly parseFxDataset dat -- case pd of Left e -> error e -- Right d -> -- do -- let -- lps = tspToLP fhi (\_ x -> x) <$> d -- -- figure = tsAxis fdat fop fcl fhi flo 1 C.black (-45) Nothing Nothing lps -- figure = tsAxis' fdat flo fhi C.magenta lps -- svg_t = svgHeader xPlot yPlot figure -- -- putStrLn $ renderSvg svg_t -- T.writeFile fnameOut $ T.pack $ renderSvg svg_t -- where -- fhi = toFloat . rateHigh -- flo = toFloat . rateLow -- fop = toFloat . rateOpen -- fcl = toFloat . rateClose -- avgTs :: FxRow Scientific -> Float -- avgTs x = 0.5 * (h + l) where -- h = toFloat (rateHigh x) -- l = toFloat (rateLow x) -- -- Forex time series parsers - related -- -- * Forex dataset -- parseFxDataset :: A.Parser [TsPoint (FxRow Scientific)] -- parseFxDataset = A.sepBy parseFxRow A.endOfLine -- parseFxRow :: A.Parser (TsPoint (FxRow Scientific)) -- parseFxRow = do -- (d, t) <- parseDateTime -- _ <- comma -- open <- A.scientific -- _ <- comma -- hi <- A.scientific -- _ <- comma -- lo <- A.scientific -- _ <- comma -- close <- A.scientific -- pure $ Tsp (Tick d t) (FxRow open hi lo close) -- parseDateTime :: A.Parser (Day, TimeOfDay) -- parseDateTime = do -- d <- AT.dayInISO8601 -- _ <- space -- t <- AT.timeOfDayInISO8601 -- return (d, t)