Getting Stock Prices with F#: Results

Here is the final program:

------------------------------------------------------------------------------

#light

open System
open System.Collections.Generic
open System.IO
open System.Data.SqlClient
open System.Text.RegularExpressions
open System.Net

[<Measure>] type dollars
[<Measure>] type volume

let money (f:float) = f * 1.<dollars>
let vol (f:float) = f * 1.<volume>

let toFloat (someBucks : float<dollars>) =
     someBucks / 1.0<dollars>
       
type Span = { Start: DateTime; End: DateTime }
type Price = { Open: float<dollars>; High: float<dollars>; Low:float<dollars>; Close:float<dollars>; Volume: float<volume>}
type Event =
    | StkPrice of Price
    | Split of float
    | Dividend of float<dollars>
type Observation = { Date: DateTime; Event: Event}

let span sy sm sd ey em ed = {Start = new DateTime(sy, sm, sd); End = new DateTime(ey, em, ed)}

let commonUrl ticker span =
    @"http://ichart.finance.yahoo.com/table.csv?s=" + ticker + "&a="   
    + (span.Start.Month - 1).ToString()
    + "&b=" + span.Start.Day.ToString()
    + "&c=" + span.Start.Year.ToString()
    + "&d=" + (span.End.Month - 1).ToString()
    + "&e=" + span.End.Day.ToString()
    + "&f=" + span.End.Year.ToString()

let priceUrl ticker span = commonUrl ticker span + "&g=d&ignore=.csv"

let parsePrice (line: string) =
    let tokens = line.Split([|','|])
    { Date = DateTime.Parse(tokens.[0]);
      Event = StkPrice ({Open = money (Double.Parse(tokens.[1]));
      High = money (Double.Parse(tokens.[2]));
      Low = money (Double.Parse(tokens.[3]));
      Close = money (Double.Parse(tokens.[4]));     
      Volume = vol (Double.Parse(tokens.[5]))})}       

let rec loadFromLineReader (reader:StringReader) listOfThings parseLineFunc =
    match  reader.ReadLine() with
    | null  -> listOfThings
    | line  -> loadFromLineReader reader (parseLineFunc line::listOfThings) parseLineFunc

let loadFromLineString text listOfThings parseLineFunc =
    let reader = new StringReader(text)
    reader.ReadLine ()|> ignore // skip header
    loadFromLineReader reader listOfThings parseLineFunc

let loadWebStringAsync url =
    async {
        let req = WebRequest.Create(url: string)
        use! response = req.AsyncGetResponse()
        use reader = new StreamReader(response.GetResponseStream())
        return! reader.AsyncReadToEnd()}   

let loadFromUrlAsync url parseFunc =
    async {
        let! text = loadWebStringAsync url
        return loadFromLineString text [] parseFunc }       

let loadPricesAsync aURL = loadFromUrlAsync aURL

let aSpan = span 2009 5 1 2009 5 15
//Ticker for AT&T is T
let ticker = "T"

let aURL = priceUrl ticker aSpan

let results = Async.Run(loadPricesAsync aURL parsePrice)

for aObs in results do
    let aPrice aObs =
        match aObs.Event with
        | StkPrice(p) -> toFloat(p.Close)
        | Dividend(d) -> toFloat(d)
        | _ -> -999.0
    printfn "Here's AT&T: %s %10.5f" (aObs.Date.ToShortDateString()) (aPrice(aObs))
    ()

let userresp = Console.ReadLine()

------------------------------------------------------------------------------

When I run it, here is what I get.

Print | posted @ Saturday, June 27, 2009 9:10 AM

Comments on this entry:

Gravatar # re: Getting Stock Prices with F#: Results
by air max pas cher at 2/2/2012 11:28 PM

Ultraposite Air peut faire le plus porteur a éclaté sur le potentiel de la Cour. Les joueurs ont la signature des chaussures pas beaucoup de chaussures nike air max, nike 2011 air max tn requin et ont le starthat utilisez séries Foamposite emprunté. Après tout, il a un passé glorieux. chaussures de course, Adidas a longtemps été en vigueur dans la stratégie de marché est de produire une variété de chaussures, nike tn 2011 pas cher homme mais les chaussures trop de détails d'autres sont plus lourds et peu vides d'air moins efficace coolingvividly résumer nike air max système d'amortissement, flexibles fonction élastique. Les Nike Air Max au premier son du monde de "Boing" aux Jeux Olympiques de Sydney en 2000. nike tn 2011 pas cher air max (Ex.: Air Max, Nike Air Max BW) et Air Zoom Huarache 2K5 aussi moyen ingénieux de l'extérieur de l'ombrage, l'intérieur du talon et l'avant en utilisant le motif à chevrons communs, la performance tiède. le langage utilisé pour décrire la force. En 1982, l'histoire du basketball pour atteindre le moment de pointe, nike air max tn hommes blanc tandis que les exigences du sport de basket-ball a atteint un nouveau niveau, si l'innovation nécessaire pour le basket, les effets visuels survenant après la collision avec le respect d'améliorer le produit. Cette chaussure est pour la protection et la décoration, nike 2011 air max tn c'est une chaussure de sport très efficace con?u pour chaussures de sport. C'est un équipement de sport, chaussures mode, a également rencontré un véritable sport tendances. Utilisées, chaussures de sport, de la qualité de l'obligation d'accomplir un confort à toute épreuve, la beauté et protéger leur r?le. l'année financière de Nike, nike tn 2011 pas cher les recettes totales diminueront de 6%, est tombé à 3,7 milliards de dollars. Le plus grand marché de vente de chaussures de basket, une forte baisse, Nike est le plus important, il ya un marché potentiel est l'Europe et le Japon, mais les deux pays n'est pas la fa?on dont le boom économique. Les détaillants déteste ce système, air max tn homme occasion car au moment où ils apparaissent sur le marché est estimé erreurs, ils seront piégés par ces chaussures. Mais le marché de Nike pour attirer leur de tenter sa chance. Bien que concurrents Nike font la même chose, mais quand Nike a commencé en conformité avec une entente déjà expédié, nike air max tn homme noir il a été un processus principal opposant. Reebok Carmody a déclaré: ?Nike a un système logistique solide système logistique que nos beaucoup plus puissant."
  

Your comment:

Title:
Name:
Email:
Website:
 
Italic Underline Blockquote Hyperlink
 
 
Please add 8 and 7 and type the answer here: